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. ORACLE中通过SQL语句(alter table)来增加、删除、修改字段

    1.添加字段: alter table  表名  add (字段  字段类型)  [ default  '输入默认值']  [null/not null]  ; 2.添加备注: comment on ...

  2. IOS不支持iframe的解决办法

    最近做ios的兼容,因为入口不同,需要把公共页面抽取出来,然后根据不同的值,传递给后台不同的入口.刚开始用iframe页面嵌套(第一次尝试使用),但发现iOS系统对iframe嵌套页面的高度和定位控制 ...

  3. socks-proxy---with ssh

    socks-proxy---with sshhttps://blog.csdn.net/scien2011/article/details/54562501

  4. composer相关使用

    #composer安装 curl -sS https://getcomposer.org/installer | php #如果该命令执行不了,通过其他方式下载install文件后再执行“php in ...

  5. Xamarin打包

  6. Spring Boo数据访问JDBC

    一.SpringBoot 访问JDBC原理 我们可以参考源代码:SpringBoot2中默认的数据源是使用HikariDataSource /** * Hikari DataSource config ...

  7. GMT\UTC YYYY-MM-DDTHH:mm:ss.sssZ、YYYY-MM-DDTHH:mm:ss.sss+8:00意义及与北京时间转换

    UTC: Universal Time Coordinated 协调世界时,又称世界标准时间. GMT: Greenwich Mean Time 格林尼治平均时. 格林尼治标准时间的正午是指当太阳横穿 ...

  8. VisualStudioCode中用dotnet命令创建多个ASP.NET Core 项目、类库、控制台程序,并添加应用间的引用

    一.准备工作 首先安装VisualStudioCode并且可以使用. 1.首先新创建空的MyApps文件夹,作为项目主目录,下面将在这个文件夹中创建多个web应用程序.类型.控制台程序等. 2.打开V ...

  9. Windows服务器外网无法访问web的解决方法

    windows环境下使用集成 IIS服务器时一般不会发生外网无法访问的问题,而使用apache.kangle.lighttpd.niginx.tomcat等时:服务器上可通过配置的域名访问网站,pin ...

  10. turtlebot3 ubuntu mate 实现vnc连接

    tuutlebot3 ubuntu mate 实现vnc连接 摘要: 在turtlebot3 安装的nbuntu mate系统实验过. 实现内容 x11vnc 安装 x11vnc自动启动 vnc分辩率 ...