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();
        }
    }
}

 

posted on 2019-01-17 14:26  一粒麦子777  阅读(153)  评论(0编辑  收藏  举报