1.rocketMq环境搭建
官网下载地址:https://rocketmq.apache.org/download(4.9.0)
下载解压后运行:windows环境下启动命令(如果使用的是JDK11可能出现启动失败的情况,需要删除一些VM配置)
start mqnamesrv.cmd
start mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true
2.配置文件连接MQ
# 配置 rocketmq
rocketmq:
name-server: 127.0.0.1:9876
consumer:
message-model: CLUSTERING
#生产者
producer:
#生产者组名,规定在一个应用里面必须唯一
group: my-producer-group
#消息发送的超时时间 默认3000ms
send-message-timeout: 3000
#消息达到4096字节的时候,消息就会被压缩。默认 4096
compress-message-body-threshold: 4096
#最大的消息限制,默认为128K
max-message-size: 4194304
#同步消息发送失败重试次数
retry-times-when-send-failed: 2
#在内部发送失败时是否重试其他代理,这个参数在有多个broker时才生效
retry-next-server: true
#异步消息发送失败重试的次数
retry-times-when-send-async-failed: 2
3.代码实现
1.引入rocketmq依赖: implementation ‘org.apache.rocketmq:rocketmq-spring-boot-starter:2.2.1’
2.直接写一个延迟消息,简单发送就不演示了,可以去我的个人仓库看源代码。编写延迟consumer:(maxReconsumeTimes,失败重试次数)
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@RocketMQMessageListener(topic = "test-topic-delay", consumerGroup = "test-delay", maxReconsumeTimes = 1)
@Slf4j
public class RocketMQDelayConsumerListener implements RocketMQListener<String> {
@Override
@SuppressWarnings("unchecked")
public void onMessage(String message) {
Map<String, Object> orderMap = JSONObject.parseObject(message, Map.class);
String orderNumber = String.valueOf(orderMap.get("orderNumber"));
String createTime = String.valueOf(orderMap.get("createTime"));
//根据orderNumber 查询订单状态,若为未支付,则消息订单并修改库存
//....
log.info("延时消息消费:{},消费时间:{}", JSONObject.toJSONString(orderMap), DateUtil.now());
}
}
接着编写生产者:
/**
* 发送延时消息
*/
@GetMapping("/testDelaySend/{delayLevel}")
public void testDelaySend(@PathVariable("delayLevel") Integer delayLevel) {
Map<String, Object> orderMap = new HashMap<>();
orderMap.put("orderNumber", "1357890");
orderMap.put("createTime", DateUtil.now());
//参数一:topic 如果想添加tag,可以使用"topic:tag"的写法
//参数二:Message<?>
//参数三:消息发送超时时间
//参数四:delayLevel 延时level messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
//参数四 可在broker.conf中修改messageDelayLevel,然后启动时-c指定config启动
rocketMQTemplate.syncSend("test-topic-delay", MessageBuilder.withPayload(JSONObject.toJSONString(orderMap)).build(),
3000, delayLevel);
log.info("延迟消息发送:{}", JSONObject.toJSONString(orderMap));
}
4. 其他说明
使用RocketMQTemplate的话可以不用像直接使用rocketmq那样配置复杂,很大程度上简化了代码,学习起来也跟简单。最后附上代码地址:https://github.com/yangzp11/yangzp