1、pom文件
<!-- rocketmq依赖 -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
2、配置文件
#rocketmq 相关配置
#服务端地址
rocketmq.name-server=
#消息生产者组
rocketmq.producer.group=SI_ZJXT_REPORT
#生产者主题
rocketmq.producer.topic=ZJ_REPORT
#tag1
rocketmq.tag.approval=approval
#tag2
rocketmq.tag.archive=archive
# 消息体的最大允许大小。。默认为 4 * 1024 * 1024B
rocketmq.producer.max-message-size=4194304
# 同步发送消息时,失败重试次数。默认为 2 次。
rocketmq.producer.retry-times-when-send-failed=2
# 异步发送消息时,失败重试次数。默认为 2 次
rocketmq.producer.retry-times-when-send-async-failed=2
#发送消息超时时间,单位:毫秒。默认为 3000
rocketmq.producer.send-message-timeout=3000
#密钥配置
rocketmq.producer.access-key=
rocketmq.producer.secret-key=
rocketmq.consumer.access-key=
rocketmq.consumer.secret-key=
3、生产者
package com.zhuoyue.mq;
import cn.hutool.core.lang.UUID;
import cn.hutool.json.JSONUtil;
import com.zhuoyue.auth.exception.ZYException;
import org.apache.rocketmq.client.producer.*;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class ProducerComponent {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Value("${rocketmq.producer.topic}")
private String topic;
@Autowired
private RocketMQTemplate rocketMQTemplate;
public SendResult syncSend(String tag,String msg){
return rocketMQTemplate.syncSend(topic+":"+tag,msg);
}
public SendResult syncSend(String tag, Map<String,Object>map){
return rocketMQTemplate.syncSend(topic+":"+tag, MessageBuilder.withPayload(map).build());
}
public void asyncSend(String tag,String msg){
rocketMQTemplate.asyncSend(topic + ":" + tag, MessageBuilder.withPayload(msg).build(), new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
logger.info(topic + ":" + tag+"---异步消息发送成功"+ JSONUtil.toJsonStr(sendResult));
}
@Override
public void onException(Throwable e) {
logger.info(topic + ":" + tag+"---异步消息发送失败"+ e.getMessage());
throw new ZYException("服务器异常,请联系管理员处理!");
}
});
}
public void asyncSend(String tag,Map<String,Object>map){
rocketMQTemplate.asyncSend(topic + ":" + tag, MessageBuilder.withPayload(map).build(), new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
logger.info(topic + ":" + tag+"---异步消息发送成功"+ JSONUtil.toJsonStr(sendResult));
}
@Override
public void onException(Throwable e) {
logger.info(topic + ":" + tag+"---异步消息发送失败"+ e.getMessage());
throw new ZYException("服务器异常,请联系管理员处理!");
}
});
}
public void transactionMQSend(String tag,Map<String,Object>map) {
Message<Map<String,Object>> message=MessageBuilder
.withPayload(map)
.setHeader(RocketMQHeaders.TRANSACTION_ID, UUID.randomUUID())
.build();
TransactionSendResult result=rocketMQTemplate.sendMessageInTransaction(topic + ":" + tag, message, null);
if(result.getLocalTransactionState().equals(LocalTransactionState.COMMIT_MESSAGE)
&&
result.getSendStatus().equals(SendStatus.SEND_OK)){
logger.info("事务消息发送成功");
}
logger.info("事务消息发送结果:{}",result);
}
public void orderlyMQMessageSend(String id,String tag,Map<String,Object>map) {
Message<Map<String,Object>> message=MessageBuilder
.withPayload(map)
.setHeader(RocketMQHeaders.TRANSACTION_ID, UUID.randomUUID())
.build();
rocketMQTemplate.syncSendOrderly(topic + ":" + tag, message,id);
logger.info("单向消息已发送");
}
public void delayedSendMQMessageSend(String tag,Map<String,Object>map) {
SendCallback sc=new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
logger.info("发送异步延时消息成功");
}
@Override
public void onException(Throwable throwable) {
logger.info("发送异步延时消息失败:{}",throwable.getMessage());
}
};
Message<Map<String,Object>> message=MessageBuilder.withPayload(map).build();
rocketMQTemplate.asyncSend(topic + ":" + tag, message, sc, 3000, 3);
SendResult result=rocketMQTemplate.syncSend(topic + ":" + tag, message, 3000, 3);
logger.info("发送同步延时消息成功:{}",result);
}
public void oneWaySendMQMessageSend(String tag,Map<String,Object>map) {
rocketMQTemplate.sendOneWay(topic + ":" + tag, map);
logger.info("单向消息已发送");
}
}
4、消费者
package com.zhuoyue.mq;
import cn.hutool.core.map.MapUtil;
import com.zhuoyue.common.ReportPdfComponent;
import com.zhuoyue.zyreport.dao.GgBgpzdjmDao;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.annotation.SelectorType;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
@RocketMQMessageListener(
selectorType = SelectorType.TAG,
consumerGroup = "${rocketmq.producer.group}",
topic = "${rocketmq.producer.topic}",
selectorExpression = "${rocketmq.tag.approval}")
@Component
public class ReportApprovalConsumer implements RocketMQListener<Map<String,Object>> {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private ReportPdfComponent reportPdfComponent;
@Autowired
private GgBgpzdjmDao ggBgpzdjmDao;
@Override
public void onMessage(Map<String, Object> message) {
String bgbh = MapUtil.getStr(message,"bgbh");
String sbzl = MapUtil.getStr(message,"sblb");
String inputType = MapUtil.getStr(message,"inputType");
String jynr = MapUtil.getStr(message,"jynr");
String dah = MapUtil.getStr(message,"dah");
}
}
package com.zhuoyue.mq;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.Message;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@RocketMQTransactionListener
public class TransactionListner implements RocketMQLocalTransactionListener {
protected Logger logger = LoggerFactory.getLogger(getClass());
private static Map<String,RocketMQLocalTransactionState> transStateMap=new ConcurrentHashMap<>();
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) {
String transId=(String)message.getHeaders().get(RocketMQHeaders.TRANSACTION_ID);
logger .info("事务id:{}",transId);
try {
Thread.sleep(10000);
transStateMap.put(transId, RocketMQLocalTransactionState.COMMIT);
return RocketMQLocalTransactionState.COMMIT;
} catch (InterruptedException e) {
e.printStackTrace();
}
transStateMap.put(transId, RocketMQLocalTransactionState.ROLLBACK);
return RocketMQLocalTransactionState.ROLLBACK;
}
@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message message) {
String transId = (String)message.getHeaders().get(RocketMQHeaders.TRANSACTION_ID);
logger .info("回查消息");
return transStateMap.get(transId);
}
}