SpringBoot项目集成RocketMQ5.x

1.依赖导入

<!--rocketmq-->
		<dependency>
			<groupId>org.apache.rocketmq</groupId>
			<artifactId>rocketmq-client-java</artifactId>
			<version>5.0.4</version>
		</dependency>

2.application.properties配置

rocketmq.accessKey=*****
rocketmq.secretKey=*****
rocketmq.proxy=****
rocketmq.topic=****
rocketmq.consumer.group=****

3.下述相关代码参考了阿里云官方demoapache的GitHub链接demo

①生产者

@Component
public class ProducerMess {

    private static final Logger logger = LoggerFactory.getLogger(ProducerMess.class);

    @Value("${rocketmq.topic}")
    private String topic;
    @Value("${rocketmq.accessKey}")
    private String accessKey;
    @Value("${rocketmq.secretKey}")
    private String secretKey;
    @Value("${rocketmq.proxy}")
    private String proxy;

    public String sendMsg(T pushMess) throws ClientException {
        ClientServiceProvider provider = ClientServiceProvider.loadService();
        StaticSessionCredentialsProvider staticSessionCredentialsProvider = new StaticSessionCredentialsProvider(accessKey, secretKey);//在RocketMQ实例详情页面获取用户名和密码
        ClientConfiguration configuration = ClientConfiguration.newBuilder()
                .setEndpoints(proxy)//接入点
                .setCredentialProvider(staticSessionCredentialsProvider)
                .build();
        /**
         * 初始化Producer时直接配置需要使用的Topic列表(这个参数可以配置多个Topic),实现提前检查错误配置、拦截非法配置启动。
         * 针对非事务消息 Topic,也可以不配置,服务端会动态检查消息的Topic是否合法。
         * 注意!!!事务消息Topic必须提前配置,以免事务消息回查接口失败,具体原理请参见事务消息。
         */
        Producer producer = provider.newProducerBuilder()
                .setTopics(topic)
                .setClientConfiguration(configuration)
                .build();
        //普通消息发送
        Message message = provider.newMessageBuilder()
                .setTopic(topic)
                //消息体
                .setBody(JSONObject.toJSON(pushMess).toString().getBytes())
                .build();
        String messageId = null;
        try {
            //发送消息,需要关注发送结果,并捕获失败等异常。
            SendReceipt sendReceipt = producer.send(message);
            messageId = sendReceipt.toString();
            logger.info(messageId);
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return messageId;
    }
}

②消费者

@Component
public class RocketMqConsumer implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(RocketMqConsumer.class);

    @Value("${rocketmq.proxy}")
    private String proxy;
    @Value("${rocketmq.consumer.group}")
    private String consumerGroup;
    @Value("${rocketmq.topic}")
    private String topic;
    @Value("${rocketmq.accessKey}")
    private String accessKey;
    @Value("${rocketmq.secretKey}")
    private String secretKey;

    public void MqConsumer() {
        final ClientServiceProvider provider = ClientServiceProvider.loadService();
        //凭据提供程序对于客户端配置是可选的
        StaticSessionCredentialsProvider staticSessionCredentialsProvider = new StaticSessionCredentialsProvider(accessKey, secretKey);//在RocketMQ实例详情页面获取用户名和密码
        ClientConfiguration configuration = ClientConfiguration.newBuilder()
                .setEndpoints(proxy)//接入点
                .setCredentialProvider(staticSessionCredentialsProvider)
                .build();
        // 初始化Producer时需要设置通信配置以及预绑定的Topic。
        try {
            // 订阅消息的过滤规则,表示订阅所有Tag的消息。
            String tag = "*";
            FilterExpression filterExpression = new FilterExpression(tag, FilterExpressionType.TAG);
            SimpleConsumer simpleConsumer = provider.newSimpleConsumerBuilder()
                    .setClientConfiguration(configuration)
                    // 设置消费者分组。
                    .setConsumerGroup(consumerGroup)
                    // 设置预绑定的订阅关系。
                    .setSubscriptionExpressions(Collections.singletonMap(topic, filterExpression))
                    //设置长轮询的等待持续时间。
                    .setAwaitDuration(Duration.ofSeconds(30))
                    .build();
            //消息的最大重试投递次数。
            int maxMessageNum = 16;
            //设置消息的不可见时间。
            Duration invisibleDuration = Duration.ofSeconds(30);
            // 设置消费监听器。
           do{
               final List<MessageView> messageViewList = simpleConsumer.receive(maxMessageNum, invisibleDuration);
               messageViewList.forEach(messageView -> {
                   try{
                       //消费处理完成后,需要主动调用ACK提交消费结果。
                       simpleConsumer.ack(messageView);
                       logger.info("消费消息:{}", messageView);
                       String str = StandardCharsets.UTF_8.decode(messageView.getBody()).toString();
                       T pushMess = JSONObject.parseObject(str, T.class);
                       logger.info(str);
						/** 业务代码 **/
                   }catch (Exception e){
                       /** 错误处理 **/
                   }
               });
           }while (true);
        } catch (ClientException e) {
            //如果遇到系统流控等原因造成拉取失败,需要重新发起获取消息请求。
            e.printStackTrace();
        }
    }

    @Override
    public void run(String... args) {
        Thread longRunningThread = new Thread(() -> {
            this.MqConsumer();
        });
        // 设置线程为后台线程,以确保应用程序能够正常退出
        longRunningThread.setDaemon(true);

        // 启动线程
        longRunningThread.start();
    }
}
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值