1.依赖导入
<!--rocketmq-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client-java</artifactId>
<version>5.0.4</version>
</dependency>
2.application.properties配置
rocketmq.accessKey=*****
rocketmq.secretKey=*****
rocketmq.proxy=****
rocketmq.topic=****
rocketmq.consumer.group=****
3.下述相关代码参考了阿里云官方demo,apache的GitHub链接demo
①生产者
@Component
public class ProducerMess {
private static final Logger logger = LoggerFactory.getLogger(ProducerMess.class);
@Value("${rocketmq.topic}")
private String topic;
@Value("${rocketmq.accessKey}")
private String accessKey;
@Value("${rocketmq.secretKey}")
private String secretKey;
@Value("${rocketmq.proxy}")
private String proxy;
public String sendMsg(T pushMess) throws ClientException {
ClientServiceProvider provider = ClientServiceProvider.loadService();
StaticSessionCredentialsProvider staticSessionCredentialsProvider = new StaticSessionCredentialsProvider(accessKey, secretKey);//在RocketMQ实例详情页面获取用户名和密码
ClientConfiguration configuration = ClientConfiguration.newBuilder()
.setEndpoints(proxy)//接入点
.setCredentialProvider(staticSessionCredentialsProvider)
.build();
/**
* 初始化Producer时直接配置需要使用的Topic列表(这个参数可以配置多个Topic),实现提前检查错误配置、拦截非法配置启动。
* 针对非事务消息 Topic,也可以不配置,服务端会动态检查消息的Topic是否合法。
* 注意!!!事务消息Topic必须提前配置,以免事务消息回查接口失败,具体原理请参见事务消息。
*/
Producer producer = provider.newProducerBuilder()
.setTopics(topic)
.setClientConfiguration(configuration)
.build();
//普通消息发送
Message message = provider.newMessageBuilder()
.setTopic(topic)
//消息体
.setBody(JSONObject.toJSON(pushMess).toString().getBytes())
.build();
String messageId = null;
try {
//发送消息,需要关注发送结果,并捕获失败等异常。
SendReceipt sendReceipt = producer.send(message);
messageId = sendReceipt.toString();
logger.info(messageId);
} catch (ClientException e) {
e.printStackTrace();
}
return messageId;
}
}
②消费者
@Component
public class RocketMqConsumer implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(RocketMqConsumer.class);
@Value("${rocketmq.proxy}")
private String proxy;
@Value("${rocketmq.consumer.group}")
private String consumerGroup;
@Value("${rocketmq.topic}")
private String topic;
@Value("${rocketmq.accessKey}")
private String accessKey;
@Value("${rocketmq.secretKey}")
private String secretKey;
public void MqConsumer() {
final ClientServiceProvider provider = ClientServiceProvider.loadService();
//凭据提供程序对于客户端配置是可选的
StaticSessionCredentialsProvider staticSessionCredentialsProvider = new StaticSessionCredentialsProvider(accessKey, secretKey);//在RocketMQ实例详情页面获取用户名和密码
ClientConfiguration configuration = ClientConfiguration.newBuilder()
.setEndpoints(proxy)//接入点
.setCredentialProvider(staticSessionCredentialsProvider)
.build();
// 初始化Producer时需要设置通信配置以及预绑定的Topic。
try {
// 订阅消息的过滤规则,表示订阅所有Tag的消息。
String tag = "*";
FilterExpression filterExpression = new FilterExpression(tag, FilterExpressionType.TAG);
SimpleConsumer simpleConsumer = provider.newSimpleConsumerBuilder()
.setClientConfiguration(configuration)
// 设置消费者分组。
.setConsumerGroup(consumerGroup)
// 设置预绑定的订阅关系。
.setSubscriptionExpressions(Collections.singletonMap(topic, filterExpression))
//设置长轮询的等待持续时间。
.setAwaitDuration(Duration.ofSeconds(30))
.build();
//消息的最大重试投递次数。
int maxMessageNum = 16;
//设置消息的不可见时间。
Duration invisibleDuration = Duration.ofSeconds(30);
// 设置消费监听器。
do{
final List<MessageView> messageViewList = simpleConsumer.receive(maxMessageNum, invisibleDuration);
messageViewList.forEach(messageView -> {
try{
//消费处理完成后,需要主动调用ACK提交消费结果。
simpleConsumer.ack(messageView);
logger.info("消费消息:{}", messageView);
String str = StandardCharsets.UTF_8.decode(messageView.getBody()).toString();
T pushMess = JSONObject.parseObject(str, T.class);
logger.info(str);
/** 业务代码 **/
}catch (Exception e){
/** 错误处理 **/
}
});
}while (true);
} catch (ClientException e) {
//如果遇到系统流控等原因造成拉取失败,需要重新发起获取消息请求。
e.printStackTrace();
}
}
@Override
public void run(String... args) {
Thread longRunningThread = new Thread(() -> {
this.MqConsumer();
});
// 设置线程为后台线程,以确保应用程序能够正常退出
longRunningThread.setDaemon(true);
// 启动线程
longRunningThread.start();
}
}