2-rocketmq-消息发送和接收

quick start

添加依赖
<dependency>
  <groupId>org.apache.rocketmq</groupId>
  <artifactId>rocketmq-client</artifactId>
  <version>4.7.1</version>
</dependency>
生产者
public class Producer {
    public static void main(String[] args) throws MQClientException, InterruptedException {
        /**
         * 生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组rocketmq支持事务消息,在发送事务消息时,如果事务消息异常(producer挂了),broker端会来回查事务的状态,这个时候会根据group名称来查找对应的producer来执行相应的回查逻辑。相当于实现了producer的高可用
         */
        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
        // namesrv地址 多个地址用 ; 隔开  从namesrv上拉取broker信息
        producer.setNamesrvAddr("localhost:9876");
        producer.start();
        for (int i = 0; i < 1000; i++) {
            try {
              	/**
              	 * 创建消息实例,指定topic,tag,消息内容。tag
              	 */
                Message msg = new Message("TopicTest" /* Topic */, "TagA" /* Tag */,
                    ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
                );
                // 发送消息并获取发送结果   同步发送
                SendResult sendResult = producer.send(msg);
                System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }
        producer.shutdown();
    }
}

SendResult中,有一个sendStatus状态,表示消息的发送状态。一共有四种状态

  1. FLUSH_DISK_TIMEOUT : 表示没有在规定时间内完成刷盘(需要Broker 的刷盘策Ill创立设置成
    SYNC_FLUSH 才会报这个错误) 。
  2. FLUSH_SLAVE_TIMEOUT :表示在主备方式下,并且Broker 被设置成SYNC_MASTER 方式,没有
    在设定时间内完成主从同步。
  3. SLAVE_NOT_AVAILABLE : 这个状态产生的场景和FLUSH_SLAVE_TIMEOUT 类似, 表示在主备方
    式下,并且Broker 被设置成SYNC_MASTER ,但是没有找到被配置成Slave 的Broker 。
  4. SEND OK :表示发送成功,发送成功的具体含义,比如消息是否已经被存储到磁盘?消息是否被
    同步到了Slave 上?消息在Slave 上是否被写入磁盘?需要结合所配置的刷盘策略、主从策略来
    定。这个状态还可以简单理解为,没有发生上面列出的三个问题状态就是SEND OK
消费者
public class Consumer {
    public static void main(String[] args) throws InterruptedException, MQClientException {
        //groupName 将多个consumer分组,提高并发处理能力。需要和MessageModel配合
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4");
        // 多个地址 ;分开 获取broker地址 并定时向broker发送心跳 可以从master/slave获取订阅
        consumer.setNamesrvAddr(&#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我之前理解有误,MQTT与RocketMQ并不是一样的东西,它们只是不同的消息传递协议。如果您想要在SpringBoot项目实现RocketMQ和MQTT的消息发送接收,需要分别集成RocketMQ和MQTT的客户端。 首先,您需要在SpringBoot项目添加RocketMQ和MQTT客户端的依赖,可以在pom.xml文件添加如下代码: ```xml <!-- RocketMQ --> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.8.0</version> </dependency> <!-- MQTT --> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> </dependency> ``` 接下来,您需要在application.properties配置RocketMQ和MQTT的连接信息,例如: ```properties # RocketMQ rocketmq.name-server=127.0.0.1:9876 # MQTT mqtt.username=admin mqtt.password=admin mqtt.url=tcp://127.0.0.1:1883 ``` 然后,您可以通过注入RocketMQ的DefaultMQProducer和DefaultMQPushConsumer来实现消息发送接收。例如: ```java // RocketMQ @Autowired private DefaultMQProducer producer; public void sendMessage(String topic, String message) throws Exception { Message msg = new Message(topic, message.getBytes(StandardCharsets.UTF_8)); SendResult sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); } @Autowired private DefaultMQPushConsumer consumer; public void receiveMessage(String topic) throws Exception { consumer.subscribe(topic, "*"); consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer.start(); } // MQTT @Autowired private MqttClient mqttClient; public void sendMessage(String topic, String message) throws Exception { MqttMessage mqttMessage = new MqttMessage(message.getBytes()); mqttMessage.setQos(2); mqttClient.publish(topic, mqttMessage); } @MessageEndpoint public class MqttMessageReceiver { @Autowired private MyService myService; @ServiceActivator(inputChannel = "mqttInputChannel") public void receiveMessage(String message) { myService.handleMessage(message); } } ``` 以上代码sendMessage方法用于发送消息,receiveMessage方法用于接收消息。使用DefaultMQProducer和DefaultMQPushConsumer可以很方便地发送接收RocketMQ消息,使用MqttClient和MqttMessageReceiver可以很方便地发送接收MQTT消息。 这就是SpringBoot集成RocketMQ和MQTT实现消息发送接收的基本流程,希望对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值