简介:RocketMQ 4的版本,支持事务消息 在分布式的场景中有很好的启发性和作用,而且本身它也是阿里开源到apache的一个
一、在pom.xml 配置maven
<!-- MQ --> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.3.0</version> <scope>compile</scope> </dependency>
二、 在application.yml中配置
#Mq rocketmq: consumer: groupName: consumerGroup # 消费者的组名 consumeThreadMin: 2 consumeThreadMax: 5 consumeMessageBatchMaxSize: 10 topics: rocketTopic,rocketTag namesrvAddr: 127.0.0.1:9876 # NameServer地址 producer: groupName: producerGroup # 生产者的组名 maxMessageSize: 100 sendMsgTimeout: 1000 retryTimesWhenSendFailed: 3 namesrvAddr: 127.0.0.1:9876 # NameServer地址
三、代码部分
读取application.yml配置
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; /** * 读取application.yml配置: */ @ConfigurationProperties(prefix = "rocketmq.consumer") @Configuration public class ConsumerConfig { private String groupName; private String namesrvAddr; public String getGroupName() { return groupName; } public void setGroupName(String groupName) { this.groupName = groupName; } public String getNamesrvAddr() { return namesrvAddr; } public void setNamesrvAddr(String namesrvAddr) { this.namesrvAddr = namesrvAddr; } @Override public String toString() { return "ConsumerConfig [groupName=" + groupName + ", namesrvAddr=" + namesrvAddr + "]"; } }
消息消费者类(抽象类):
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; 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.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.common.message.MessageExt; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import java.util.List; /** * 消息消费者类(抽象类): */ @Configuration public abstract class DefaultConsumerConfigure { Logger log = LoggerFactory.getLogger(DefaultConsumerConfigure.class); @Autowired private ConsumerConfig consumerConfig; // 开启消费者监听服务 public void listener(String topic, String tag) throws MQClientException { log.info("开启" + topic + ":" + tag + "消费者-------------------"); log.info(consumerConfig.toString()); DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerConfig.getGroupName()); consumer.setNamesrvAddr(consumerConfig.getNamesrvAddr()); consumer.subscribe(topic, tag); // 开启内部类实现监听 consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { return DefaultConsumerConfigure.this.dealBody(msgs); } }); consumer.start(); log.info("rocketmq启动成功---------------------------------------"); } // 处理body的业务 public abstract ConsumeConcurrentlyStatus dealBody(List<MessageExt> msgs); }
读取application.yml配置:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; /** * 读取application.yml配置: */ @ConfigurationProperties(prefix = "rocketmq.producer") @Configuration public class ProducerConfig { private String namesrvAddr; private String groupName; public String getNamesrvAddr() { return namesrvAddr; } public void setNamesrvAddr(String namesrvAddr) { this.namesrvAddr = namesrvAddr; } public String getGroupName() { return groupName; } public void setGroupName(String groupName) { this.groupName = groupName; } @Override public String toString() { return "ProducerConfig [namesrvAddr=" + namesrvAddr + ", groupName=" + groupName + "]"; } }
创建普通消息发送者实例
import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ProducerConfigure { Logger log = LoggerFactory.getLogger(ProducerConfigure.class); @Autowired private ProducerConfig producerConfigure; /** * 创建普通消息发送者实例 * * @return * @throws MQClientException */ @Bean // @ConditionalOnProperty(prefix = "rocketmq.producer", value = "default", havingValue = "true") public DefaultMQProducer defaultProducer() throws MQClientException { log.info(producerConfigure.toString()); log.info("defaultProducer 正在创建---------------------------------------"); DefaultMQProducer producer = new DefaultMQProducer(producerConfigure.getGroupName()); producer.setNamesrvAddr(producerConfigure.getNamesrvAddr()); producer.setVipChannelEnabled(false); producer.setRetryTimesWhenSendAsyncFailed(10); producer.start(); log.info("rocketmq producer server开启成功---------------------------------."); return producer; } }
具体消息消费者类
import java.io.UnsupportedEncodingException; import java.util.List; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.common.message.MessageExt; import org.jeecg.common.rocketmq.DefaultConsumerConfigure; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ContextRefreshedEvent; /** * 具体消息消费者类 */ @Configuration public class CustomConsumer extends DefaultConsumerConfigure implements ApplicationListener<ContextRefreshedEvent> { Logger log = LoggerFactory.getLogger(CustomConsumer.class); @Override public void onApplicationEvent(ContextRefreshedEvent arg0) { try { super.listener("t_TopicTest", "Tag1"); } catch (MQClientException e) { log.error("消费者监听器启动失败", e); } } @Override public ConsumeConcurrentlyStatus dealBody(List<MessageExt> msgs) { int num = 1; log.info("进入"); for (MessageExt msg : msgs) { log.info("第" + num + "次消息"); try { String msgStr = new String(msg.getBody(), "utf-8"); log.info(msgStr); } catch (UnsupportedEncodingException e) { log.error("body转字符串解析失败"); } } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }
调用生产方 demo
import com.alibaba.fastjson.JSON; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; import org.jeecg.common.api.vo.Result; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/client/api/view/mq") public class MqProducerController { Logger log = LoggerFactory.getLogger(MqProducerController.class); @Autowired private DefaultMQProducer producer; /** * * 测试发送 * @param info * @return */ @RequestMapping(value = "sendTest",method = RequestMethod.GET) public Result<?> sendTest(@RequestParam("info") String info) throws Exception { Message message = new Message("t_TopicTest", "Tag1", "12345",info.getBytes()); // 这里用到了这个mq的异步处理,类似ajax,可以得到发送到mq的情况,并做相应的处理 // 不过要注意的是这个是异步的 producer.send(message, new SendCallback() { @Override public void onSuccess(SendResult sendResult) { log.info("传输成功"); log.info(JSON.toJSONString(sendResult)); } @Override public void onException(Throwable e) { log.error("传输失败", e); } }); return Result.OK("测试发送MQ成功"); } }