RocketMq

第一步:

连接服务器,注入监听逻辑操作.监听即触发.连接监听分离.但是配合操作.

连接服务器必传参数 :消费组,地址,实例名称,主题==tag

 

public class MyDefaultMQPushConsumer extends DefaultMQPushConsumer{
   public MyDefaultMQPushConsumer(String consumerGroup, String instanceName, String namesrvAddr,
                   Map<String, String> subscribe, MessageListenerConcurrently messageListenerConcurrently)
         throws MQClientException {
      //连接服务器参数
      super(consumerGroup);
      setNamesrvAddr(namesrvAddr);
      setInstanceName(instanceName);
      for (Map.Entry<String, String> entry : subscribe.entrySet()) {
         subscribe(entry.getKey(), entry.getValue());
      }
      
      //注册 接口逻辑对象  也就是 监听以后的如何操作
      
      registerMessageListener(messageListenerConcurrently);
   }
}

 

  /**
   * 在产生消费对象的时候将所有信息创建好
   * 并可以在添加以添加一些额外参数
   * 产生mq消费对象 mqxonsumeer
   */
@Bean(name = "waveConsumer",initMethod = "start", destroyMethod = "shutdown")
public MyDefaultMQPushConsumer myDefaultMQPushConsumer() throws MQClientException {
    //基本mq对象构建
    Map<String, String> subscribe = new HashMap<String, String>();
    subscribe.put(topicName, waveTag);
    MyDefaultMQPushConsumer myDefaultMQPushConsumer = new MyDefaultMQPushConsumer(sendPickGroup,
                                                                                  instanceName,namesrvAddr,subscribe,waveOrderConsumer);
    //其他辅助参数
    myDefaultMQPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
    myDefaultMQPushConsumer.setSubscription(subscribe);
    return myDefaultMQPushConsumer;
}

 

 

/**
 * 在产生消费对象的时候将所有信息创建好
 * 并可以在添加以添加一些额外参数
 * 产生mq消费对象 mqxonsumeer
 * Bean对象适用于与外部相关联的类.一般与Configuration连用,
 * 将队形经过一些列操作然后注入到Spring容器中
 * 这个里的这个消费对象可以在任何地方初始化,
 * 只是现在为了方便写在了参数容器队形configuration中
 * 如果写个A 然后注入消费对象一样创建
 */

 

//用来写逻辑仓库  也就是监听方法对象

//mq连接对象和监听方法对象完全分开了 

@Service
public class WaveOrderConsumer implements MessageListenerConcurrently {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private WaveOrderManagerUpdateService waveOrderManagerUpdateService;

    @Autowired
    private MqWaveConsumerConfig mqWaveConsumerConfig;

    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                    ConsumeConcurrentlyContext context) {
        MessageExt msg = msgs.get(0);
        String tags = msg.getTags();

        if (mqWaveConsumerConfig.getWaveTag().equals(tags)) {
            // 当前的偏移量
            long offset = msg.getQueueOffset();
            String maxOffset = msg.getProperty(MessageConst.PROPERTY_MAX_OFFSET);
            // 当前的未消费量
            long diff = Long.parseLong(maxOffset) - offset;
            logger.info("拣货单回传未消费量:", diff);
            StringBuilder log = new StringBuilder();
            log.append("\r\n").append("^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
            log.append("\r\n").append("msgs.size():" + msgs.size());
            log.append("\r\n").append("tags:" + tags);
            log.append("\r\n").append("queueId :").append(msg.getQueueId());
            log.append("\r\n").append("queueOffset :").append(msg.getQueueOffset());
            log.append("\r\n").append("topic :").append(msg.getTopic());
            logger.info(log.toString());
            String message;
            try {
                if (mqWaveConsumerConfig.getWaveTag().equals(tags)) {
                    message = new String(msg.getBody(), "UTF-8");
                    logger.info("拣货单回传主信息:", message);
                    //PickTicket pickTicket = new PickTicket();
                    PickTicket pickTicket = JSONObject.parseObject(message, PickTicket.class);
                    String ticketNo = pickTicket.getPickTicketNo();
                    String sourceNo = pickTicket.getSourceNo();
                    String pickTicketStatus = pickTicket.getPickTicketStatus();
                    logger.info("拣货单号:" + ticketNo);
                    Map map = new HashMap<String, String>(8);
                    //拣货单会传状态为已确认  波次和发货单同步更新为已分配
                    //拣货单回传状态为已完成    波次和发货同步更新为已拣货
                    map.put("waveCode", sourceNo);
                    BigDecimal goodsNum = pickTicket.getGoodsNum();
                    //目前波次单和拣货单是一对一的所以这个集合实际就只有一个
                    //目的是查找到波次主键
                    if (PickTicketStatusEnum.CONFIRM.getCode().equals(pickTicketStatus)) {
                        //波次单更新
                        map.put("waveStatusNum", WaveStatusEnum.HAS_BEEN_ALLOCATED.getCode());
                        //map.put("waveStatusName", WaveStatusEnum.HAS_BEEN_ALLOCATED.getName());
                        //发货单更新
                        map.put("orderStatus", DeliveryOrderStatusEnum.HAS_BEEN_ALLOCATED.getCode());
                        //更新波次拣货单货品单的详情
                        List<PickGoods> pickGoodsList = pickTicket.getPickGoodsList();
                        BigDecimal distributedNums = new BigDecimal(0);
                        for (PickGoods pickGoods : pickGoodsList) {
                            BigDecimal distributedNum = pickGoods.getDistributedNum();
                            distributedNums = distributedNums.add(distributedNum);
                        }
                        //未分配数量
                        BigDecimal unallocatedQuantity = goodsNum.subtract(distributedNums);
                        //更新波次单
                        map.put("distributedQuantity", distributedNums);
                        map.put("unallocatedQuantity", unallocatedQuantity);

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值