RocketMQ实战_02 生产者Producer与Spring整合

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控制台查看
image

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值