RocketMQ在win安装:链接
RocketMQ在win可视化:链接
RocketMQ在win若jdk版本不是1.8可参考:链接
RocketMQ基本使用方法:链接
使用思路
使用到的依赖有
<!--gson用来对象与json字符串的转换-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
<!--rocketmq消息队列,消息生产者消费者都要有此依赖-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
消息生产者yml
server:
port: 9090
#消息队列
rocketmq:
name-server: localhost:9876
producer:
group: 看着起
消息消费者yml
#消息队列
rocketmq:
name-server: localhost:9876
生产者可选yml配置
# 配置 rocketmq
rocketmq:
name-server: 127.0.0.1:9876
#生产者
producer:
#生产者组名,规定在一个应用里面必须唯一
group: group1
#消息发送的超时时间 默认3000ms
send-message-timeout: 3000
#消息达到4096字节的时候,消息就会被压缩。默认 4096
compress-message-body-threshold: 4096
#最大的消息限制,默认为128K
max-message-size: 4194304
#同步消息发送失败重试次数
retry-times-when-send-failed: 3
#在内部发送失败时是否重试其他代理,这个参数在有多个broker时才生效
retry-next-server: true
#异步消息发送失败重试的次数
retry-times-when-send-async-failed: 3
封装一个用来传输消息的类
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MqResult implements Serializable{
private String key;//方法名
private Object data;//方法所需参数
}
随便的一个测试传值类,用来模拟方法所需参数
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResSelectLabelList{
private String label;//标签名
}
生产者传输消息(当访问/ceshi/ceshi时会向topic值为test-topic-1的消息消费者发送一条值为MqResult对象的消息)
@RestController
@RequestMapping(value="ceshi")
public class CuserController implements CommandLineRunner {
@Resource
private RocketMQTemplate rocketMQTemplate;
Gson gson=new Gson();
@GetMapping(value = "ceshi")
public void ceshi() {
rocketMQTemplate.convertAndSend("test-topic-1", new MqResult("ceshifangfa",new ResSelectLabelList("asdaa111sfsa")));
}
@Override
public void run(String... args) throws Exception {
System.out.println("在容器对象创建完成");
}
}
消息消费者(与其他mq封装不同的是,不需要返回消费成功或是失败,而是只要没有异常出现,那么就消费成功,有异常就重新进行发送)
@Component
@RocketMQMessageListener(topic = "test-topic-1", consumerGroup = "ceshi")
public class RocketMQTool implements RocketMQListener<MqResult> {
private Gson gson=new Gson();
@Override
public void onMessage(MqResult mqres){
ffjueze(mqres.getKey(), mqres.getData().toString());//参数1为要调用的方法,2为传的值
}
//测试调用方法
public int ceshifangfa(ResSelectLabelList res){
System.out.println(res);
return 0;
}
//用来解析调用哪个方法
public void ffjueze(String k,String o){
switch (k){
case "ceshifangfa":
ceshifangfa(gson.fromJson(o,ResSelectLabelList.class));
break;
}
}
}
访问/ceshi/ceshi结果
消费者若希望获取消息id等信息可改成(无论发送什么类型都可用MessageExt进行接收)
@Component
@RocketMQMessageListener(topic = "test-topic-1", consumerGroup = "ceshi")
@Slf4j
public class RocketMQTool implements RocketMQListener<MessageExt> {
private Gson gson=new Gson();
@Override
public void onMessage(MessageExt messageExt) {
String body = new String(messageExt.getBody(), StandardCharsets.UTF_8);
MqResult mqResult = gson.fromJson(body, MqResult.class); // json转对象
log.info("收到消息: msgId={} topic={} queueId={} body={}", messageExt.getMsgId(), messageExt.getTopic(), messageExt.getQueueId(), mqResult);
// 业务执行完毕没有抛出异常则由代理类自动提交ACK
}
}
效果:
若想实现顺序消费可操作
1.消息生产者使用syncSendOrderly(同步有序发送)或asyncSendOrderly(异步有序发送)方法,前两个参数不变,第三个参数多次调用时使用固定相同的任意字符串。
2.消费者@RocketMQMessageListener注解添加属性consumeMode = ConsumeMode.ORDERLY,使消费变为同步操作
事务消息发布与消费(事务消息即数据库操作与消息发送本身是一个事务,要么数据库事务提交消息发送,要么数据库回滚消息不发送)