Springboot2整合RocketMQ4.x

  Springboot2.x整合RocketMQ4.x实战,加入相关依赖,开发生产者代码
    
    启动nameser和broker

    微信支付架构图:

 微信支付调用相应的API进行支付,支付完成后回调,把相应的支付信息封装成对象发给生产者。生产者把消息发送给消息队列  broker,通过NameServer获取相应的路由地址。消息订阅者从broker获取相应的消息,生成相应的支付凭证,增加积分等

   

1、加入相关依赖
        <dependency>  
            <groupId>org.apache.rocketmq</groupId>  
            <artifactId>rocketmq-client</artifactId>  
            <version>${rocketmq.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.apache.rocketmq</groupId>  
            <artifactId>rocketmq-common</artifactId>  
            <version>${rocketmq.version}</version>  
        </dependency>  

2、application.properties加入配置文件        
        # 消费者的组名
        apache.rocketmq.consumer.PushConsumer=orderConsumer
        # 生产者的组名
        apache.rocketmq.producer.producerGroup=Producer
        # NameServer地址
        apache.rocketmq.namesrvAddr=127.0.0.1:9876


    3、开发MsgProducer
         /**
         * 生产者的组名
         */
        @Value("${apache.rocketmq.producer.producerGroup}")
        private String producerGroup;

        /**
         * NameServer 地址
         */
        @Value("${apache.rocketmq.namesrvAddr}")
        private String namesrvAddr;

        private  DefaultMQProducer producer ;

            
        public DefaultMQProducer getProducer(){
            return this.producer;
        }
        
        @PostConstruct
        public void defaultMQProducer() {
            //生产者的组名
            producer = new DefaultMQProducer(producerGroup);
            //指定NameServer地址,多个地址以 ; 隔开
            //如 producer.setNamesrvAddr("192.168.100.141:9876;192.168.100.142:9876;192.168.100.149:9876"); 
            producer.setNamesrvAddr(namesrvAddr);
            producer.setVipChannelEnabled(false);
            
            try {
                /**
                 * Producer对象在使用之前必须要调用start初始化,只能初始化一次
                 */
                producer.start();

            } catch (Exception e) {
                e.printStackTrace();
            } 
            
            // producer.shutdown();  一般在应用上下文,关闭的时候进行关闭,用上下文监听器

        }


模拟微型支付回调的controller

@RestController
@RequestMapping("/api/v1")
public class OrderController {
    
    
    @Autowired
    private MsgProducer msgProducer;
    
    /**
     * 功能描述:微信支付回调接口
     * @param msg 支付信息
     * @param tag 消息二级分类
     * @return
     */
    @GetMapping("order")
    public Object order(String msg, String tag) throws MQClientException, RemotingException, MQBrokerException, InterruptedException, UnsupportedEncodingException{
      
        /**
        * 创建一个消息实例,包含 topic、tag 和 消息体           
       */
       Message message = new Message("testTopic",tag, msg.getBytes(RemotingHelper.DEFAULT_CHARSET));
       
       SendResult result = msgProducer.getProducer().send(message);
       
       System.out.println("发送响应:MsgId:" + result.getMsgId() + ",发送状态:" + result.getSendStatus());
     
       return JsonData.buildSuccess();
    }
    

5.创建消费者

@Component
public class MsgConsumer {
    /**
     * 消费者的组名
     */
    @Value("${apache.rocketmq.consumer.PushConsumer}")
    private String consumerGroup;

    /**
     * NameServer 地址
     */
    @Value("${apache.rocketmq.namesrvAddr}")
    private String namesrvAddr;

    
    
    
    
    @PostConstruct
    public void defaultMQPushConsumer() {
        //消费者的组名
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup);
        //指定NameServer地址,多个地址以 ; 隔开
        consumer.setNamesrvAddr(namesrvAddr);
        
        try {
            //设置consumer所订阅的Topic和Tag,*代表全部的Tag
            consumer.subscribe("testTopic", "*");
          
            //CONSUME_FROM_LAST_OFFSET 默认策略,从该队列最尾开始消费,跳过历史消息
            //CONSUME_FROM_FIRST_OFFSET 从队列最开始开始消费,即历史消息(还储存在broker的)全部消费一遍
            consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
            
                       
            //MessageListenerOrderly 这个是有序的
            //MessageListenerConcurrently 这个是无序的,并行的方式处理,效率高很多
            consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {
                try {
                    for (MessageExt messageExt : list) {
                        
                        System.out.println("messageExt: " + messageExt);//输出消息内容

                        String messageBody = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET);
                        
                        System.out.println("消费响应:msgId : " + messageExt.getMsgId() + ",  msgBody : " + messageBody);//输出消息内容
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER; //稍后再试
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功
            });
            
            
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/peng_0129/article/details/85702568