import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.apache.commons.lang.SerializationException;
import org.apache.commons.lang.SerializationUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import cn.cbsw.entity.QyBumen;
import cn.cbsw.rabbitmq.RbChannel;
import cn.cbsw.rabbitmq.RbConnection;
import cn.cbsw.redis.token.TokenModel;
import cn.cbsw.tool.StringUtils;
import cn.cbsw.tran.daoimp.DanweiDao; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope; /**
* 定义发送数据切面
* @author Administrator
*
*/
@Aspect // for aop
@Component // for auto scan
public class DataSend { private static String host = "127.0.0.1"; //haproxy在71的8100端口 @Autowired
DanweiDao danweiDao; /**
* 返回通知:目标方法正常执行完毕时执行以下代码
* @param jp
* @param result
*/
@AfterReturning(value="execution(* cn.cbsw.tran.serviceimp.*.insert*(..))"
+ " or execution(* cn.cbsw.tran.serviceimp.*.update*(..))"
+ " or execution(* cn.cbsw.tran.serviceimp.*.delete*(..))"
+ " or execution(* cn.cbsw.tran.serviceimp.*.execute*(..))",returning="result")
public void afterReturningMethod(JoinPoint jp, Object result){
Signature signature=jp.getSignature();
String methodName = signature.getName(); sendData(jp.getArgs(),methodName,"");//发送数据 //System.out.println("getDeclaringType:"+signature.getDeclaringType().getSimpleName()); System.out.println("【返回通知】the method 【" + methodName + "】 ends with 【" + result + "】");
} /**
* 发送数据至rabbiteMQ
* @param o
* @param type
* @param dataType
* @param areaCode
*/
private void sendData(Object[] args,String type,String dataType){
System.out.println(getAreaCodeAndData(args)[1]);
String[] areaCodeAndData=getAreaCodeAndData(args);
String areaCode=areaCodeAndData[0];
if(StringUtils.isBlank(areaCode))
return;
Map<String, Object> map=new HashMap<>();
map.put("type", type);
map.put("data", areaCodeAndData[1]);
map.put("dataType", areaCodeAndData[2]); //发送数据
directSend("yzb.4100", "queue", new Gson().toJson(map)); } /**
* 发送数据
*/
private void directSend(String exchangerName,String queue,String data){
try {
//链接
RbConnection connection = new RbConnection(host, 5672, "guest", "guest", "");
//通道
RbChannel rbChannel = connection.getDirectChannel(exchangerName, queue, null);
rbChannel.send(data, (Map<String, Object>)null);
System.out.println("发送成功");
rbChannel.close(true);//关闭连接,后台进程结束
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取单位所在辖区和需要发送的数据
* @param args
* @return
*/
private String[] getAreaCodeAndData(Object[] args){
String compId="",compCode="",data="",dataTypa="";
List<Object> paras=new ArrayList<>(Arrays.asList(args));
Iterator<Object> iterator=paras.iterator();
while(iterator.hasNext()){
Object o=iterator.next();
//根据tokenModel确认当前数据属于哪个单位
if(o instanceof TokenModel){
TokenModel tokenModel=(TokenModel) o;
compId=tokenModel.getCompId();
compCode=danweiDao.getDanweiAreaCode(compId);
iterator.remove();
}
/**
* 判断数据属于哪个分类,然后发送该数据
* 使用枚举数据,或者系统参数设置
*/
if(o instanceof QyBumen){
data=new Gson().toJson(o);
dataTypa="qyBumen";
}
//如果都已经有数据了,则跳出
if(StringUtils.isNotBlank(compCode)&&StringUtils.isNotBlank(data))
break;
}
String[] areaCodeAndData={compCode,data,dataTypa};
return areaCodeAndData;
} public static void main(String[] args) {
try {
// 链接
RbConnection connection = new RbConnection(host, 5672, "guest", "guest", "");
// 通道
RbChannel rbChannel = connection.getFanoutChannel("yzb.4100", "queue", 1);
final boolean autoAck = rbChannel.getAutoAck();
// 接收响应,如果需要用到channel,使用rbChannel.getChannel()取代null
DefaultConsumer consumer = new DefaultConsumer(rbChannel.getChannel()) { @Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
System.out.println("consumerTag: " + consumerTag);
String s = null;
try {
s = (String) SerializationUtils.deserialize(body);
} catch (SerializationException e) {
// e.printStackTrace();
s = new String(body, "utf-8");
} System.out.println("收到内容:" + s);
// Gson gson=new Gson();
// Map<String, Object> map=gson.fromJson(s,new TypeToken<Map<String, Object>>(){}.getType());
//QyBumen bumen=gson.fromJson(StringUtils.objectToString(map.get("data")), QyBumen.class);
//System.out.println(bumen.getBmName());
if (!autoAck) {
this.getChannel().basicAck(envelope.getDeliveryTag(), true);
}
}
};
rbChannel.push(consumer);
System.out.println("over");
} catch (Exception e) {
e.printStackTrace();
}
}
}

spring aop 切面编程的更多相关文章

  1. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  2. Spring AOP 切面编程的方法

    spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现. 先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅.目录如下: 1.基于注解实现spring ...

  3. Spring AOP 切面编程实战Demo项目

    为什么会有此项目?在某日,我看博客时,看到了讲面向切面编程的内容,之前也知道spring是面向切面编程的,只是自己没有写过相关的代码,于是决定自己写一个test.但是url拦截器从外部看,和AOP有相 ...

  4. spring aop 切面编程中获取具体方法的方法

    spring 切面编程中获取具体方法的方法 工作中,使用环绕通知,用来捕获异常,然后通过获取方法的返回值,返回不同的数据给到调用方. 由于方法的返回值不同,我们处理异常时,也需要返回不同的格式. 这时 ...

  5. spring aop切面编程实现操作日志步骤

    1.在spring-mvc.xml配置文件中打开切面开关: <aop:aspectj-autoproxy proxy-target-class="true"/> 注意: ...

  6. Spring 面向切面编程(AOP)

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  7. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  8. 快速高效掌握企业级项目中的Spring面向切面编程应用,外带讲面试技巧

    Spring面向切面编程(AOP)是企业级应用的基石,可以这样说,如果大家要升级到高级程序员,这部分的知识必不可少. 这里我们将结合一些具体的案例来讲述这部分的知识,并且还将给出AOP部分的一些常见面 ...

  9. [Spring] Aspect Oriented Programming with Spring | AOP | 切面 | 切点

    使用Spring面向切面编程 1.介绍 AOP是OOP的补充,提供了另一种关于程序结构的思路. OOP的模块化的关键单位是 类 . AOP的则是aspect切面. AOP 将程序的逻辑分成独立的块(叫 ...

随机推荐

  1. 一个bat病毒分析(part1)

    之前没学过bat,这里借分析顺便学一波,分析过程可能有点啰嗦 这里的@echo off关闭回显,病毒一般都是隐秘的执行的,然后setlocal enabledelayedexpansion是设置本地变 ...

  2. Oracle 触发器 trigger

    触发器: 当用户登录/退出或者操作某个数据对象或者进行DDL(建表,建view)引起某个储存过程的值的变化,把这个隐含被调用的过程,称为触发器. 语法 CREATE OR REPLACE TRIGGE ...

  3. swust oj 982

    输出利用二叉树存储的普通树的度 1000(ms) 10000(kb) 2619 / 5991 普通树可转换成相应的二叉树(该二叉树的根结点一定缺少右儿子),反之亦然.故而可以根据相应的转换方法去统计某 ...

  4. 蓝桥杯九宫重排(bfs+用set去重)

    题目连接 #define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<iostream> #include<que ...

  5. Vue.js最简单的代码

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. oo第三次总结

    一.(1)规格化设计的大致发展历史 20世纪60年代,随着大容量.高速度的计算机出现,以及大量语言的新增和软件的不可靠,爆发了所谓的“软件危机”.而针对这个问题,人们提出了规格化设计的解决方法.通过把 ...

  7. [Day23]IO(字节流、字符流)

    1.字节流 1.1 字节输出流OutputStream-抽象类,表示输出字节流的所有类的超类 (1)void close() 关闭此输出流并释放与此流相关的所有系统资源 (2)void flush() ...

  8. python基础的学习

    今日内容 1.常见操作系 1.win win7 win10 window serrer 2.linux centons 图像界面差 upuntu 个人开发(图形化较好) redhat 企业 3.mac ...

  9. mock server 实现get方法的接口(二)

    mock server 实现get方法的接口(二) 下面是实现查询品牌的接口demo: 1.当response数据量小的时候,可以直接使用json, mock会自动设置headers为applicat ...

  10. net-tools与iproute2

    net-tools与iproute2 我们知道redhat系列发行版7x版本中最小化安装是没有net-tools工具包的,默认使用iproute2工具包,最直观的感受是ifconfig命令被ip命令所 ...