RocketMQ实战_02 生产者Producer与Spring整合
我们都是自己世界的孤独者,有些事情只能自己一个人去面对
一、项目整体框架搭建
该项目采用多模块搭建
1.首先创建一个empty project,命名为slx-project
2.在slx-project中创建一个父模块,命名为trade-system
3.下面依次创建子模块trade-order,trader-pay,trade-coupon,trade-web,trade-common,均依赖于父模块trade-system
创建完成后,如下图所示:
二、开始添加依赖
首先项目所用到的jar先加到父模块的pom文件中,
trade-system的pom文件
<?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.slx</groupId>
<artifactId>trade-system</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>trade-order</module>
<module>trade-pay</module>
<module>trade-coupon</module>
<module>trade-web</module>
<module>trade-common</module>
</modules>
<properties>
<rocketmq.version>3.2.6</rocketmq.version>
<spring.version>4.2.5.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--仅部分模块使用-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>${rocketmq.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
trade-common中的pom文件
<?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.slx</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>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
三、创建一个生产者
package com.slx.trade.common.rocketmq;
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.slx.trade.common.exception.SlxMQException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Author: slx
* @Date: 2019/3/28 11:23
*/
public class SlxMQProducer {
public static final Logger LOGGER = LoggerFactory.getLogger(SlxMQProducer.class);
private DefaultMQProducer producer;
private String groupName;
private String namesrvAddr;
private int maxMessageSize = 1024 * 1024 * 4; //4M
private int sendMsgTimeout = 10000;
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;
}
public int getMaxMessageSize() {
return maxMessageSize;
}
public void setMaxMessageSize(int maxMessageSize) {
this.maxMessageSize = maxMessageSize;
}
public int getSendMsgTimeout() {
return sendMsgTimeout;
}
public void setSendMsgTimeout(int sendMsgTimeout) {
this.sendMsgTimeout = sendMsgTimeout;
}
//初始化mq方法
public void init() throws SlxMQException {
if (StringUtils.isBlank(this.groupName)) {
throw new SlxMQException("groupName is blank");
}
if (StringUtils.isBlank(this.namesrvAddr)) {
throw new SlxMQException("namesrvAddr is blank");
}
this.producer = new DefaultMQProducer(this.groupName);
this.producer.setNamesrvAddr(this.namesrvAddr);
this.producer.setMaxMessageSize(this.maxMessageSize);
this.producer.setSendMsgTimeout(this.sendMsgTimeout);
try {
this.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 start! groupName:[%s],namesrvAddr: [%s]",this.groupName,this.namesrvAddr));
throw new SlxMQException(e);
}
}
public SendResult sendMessage(String topic, String tags, String keys, String messageText) throws SlxMQException {
if (StringUtils.isBlank(topic)) {
throw new SlxMQException("topic is blank");
}
if (StringUtils.isBlank(messageText)) {
throw new SlxMQException("messageText is blank");
}
Message message = new Message(topic,tags,keys,messageText.getBytes());
try {
SendResult sendResult = this.producer.send(message);
return sendResult;
} catch (Exception e) {
LOGGER.error("send message error:",e.getMessage(),e);
throw new SlxMQException(e);
}
}
}
将异常单独抽取出来,代码如下:
package com.slx.trade.common.exception;
/**
* @Author: slx
* @Date: 2019/3/28 11:39
*/
public class SlxMQException extends Exception {
private static final long serialVersionUID = -1227473806932225257L;
public SlxMQException() {
super();
}
public SlxMQException(String message) {
super(message);
}
public SlxMQException(String message, Throwable cause) {
super(message, cause);
}
public SlxMQException(Throwable cause) {
super(cause);
}
}
四、进行测试验证
1.整合spring与rocketmq-producer
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<bean id="slxMQProducer" class="com.slx.trade.common.rocketmq.SlxMQProducer" init-method="init">
<property name="groupName" value="SlxProducerGroup"></property>
<property name="namesrvAddr" value="192.168.0.121:9876;192.168.0.128:9876"></property>
</bean>
</beans>
2.代码测试
import com.alibaba.rocketmq.client.producer.SendResult;
import com.slx.trade.common.exception.SlxMQException;
import com.slx.trade.common.rocketmq.SlxMQProducer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @Author: slx
* @Date: 2019/3/28 12:09
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:xml/spring-rocketmq-producer.xml")
public class TestProducer {
@Autowired
private SlxMQProducer slxMQProducer;
@Test
public void testProducer() throws SlxMQException {
SendResult sendResult = this.slxMQProducer.sendMessage("TestTopic","order","123456","this is order message");
System.out.println(sendResult);
}
}
3.rocketmq-console控制台查看