RocketMQ官网–点击查看
rocketmq-externals
rocketmq-dashboard
启动rocketmq
1.首先启动nameserver
mqnameserver
2.后启动broker
mqbroker -n 127.0.0.1:9876
docker 拉取 镜像
docker pull foxiswho/rocketmq:server-4.3.2
docker pull foxiswho/rocketmq:broker-4.3.2
启动mqnamesrv
docker run -itdp 9876:9876 --name rmqserver -e "JAVA_OPT_EXT=-server -Xms256m -Xmx256m" -e "JAVA_OPTS=-Duser.home=/opt" foxiswho/rocketmq:server-4.3.2
启动mqbroker
docker run -itd -p 10911:10911 -p 10909:10909\
--name rmqbroker --link rmqserver:namesrv\
-e "NAMESRV_ADDR=namesrv:9876" -e "JAVA_OPTS=-Duser.home=/opt"\
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m"\
foxiswho/rocketmq:broker-4.3.2
或者使用docker-compose
version: '3.5'
services:
rmqnamesrv:
image: foxiswho/rocketmq:server-4.3.2
container_name: rmqnamesrv
ports:
- 9876:9876
volumes:
- /home/dockerrocketmq/rmqserver01/logs:/opt/logs
- /home/dockerrocketmq/rmqserver01/store:/opt/store
environment:
JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
networks:
rmq:
aliases:
- rmqnamesrv
rmqbroker:
image: foxiswho/rocketmq:broker-4.3.2
container_name: rmqbroker
ports:
- 10909:10909
- 10911:10911
volumes:
- /home/dockerrocketmq/rmqbroker01/logs:/opt/logs
- /home/dockerrocketmq/rmqbroker01/store:/opt/store
- /home/dockerrocketmq/rmqbroker01/conf/broker.conf:/etc/rocketmq/broker.conf
environment:
NAMESRV_ADDR: "rmqnamesrv:9876"
JAVA_OPTS: " -Duser.home=/opt"
JAVA_OPT_EXT: "-server -Xms128m -Xmx128m -Xmn128m"
command: mqbroker -c /etc/rocketmq/broker.conf
depends_on:
- rmqnamesrv
networks:
rmq:
aliases:
- rmqbroker
networks:
rmq:
name: rmq
driver: bridge
安装时,需注意,安装路径文件名称不能有空格、不能有中文
rocketmq由java编写,需要用到java环境,版本最好是8版本,安装路径也不要有空格
maven依赖
<!-- rocketmq 消息队列 -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
RocketMQ配置springboot的application.yml
rocketmq:
nameServer: 192.168.10.37:9876
# 生产者配置
producer:
group: java
RocketMQTemplate 添加到springboot管理中
@Autowired(required = true)
private RocketMQTemplate rocketMQTemplate;
同步发送生产者
@PostMapping("/convertAndSendMQ")
public Object convertAndSendMQ(@RequestParam(name = "topic") String topic,
@RequestBody Map map) {
try {
//直接添加到生产者里、底层是同步发送
rocketMQTemplate.convertAndSend(topic,map);
} catch (Exception e) {
return false;
}
return true;
}
@GetMapping("/syncSendMQ")
public Object syncSendMQ(@RequestParam(name = "topic") String topic,
@RequestParam(name = "msg") String msg) {
//同步发送
try {
Message<String> message = new Message<String>() {
@Override
public String getPayload() {
return msg;
}
@Override
public MessageHeaders getHeaders() {
return null;
}
};
rocketMQTemplate.syncSend(topic, message);
} catch (Exception e) {
return false;
}
return true;
}
异步发送生产者
@PostMapping("/asyncSendMQ")
public Object asyncSendMQ(@RequestParam(name = "topic") String topic,
@RequestBody Map map) {
SendCallback sendCallback = new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("发送成功!--->"+sendResult.getSendStatus());
}
@Override
public void onException(Throwable e) {
System.out.println("发送失败!");
}
};
rocketMQTemplate.asyncSend(topic, map, sendCallback );
return null;
}
消息消费者
@Component
@RocketMQMessageListener(consumerGroup = "java", topic = "topic-map")
private class RocketMQConsumenMap implements RocketMQListener<Map>{
@Override
public void onMessage(Map message) {
if(message instanceof Map) {
Map map = (Map)message;
map.entrySet().forEach(i ->{
System.out.println("Tom要消费了"+i);
});
}
}
}
RocketMQ事务消息
//生产者
@PostMapping("/transactionMQ")
@Transactional
public TransactionSendResult transactionMQ(@RequestParam(name = "topic") String topic,
@RequestBody Map map) {
Message<?> mes = MessageBuilder.withPayload(map).build();
TransactionSendResult sendMessageInTransaction = rocketMQTemplate.sendMessageInTransaction(topic, mes , map );
LocalTransactionState localTransactionState = sendMessageInTransaction.getLocalTransactionState();
if (!localTransactionState.equals("ROLLBACK_MESSAGE")) {
Users users = JSONObject.parseObject(JSONObject.toJSONString(map), Users.class);
users.setsId(UUID.randomUUID().toString());
users.setsSex("3");
usersService.save(users);
};
System.out.println(localTransactionState);
return sendMessageInTransaction;
}
增加事务监听器
//监听器
@Component
@RocketMQTransactionListener(rocketMQTemplateBeanName = "rocketMQTemplate")
public class RocketMQTransaction implements RocketMQLocalTransactionListener {
private ConcurrentHashMap map = new ConcurrentHashMap();
/**
* 生产者发送消息,执行本地事务
*/
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
System.out.println("msg: "+msg);
System.out.println("arg: "+arg);
map.put(msg, arg);
if(arg instanceof Map) {
Map map = (Map)arg;
String age = (String)map.get("sAge");
if(StringUtils.isNotEmpty(age) && age.equals("3")) {
return RocketMQLocalTransactionState.ROLLBACK;
}
if(StringUtils.isNotEmpty(age) && age.equals("2")) {
return RocketMQLocalTransactionState.COMMIT;
}
}
return RocketMQLocalTransactionState.UNKNOWN;
}
/**
* 检查本地事务
*/
@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
map.forEach((Object t, Object u) -> {System.out.println(t+" - "+u);});
return RocketMQLocalTransactionState.COMMIT;
}
}
消费者 如果消费者第一次消费不到或消费异常,broker会一直重试,默认15次
//消费者
@Component
@RocketMQMessageListener(consumerGroup = "java", topic = "topic-map")
public class RocketMQConsumen implements RocketMQListener<Map> {
@Autowired
private UsersService usersService;
@Override
@Transactional
public void onMessage(Map message) {
if(message instanceof Map) {
Map map = (Map)message;
map.entrySet().forEach(i ->{
System.out.println("Tom要消费了"+i);
});
Users users = JSONObject.parseObject(JSONObject.toJSONString(map), Users.class);
users.setsId(UUID.randomUUID().toString());
usersService.save(users);
String age = (String)map.get("sAge");
//模拟事务异常
if(StringUtils.isNotEmpty(age) && age.equals("4")) {
int error = 10 / 0;
}
}
}
}
顺序消息 – 生产者
@GetMapping("/getuuid")
public String getuuid(){
String uuid = UUID.randomUUID().toString().replace("-", "");
Message<String> message1 = MessageBuilder.withPayload(uuid).build();
//order:phone 其中order是topic ,phone是tag
rocketMQTemplate.syncSendOrderly("order:phone",message1,uuid);
return uuid;
}
顺序消息 – 消费者
@Component
@RocketMQMessageListener(consumerGroup = "monitor",
topic = "order",
selectorType = SelectorType.TAG,
selectorExpression = "phone",
consumeMode = ConsumeMode.ORDERLY)
public class RocketMQConsumen implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println(message);
}
}
延迟消息–生产者
// messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
// 默认18个等级
@GetMapping("/getuuid")
public String getuuid(){
String uuid = UUID.randomUUID().toString().replace("-", "");
Message<String> message1 = MessageBuilder.withPayload(uuid).build();
rocketMQTemplate.syncSend("order:phone",message1,30*1000,3);
return uuid;
}