第一步肯定是引入依赖了
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
如果依赖刷不下来记得换下maven
的mirror
源,这里给出我的本地源
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云spring仓库</name>
<url>https://maven.aliyun.com/repository/spring</url>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云阿帕奇仓库</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>https://mirror.tuna.tsinghua.edu.cn/</url>
</mirror>
yml配置
rocketmq:
name-server: localhost:9876
producer:
#这里必需指定group
group: test-group
同步发送消息
生产者
消费者
package com.fchen.usercenter.rocketmq;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
@RocketMQMessageListener(topic = "testTopic", consumerGroup = "test-group")
public class TestConsumer implements RocketMQListener<Map<String,Object>> {
//这个泛型和实际发送消息的类型一样
@Override
public void onMessage(Map<String, Object> map) {
System.out.println(map.toString());
}
}
异步发送消息
package com.fchan.mq;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
@RequestMapping("mq")
@RestController
@Slf4j
public class MqSendController {
@Resource
private RocketMQTemplate rocketMQTemplate;
@PostMapping("sendMsg")
public void sendMsg(@RequestBody Map<String,Object> map){
String topic = "efg";
//同步发送
//rocketMQTemplate.convertAndSend(topic, map);
//异步发送
rocketMQTemplate.asyncSend(topic, map, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
log.info("发送:{},成功", topic);
}
@Override
public void onException(Throwable e) {
log.info("发送:{},失败", topic);
}
});
}
}
消费者还是一样的
package com.fchan.mq;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
@Component
@RocketMQMessageListener(consumerGroup = "abc", topic = "efg")
@Slf4j
public class MqListener implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
log.info("收到了mq消息:{}", s);
}
}
发送延时消息
发送的时候指定延时消息,rocketmq的时间按照延时等级来的,并不能自定义。
消费者还是和上面相同
@PostMapping("sendDelayMsg")
public void sendDelayMsg(@RequestBody Map<String,Object> map){
String topic = "qwe";
//发送延时消息
//发送超时时间:2000
//延时等级 2 代表 延时5s
//rocketMq只支持如下延时等级messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";
log.info("发送时间:{}", LocalDateTime.now());
rocketMQTemplate.syncSend(topic, MessageBuilder.withPayload(map).build(), 20000, 2);
}