boot RocketMq配置

该博客介绍了如何在Spring Boot应用中整合Spring Cloud与RocketMQ,用于实现消息的生产和消费。配置了RocketMQ的依赖,并创建了生产者与消费者的配置类,其中消费者端监听并处理消息,生产者端则异步发送消息到指定主题。此外,还展示了相关的配置参数,如服务器地址、消息大小限制等。
摘要由CSDN通过智能技术生成
依赖包版本:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值