依赖包版本:
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:Greenwich.SR3"
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.0.RELEASE"
}
}
compile
group
:
'org.apache.rocketmq'
,
name
:
'rocketmq-spring-boot-starter'
,
version
:
'2.1.1'
compile group: 'dom4j', name: 'dom4j', version: '1.6.1'
1.RockMqConfiguration:
package com.yunda.ydzc.schedule.config;
import com.yunda.ydzc.schedule.consumer.SettleBillConsumerListener;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Slf4j
@Configuration
public class
RockMqConfiguration {
/**
* 发送同一类消息的设置为同一个group,保证唯一,默认不需要设置,rocketmq会使用ip@pid(pid代表jvm名字)作为唯一标示
*/
@Value("${rocketmq.producer.group}")
private String groupName;
@Value
(
"${rocketmq.name-server}"
)
private String namesrvAddr;
/**
* 消息最大大小,默认4M
*/
@Value("${rocketmq.producer.maxMessageSize}")
private Integer maxMessageSize ;
/**
* 消息发送超时时间,默认3秒
*/
@Value("${rocketmq.producer.sendMsgTimeout}")
private Integer sendMsgTimeout;
/**
* 消息发送失败重试次数,默认2次
*/
@Value("${rocketmq.producer.retryTimesWhenSendFailed}")
private Integer retryTimesWhenSendFailed;
@Bean
public DefaultMQProducer getRocketMQProducer() throws Exception {
DefaultMQProducer producer;
producer = new DefaultMQProducer(this.groupName);
producer.setNamesrvAddr(this.namesrvAddr);
//如果需要同一个jvm中不同的producer往不同的mq集群发送消息,需要设置不同的instanceName
//producer.setInstanceName(instanceName);
if(this.maxMessageSize!=null){
producer.setMaxMessageSize(this.maxMessageSize);
}
if(this.sendMsgTimeout!=null){
producer.setSendMsgTimeout(this.sendMsgTimeout);
}
//如果发送消息失败,设置重试次数,默认为2次
if(this.retryTimesWhenSendFailed!=null){
producer.setRetryTimesWhenSendFailed(this.retryTimesWhenSendFailed);
}
return producer;
}
@Bean("settleBillConsumer")
public DefaultMQPushConsumer settleBillConsumer(){
try{
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(groupName);
consumer.setNamesrvAddr(namesrvAddr);
consumer.setInstanceName("rmq-instance");
// consumer.subscribe("log-topic", "user-tag");
consumer.subscribe("settle_bill_callback_topic ","*");
consumer.registerMessageListener(new SettleBillConsumerListener() );
consumer.start();
return consumer;
}catch (Exception e){
log.error("",e);
return null;
}
}
}
2.消费者端接收消息:
package com.yunda.ydzc.schedule.consumer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yunda.ydzc.schedule.mapper.SettleBillMsgMapper;
import com.yunda.ydzc.schedule.vo.SettleBillMsg;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@Component
public class SettleBillConsumerListener implements MessageListenerConcurrently{
@Autowired
private SettleBillMsgMapper settleBillMsgMapper;
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
String msgBody=new String(msg.getBody());
JSONObject obj=JSON.parseObject(msgBody);
String serialNo=obj.getString("serialNo");
SettleBillMsg settleBillMsg=new SettleBillMsg();
settleBillMsg.setSerialNo(serialNo);
settleBillMsg.setZt("2");
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
settleBillMsg.setNewTime(sdf.format(new Date()));
settleBillMsgMapper.updatePushStatus(settleBillMsg);
System.out.println("消费者消费数据:"+msgBody);
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}
3.生产者端消息推送:
package com.yunda.ydzc.schedule.service;
import com.alibaba.fastjson.JSON;
import com.yunda.ydzc.schedule.mapper.SettleBillMsgMapper;
import com.yunda.ydzc.schedule.vo.SettleBillMsg;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.text.SimpleDateFormat;
import java.util.Date;
@Slf4j
@Service
public class SettleBillService {
@Autowired
private SettleBillMsgMapper settleBillMsgMapper;
@Autowired
private DefaultMQProducer defaultMQProducer;
@Async
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void push(SettleBillMsg settleBillMsg){
try{
settleBillMsg.setOperator("大狼狗");
settleBillMsg.setOperatorId(666L);
settleBillMsg.setRemark("怕不怕");
settleBillMsg.setZt("1");
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
settleBillMsg.setPushTime(sdf.format(new Date()));
settleBillMsgMapper.updatePushStatus(settleBillMsg);
String msg = JSON.toJSONString(settleBillMsg);
log.info("开始发送消息:"+msg);
Message sendMsg = new Message("settle_bill_topic","settle_bill_topic",msg.getBytes());
//默认3秒超时
SendResult sendResult = defaultMQProducer.send(sendMsg);
// log.info("消息发送响应信息:"+sendResult.toString());
}catch (Exception e){
log.error("推送出错:",e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
}
4.properties:
#rocketmq服务地址
rocketmq.name-server
=
...
rocketmq.producer.group
=
settle_bill_group
#默认4M
rocketmq.producer.maxMessageSize
=
4194304
rocketmq.producer.sendMsgTimeout=3000
rocketmq.producer.retryTimesWhenSendFailed=2