SpringBoot整合RocketMQ
来源:互联网 发布:印第安人 知乎 编辑:程序博客网 时间:2024/06/05 18:18
10-SpringBoot整合RocketMQ
10.1 Maven依赖
10.1.1 父项目maven依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.clsaa.edu.rocketmq</groupId> <artifactId>trade-system</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>trade-order</module> <module>trade-pay</module> <module>trade-web</module> <module>trade-coupon</module> <module>trade-common</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.4.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.rockermq</groupId> <artifactId>rocketmq-client</artifactId> <version>3.2.6</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> </dependencies> </dependencyManagement></project>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
10.1.2 子项目依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>trade-system</artifactId> <groupId>com.clsaa.edu.rocketmq</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>trade-common</artifactId> <dependencies> <dependency> <groupId>com.alibaba.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>3.2.6</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--<dependency>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-jdbc</artifactId>--> <!--</dependency>--> <!--<dependency>--> <!--<groupId>mysql</groupId>--> <!--<artifactId>mysql-connector-java</artifactId>--> <!--</dependency>--> <!--test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies></project>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
10.2 配置文件
rocketmq: producer: # 发送同一类消息的设置为同一个group,保证唯一,默认不需要设置,rocketmq会使用ip@pid(pid代表jvm名字)作为唯一标示 groupName: vehicleProducerGroup #mq的nameserver地址 namesrvAddr: 123.206.175.47:9876;182.254.210.72:9876 #如果需要同一个jvm中不同的producer往不同的mq集群发送消息,需要设置不同的instanceName instanceName: vehicleProducer #topic名称 topic: TEST #根据实际情况设置消息的tag tag: TEST #消息最大长度 maxMessageSize: 131072 # 1024*128 #发送消息超时时间 sendMsgTimeout: 10000 consumer: namesrvAddr: 123.206.175.47:9876;182.254.210.72:9876 groupName: vehicleProducerGroup topic: sms tag: verifycode consumeThreadMin: 20 consumeThreadMax: 64
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
10.3 启动类
package com.clsaa.edu.trade.common.rocketmq;import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;import com.alibaba.rocketmq.client.exception.MQBrokerException;import com.alibaba.rocketmq.client.exception.MQClientException;import com.alibaba.rocketmq.client.producer.DefaultMQProducer;import com.alibaba.rocketmq.client.producer.SendResult;import com.alibaba.rocketmq.common.message.Message;import com.alibaba.rocketmq.remoting.exception.RemotingException;import org.springframework.boot.SpringApplication;import org.springframework.boot.SpringBootConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContext;import org.springframework.context.ConfigurableApplicationContext;/** * Created by eggyer on 2017/3/25. */@SpringBootApplicationpublic class RocketMQApp { public static void main(String[] args) throws InterruptedException, RemotingException, MQClientException, MQBrokerException { ApplicationContext context = SpringApplication.run(RocketMQApp.class,args); DefaultMQProducer defaultMQProducer = context.getBean(DefaultMQProducer.class); Message msg = new Message("TEST",// topic "TEST",// tag "KKK",//key用于标识业务的唯一性 ("Hello RocketMQ !!!!!!!!!!" ).getBytes()// body 二进制字节数组 ); SendResult result = defaultMQProducer.send(msg); System.out.println(result); DefaultMQPushConsumer consumer = context.getBean(DefaultMQPushConsumer.class); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
10.4 自定义异常
package com.clsaa.edu.trade.common.rocketmq.exception;/** * Created by eggyer on 2017/3/25. */public class RocketMQException extends Exception{ public RocketMQException() { super(); } public RocketMQException(String message) { super(message); } public RocketMQException(String message, Throwable cause) { super(message, cause); } public RocketMQException(Throwable cause) { super(cause); } protected RocketMQException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
10.5 实现 MessageListenerConcurrently接口
package com.clsaa.edu.trade.common.rocketmq.conf;import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;import com.alibaba.rocketmq.common.message.MessageExt;import java.util.List;/** * Created by eggyer on 2017/3/25. */public class MessageListener implements MessageListenerConcurrently{ private MessageProcessor messageProcessor; public void setMessageProcessor(MessageProcessor messageProcessor) { this.messageProcessor = messageProcessor; } @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { for (MessageExt msg : msgs){ boolean result = messageProcessor.handleMessage(msg); if (!result){ return ConsumeConcurrentlyStatus.RECONSUME_LATER; } } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
10.6 设计消息处理接口
package com.clsaa.edu.trade.common.rocketmq.conf;import com.alibaba.rocketmq.common.message.MessageExt;/** * Created by eggyer on 2017/3/25. */public interface MessageProcessor { /** * 处理消息的接口 * @param messageExt * @return */ public boolean handleMessage(MessageExt messageExt);}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
10.7 实现消息处理接口
package com.clsaa.edu.trade.common.rocketmq.conf;import com.alibaba.rocketmq.common.message.MessageExt;import org.springframework.stereotype.Component;/** * Created by eggyer on 2017/3/26. */@Componentpublic class MessageProcessorImplTest implements MessageProcessor { @Override public boolean handleMessage(MessageExt messageExt) { System.out.println("receive : " + messageExt.toString()); return true; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
10.8 实现生产者
package com.clsaa.edu.trade.common.rocketmq.conf;import com.alibaba.rocketmq.client.exception.MQClientException;import com.alibaba.rocketmq.client.producer.DefaultMQProducer;import com.clsaa.edu.trade.common.rocketmq.exception.RocketMQException;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.SpringBootConfiguration;import org.springframework.context.annotation.Bean;/** * Created by eggyer on 2017/3/25. */@SpringBootConfigurationpublic class RocketMQProducerConfiguration { public static final Logger LOGGER = LoggerFactory.getLogger(RocketMQProducerConfiguration.class); @Value("${rocketmq.producer.groupName}") private String groupName; @Value("${rocketmq.producer.namesrvAddr}") private String namesrvAddr; @Value("${rocketmq.producer.instanceName}") private String instanceName; @Value("${rocketmq.producer.maxMessageSize}") private int maxMessageSize ; //4M @Value("${rocketmq.producer.sendMsgTimeout}") private int sendMsgTimeout ; @Bean public DefaultMQProducer getRocketMQProducer() throws RocketMQException { if (StringUtils.isBlank(this.groupName)) { throw new RocketMQException("groupName is blank"); } if (StringUtils.isBlank(this.namesrvAddr)) { throw new RocketMQException("nameServerAddr is blank"); } if (StringUtils.isBlank(this.instanceName)){ throw new RocketMQException("instanceName is blank"); } DefaultMQProducer producer; producer = new DefaultMQProducer(this.groupName); producer.setNamesrvAddr(this.namesrvAddr); producer.setInstanceName(instanceName); producer.setMaxMessageSize(this.maxMessageSize); producer.setSendMsgTimeout(this.sendMsgTimeout); try { producer.start(); LOGGER.info(String.format("producer is start ! groupName:[%s],namesrvAddr:[%s]" , this.groupName, this.namesrvAddr)); } catch (MQClientException e) { LOGGER.error(String.format("producer is error {}" , e.getMessage(),e)); throw new RocketMQException(e); } return producer; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
10.9 实现消费者
package com.clsaa.edu.trade.common.rocketmq.conf;import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;import com.alibaba.rocketmq.client.exception.MQClientException;import com.clsaa.edu.trade.common.rocketmq.exception.RocketMQException;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.SpringBootConfiguration;import org.springframework.context.annotation.Bean;/** * Created by eggyer on 2017/3/25. */@SpringBootConfigurationpublic class RocketMQConsumerConfiguration { public static final Logger LOGGER = LoggerFactory.getLogger(RocketMQConsumerConfiguration.class); @Value("${rocketmq.consumer.namesrvAddr}") private String namesrvAddr; @Value("${rocketmq.consumer.groupName}") private String groupName; @Value("${rocketmq.consumer.topic}") private String topic; @Value("${rocketmq.consumer.tag}") private String tag; @Value("${rocketmq.consumer.consumeThreadMin}") private int consumeThreadMin; @Value("${rocketmq.consumer.consumeThreadMax}") private int consumeThreadMax; @Autowired @Qualifier("messageProcessorImplTest") private MessageProcessor messageProcessor; @Bean public DefaultMQPushConsumer getRocketMQConsumer() throws RocketMQException { if (StringUtils.isBlank(groupName)){ throw new RocketMQException("groupName is null !!!"); } if (StringUtils.isBlank(namesrvAddr)){ throw new RocketMQException("namesrvAddr is null !!!"); } if (StringUtils.isBlank(topic)){ throw new RocketMQException("topic is null !!!"); } if (StringUtils.isBlank(tag)){ throw new RocketMQException("tag is null !!!"); } DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(groupName); consumer.setNamesrvAddr(namesrvAddr); consumer.setConsumeThreadMin(consumeThreadMin); consumer.setConsumeThreadMax(consumeThreadMax); MessageListener messageListener = new MessageListener(); messageListener.setMessageProcessor(messageProcessor); consumer.registerMessageListener(messageListener); try { consumer.subscribe(topic,this.tag); consumer.start(); LOGGER.info("consumer is start !!! groupName:{},topic:{},namesrvAddr:{}",groupName,topic,namesrvAddr); }catch (MQClientException e){ LOGGER.error("consumer is start !!! groupName:{},topic:{},namesrvAddr:{}",groupName,topic,namesrvAddr,e); throw new RocketMQException(e); } return consumer; }}
阅读全文
0 0
- SpringBoot整合RocketMQ
- springboot初步使用RocketMQ
- Jstorm与RocketMQ整合
- Spring 整合 RocketMQ
- Spring 整合 RocketMQ
- Jstorm与RocketMQ整合
- Spring 整合 RocketMQ
- SpringBoot学习:SpringBoot整合mybatis
- SpringBoot整合Mybatis(分层整合)
- springboot整合freemarker
- SpringBoot和Mybatis整合
- springboot整合jsp
- springboot 整合mybatis
- springboot整合swagger
- springboot+mybatis+dubbo整合
- springboot mybaits mysql 整合
- springboot整合jedisCluster
- springboot整合dubbox
- VMware下Ubuntu与宿主Windows共享文件夹
- [单页面]Django打造在线教育平台(三)--Navicat使用
- 【转载】abap程序实现Enhencement-Point增强
- Time and Space Complexity of Recursive Algorithms
- Lint-Code完美平方
- SpringBoot整合RocketMQ
- 一个Java的简单小程序(1)
- MEI代码示例概览
- socket编程(一)
- 操作系统-个人总结与思考
- C/C++语言的简单介绍
- Android动态设置纯色图标的颜色
- linux下为目录和文件设置权限
- CSS选择器小结