關於怎麼搭建RockerMQ先不講
首先生產者
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
application.properties
rocketmq.producer.group=CMS
rocketmq.name-server=172.20.5.2:9876;
Controller
public class BookController {
@Autowired
private RocketMQTemplate template;
@GetMapping("/books")
public ModelAndView books(){
List<Book> books = new ArrayList<>();
//至於爲什麼用這個MessageBuilder 完全是爲了與消費者對應 消費者也用的Message(MessageExt)類型 只不過這個有時間戳
//或者得到重試次數 以及許多參數當然你也可以直接寫String 生產者重試次數是兩次 有三種方式發送 同步 異步 和 one way
//前兩種都有返回結果SendResult 下面代碼默認是同步 他也有SendResult 只不過藏在代碼裏 下面的topic:tag 是有講究的在可視化界面
//直觀的看到了
template.convertAndSend("topic:tag", MessageBuilder.withPayload("111111111111111111").build());
消費者
package com.example.demo;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
@Component
//topic selectExpression對應生產者的 consumerGroup隨便寫
@RocketMQMessageListener(topic = "topic",selectorExpression = "tag",consumerGroup = "listener1")
public class MessageListener1 implements RocketMQListener<MessageExt> {
@Override
public void onMessage(MessageExt messageExt) {
try {
//消費者發生異常或重試 默認是重試16次有一定時間間隔 1s 2S 5s 10s 30S 1min
int i= 0;
i =i/0;
String messageStr = new String(messageExt.getBody(), "UTF-8");
System.out.println("我是listener1"+messageStr);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
這個下面有消費者 not online 我們忽略掉就好 我們只需要關注 not yet consume 和consume 兩種狀態
另外RocketMq 有兩種消費模式 默認是集羣 比如你發了二十條消息 有兩個一模一樣的消費者
consumerGroup = "listener1"必須一樣(不一樣就和廣播效果一樣當做兩個消費者處理) 然後兩個平分二十條 至於廣播就一人消費20條