java实现阿里云rocketMQ消息的发送与消费(tcp协议sdk)

一、准备工作

登录阿里云官网,先申请rocketMQ,再申请Topic、Group ID,然后就是参考阿里云的JAVA SDK进行编程实现。

环境要求:
安装JDK 1.8或以上版本
安装Maven
安装Java SDK

参照 阿里云 官方文档,来一步一步操作。
文档提供的SDK有TCP和Http协议,这里使用TCP协议来实现rocketMQ消息的发送与消费。

在这里插入图片描述

二、代码实现

调用TCP协议的SDK收发普通消息

1.添加依赖

创建Springboot项目,添加 SDK依赖:

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <!--aliyun mq tcp协议 sdk-->
 <dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>ons-client</artifactId>
    <!--以下版本号请替换为Java SDK的最新版本号-->
    <version>2.0.3.Final</version>
 </dependency>

注意:aliyun mq sdk的版本信息,请参见版本说明

2.创建一个常量类存放公共参数

package com.example.rocketdemotcp.config;

/**
 * @author qzz
 */
public class MqConfigParams {
    
    

    /**
     * 你的topic
     */
    public static final String TOPIC = "你的topic";
    /**
     * tag消息标签  *:代表全部
     */
    public static final String TAG = "你的tag消息标签";
    /**
     * 你的Group_Id
     */
    public static final String GROUP_ID = "你的Group_Id";
    /**
     *你的accessKey
     */
    public static final String ACCESS_KEY = "你的accessKey";
    /**
     *你的secretKey
     */
    public static final String SECRET_KEY = "你的secretKey";
    /**
     * 实例ID
     */
    public static final String INSTANCE_ID = "你的实例ID";
    /**
     * 设置TCP协议客户端接入点,进入消息队列RocketMQ版控制台实例详情页面的接入点区域查看
     */
    public static final String NAMESRV_ADDR = "你的TCP接入点地址";
}

3.调用TCP协议的SDK 发送消息

package com.example.rocketdemotcp.util;


import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.example.rocketdemotcp.config.MqConfigParams;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.Properties;
import java.util.UUID;

/**
 * 生产 阿里云 RocketMQ 消息(同步发送普通消息)
 * @author qzz
 */
@Slf4j
public class ProducerTest {
    
    
    public static void main(String[] args) {
    
    
        Properties properties = new Properties();
        // AccessKey ID,阿里云身份验证标识。获取方式,请参见创建AccessKey。
        properties.put(PropertyKeyConst.AccessKey, MqConfigParams.ACCESS_KEY);
        // AccessKey Secret,阿里云身份验证密钥。获取方式,请参见创建AccessKey。
        properties.put(PropertyKeyConst.SecretKey, MqConfigParams.SECRET_KEY);
        //设置发送超时时间,单位:毫秒。
        properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
        // 设置TCP接入域名,进入消息队列RocketMQ版控制台实例详情页面的接入点区域查看。
        properties.put(PropertyKeyConst.NAMESRV_ADDR, MqConfigParams.NAMESRV_ADDR);
        Producer producer = ONSFactory.createProducer(properties);
        // 在发送消息前,必须调用start方法来启动Producer,只需调用一次即可。
        producer.start();

        //循环发送消息。
        for (int i = 0; i < 1; i++){
    
    
            Message msg = new Message(
                    // 普通消息所属的Topic,切勿使用普通消息的Topic来收发其他类型的消息。
                    MqConfigParams.TOPIC,
                    // Message Tag可理解为Gmail中的标签,对消息进行再归类,方便Consumer指定过滤条件在消息队列RocketMQ版的服务器过滤。
                    // Tag的具体格式和设置方法,请参见Topic与Tag最佳实践。
                    MqConfigParams.TAG,
                    // Message Body可以是任何二进制形式的数据,消息队列RocketMQ版不做任何干预。
                    // 需要Producer与Consumer协商好一致的序列化和反序列化方式。
                    "hello mq 123!".getBytes());
            // 设置代表消息的业务关键属性,请尽可能全局唯一。
            // 以方便您在无法正常收到消息情况下,可通过消息队列RocketMQ版控制台查询消息并补发。
            // 注意:不设置也不会影响消息正常收发。
            msg.setKey(UUID.randomUUID().toString());

            try {
    
    
                SendResult sendResult = producer.send(msg);
                // 同步发送消息,只要不抛异常就是成功。
                if (sendResult != null) {
    
    
                    System.out.println(new Date() + " Send mq message success. Topic is:" + msg.getTopic() + " msgId is: " + sendResult.getMessageId());
                }
            }
            catch (Exception e) {
    
    
                // 消息发送失败,需要进行重试处理,可重新发送这条消息或持久化这条数据进行补偿处理。
                System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
                e.printStackTrace();
            }
        }

        // 在应用退出前,销毁Producer对象。
        // 注意:销毁Producer对象可以节约系统内存,若您需要频繁发送消息,则无需销毁Producer对象。
        producer.shutdown();
    }


}

4.调用TCP协议的SDK 订阅消息

订阅消息的代码如下:

package com.example.rocketdemotcp.util;

import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.ons.api.order.ConsumeOrderContext;
import com.aliyun.openservices.ons.api.order.MessageOrderListener;
import com.aliyun.openservices.ons.api.order.OrderAction;
import com.aliyun.openservices.ons.api.order.OrderConsumer;
import com.example.rocketdemotcp.config.MqConfigParams;

import java.util.Properties;


/**
 * 消费 阿里云 RocketMQ 消息
 * @author qzz
 */
public class ConsumerClient {
    
    

    public static void main(String[] args) {
    
    
        Properties properties = new Properties();
        // 您在消息队列RocketMQ版控制台创建的Group ID。
        properties.put(PropertyKeyConst.GROUP_ID, MqConfigParams.GROUP_ID);
        // AccessKey ID,阿里云身份验证标识。获取方式,请参见创建AccessKey。
        properties.put(PropertyKeyConst.AccessKey,MqConfigParams.ACCESS_KEY);
        // AccessKey Secret,阿里云身份验证密钥。获取方式,请参见创建AccessKey。
        properties.put(PropertyKeyConst.SecretKey,MqConfigParams.SECRET_KEY);
        // 设置TCP接入域名,进入消息队列RocketMQ版控制台实例详情页面的接入点区域查看。
        properties.put(PropertyKeyConst.NAMESRV_ADDR,MqConfigParams.NAMESRV_ADDR);
        // 顺序消息消费失败进行重试前的等待时间,单位(毫秒),取值范围: 10毫秒~30,000毫秒。
        properties.put(PropertyKeyConst.SuspendTimeMillis,"100");
        // 消息消费失败时的最大重试次数。
        properties.put(PropertyKeyConst.MaxReconsumeTimes,"20");

        // 在订阅消息前,必须调用start方法来启动Consumer,只需调用一次即可。
        OrderConsumer consumer = ONSFactory.createOrderedConsumer(properties);

        consumer.subscribe(
                // Message所属的Topic。
                MqConfigParams.TOPIC,
                // 订阅指定Topic下的Tags:
                // 1. * 表示订阅所有消息。
                // 2. TagA || TagB || TagC表示订阅TagA或TagB或TagC的消息。
                MqConfigParams.TAG,
                new MessageOrderListener() {
    
    
                    /**
                     * 1. 消息消费处理失败或者处理出现异常,返回OrderAction.Suspend。
                     * 2. 消息处理成功,返回OrderAction.Success。
                     */
                    @Override
                    public OrderAction consume(Message message, ConsumeOrderContext context) {
    
    
                        System.out.println("Received:"+message);
                        return OrderAction.Success;
                    }
                });

        consumer.start();
    }
}


三、配置main的日志输出级别

启动执行时,发现问题:控制台打印巨多debug日志

默认情况下,如果项目中集成了Logback等日志框架,在执行main方法时通过其进行日志打印,那么默认的日志级别是debug的

此时,如果是http请求,甚至可以把请求的具体报文信息都打印出来,特别是三方框架的。为了不影响查看正常的日志,可以将main方法的日志级别进行调整

解决方法:
resources目录下增加logback.xml

logback.xml:

<configuration debug="false">
    <logger name="org.apache" level="INFO" />
    <logger name="org.apache.http.wire" level="INFO" />
    <logger name="org.apache.http.headers" level="INFO" />
    <property name="CONSOLE_LOG_PATTERN"
              value="%date{yyyy-MM-dd HH:mm:ss}  %highlight(%-5level) %magenta(%-4relative) --- [%yellow(%15.15thread)] %cyan(%-40.40logger{39}) : %msg%n"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <root level="ERROR">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

再次启动,打印日志就简洁明多了。

四、测试效果

注意:先启动消费者程序,进行监听消息。

生产者启动运行,结果如下:
在这里插入图片描述

消费者监听消息结果如下:

在这里插入图片描述

五、完成代码

可点击此处进行下载

参考文档:阿里云 消息队列 RocketMQ Java SDK

猜你喜欢

转载自blog.csdn.net/qq_26383975/article/details/129182345
今日推荐