Springboot整合RocketMQ(一)

Springboot整合RocketMQ(一)

由於項目上需要用到RocketMQ來做消息同步。本文主要記錄自己RocketMQ的學習歷程。也將自己的經驗分享給大家。
本文測試時,博主已經將RocketMQ安裝到了虛擬機上,並且配置了RocketMq-console-ng.

發送同步消息

- 項目POM文件

	<dependency>
			<groupId>org.apache.rocketmq</groupId>
			<artifactId>rocketmq-client</artifactId>
			<version>4.6.1</version>
		</dependency>

- Producer(生產者)

public class Producer {

	public static void main(String[] args)throws Exception {
		DefaultMQProducer producer = new DefaultMQProducer("xoxogp");
		//設置nameserver
		producer.setNamesrvAddr("192.168.37.128:9876");
		producer.start();//啓動
		
		// topic 消息將要發送的地址
		// body  消息中的內容
		Message msg1 = new Message("myTopic001", "這個是第一條消息".getBytes());
		Message msg2 = new Message("myTopic001", "這個是第二條消息".getBytes());
		Message msg3 = new Message("myTopic001", "這個是第三條消息".getBytes());

		ArrayList<Message> list = new ArrayList<Message>();
		list.add(msg1);
		list.add(msg2);
		list.add(msg3);
      //同步消息發送
		SendResult sendResult = producer.send(list);
		
		System.out.println(sendResult);

	}
}

- Consumer (消費者)

public class Consumer {

    public static void main(String[] args) throws Exception {
        //消費組
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("xxoocsm");
        consumer.setNamesrvAddr("192.168.37.128:9876");
        //topic 消息地址
        // subExpression 過濾器 * 表示不過濾
        consumer.subscribe("myTopic001", "*");
       //監聽消息
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                for (MessageExt msg : msgs) {
                    System.out.println(new String(msg.getBody()));
                }
                //返回消費狀態
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        System.out.println("Consumer 02 start...");
    }
}

- 運行示例

  • Producer(生產者)
    生產者運行
  • Consumer (消費者)
    消費者運行

發送異步消息

想要快速發送消息,又不想丟失的時候可以使用異步消息

  • Producer(生產者)
public class Producer2 {

	public static void main(String[] args)throws Exception {
		
		DefaultMQProducer producer = new DefaultMQProducer("xoxogp");
		//nameserver
		producer.setNamesrvAddr("192.168.37.128:9876");
		producer.start();

		Message message = new Message("myTopic001", "xxoo".getBytes());
	//	producer.setRetryTimesWhenSendAsyncFailed(retryTimesWhenSendAsyncFailed);
		//消息異步發送
		producer.send(message,new SendCallback() {
			//發送成功的處理邏輯
			public void onSuccess(SendResult sendResult) {
				System.out.println("消息發送成功");
				System.out.println("sendResult :" + sendResult);
			}
			//發送異常的處理邏輯
			public void onException(Throwable e) {
				e.printStackTrace();
				System.out.println("發送異常");
			}
		});
	}
}

消費者同上。

注意

  • 批量消息要求必要具有同一topic、相同消息配置
  • 不支持延時消息
  • 建議一個批量消息最好不要超過1MB大小
  • 如果不確定是否超過限制,可以手動計算大小分批發送
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章