springboot整合阿里云rocketmq的tcp连接接入

1、pom

           <dependency>
                <groupId>com.aliyun.openservices</groupId>
                <artifactId>ons-client</artifactId>
                <version>1.8.8.5.Final</version>
            </dependency>

2、mq配置

package com.pojo.prj.config;


import com.aliyun.openservices.ons.api.PropertyKeyConst;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

@Configuration
@ConfigurationProperties(prefix = "rocketmq")
@Data
public class RocketmqConfig {
    //阿里云账号对应的accessKey
    private String accessKey;
    //阿里云账号对应的secretKey
    private String secretKey;
    //阿里云rocketmq的接入点
    private String nameSrvAddr;
    //topic
    private String topic;
    //消费组id
    private String groupId;
    //rocketmq实例id
    private String instanceId;
    //tag 标签
    private String tag;
    //阿里云rocketmq的tcp接入点
    private String tcpNameSrvAddr;

    private String tcpGroupId;

    private String tcpTopic;


    public Properties getMqPropertie() {
        Properties properties = new Properties();
        properties.setProperty(PropertyKeyConst.AccessKey, this.accessKey);
        properties.setProperty(PropertyKeyConst.SecretKey, this.secretKey);
        properties.setProperty(PropertyKeyConst.NAMESRV_ADDR, this.nameSrvAddr);
        properties.setProperty("tcpNameSrvAddr", this.tcpNameSrvAddr);
        return properties;
    }


}

3、消费有序消息客户端

package com.pojo.prj.aliyun.ons;

import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.ons.api.bean.OrderConsumerBean;
import com.aliyun.openservices.ons.api.bean.Subscription;
import com.aliyun.openservices.ons.api.order.MessageOrderListener;
import com.pojo.prj.config.RocketmqConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

//项目中加上 @Configuration 注解,这样服务启动时consumer也启动了
@Configuration
public class OrderConsumerClient {

    @Autowired
    private RocketmqConfig rocketmqConfig;

    @Autowired
    private OrderDemoMessageListener messageListener;

    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public OrderConsumerBean buildOrderConsumer() {
        OrderConsumerBean orderConsumerBean = new OrderConsumerBean();
        //配置文件
        Properties properties = rocketmqConfig.getMqPropertie();
        properties.setProperty(PropertyKeyConst.NAMESRV_ADDR,properties.getProperty("tcpNameSrvAddr"));
        properties.setProperty(PropertyKeyConst.GROUP_ID, rocketmqConfig.getGroupId());
        orderConsumerBean.setProperties(properties);
        //订阅关系
        Map<Subscription, MessageOrderListener> subscriptionTable = new HashMap<Subscription, MessageOrderListener>();
        Subscription subscription = new Subscription();
        subscription.setTopic(rocketmqConfig.getTopic());
        subscription.setExpression("*");
        subscriptionTable.put(subscription, messageListener);
        //订阅多个topic如上面设置

        orderConsumerBean.setSubscriptionTable(subscriptionTable);
        return orderConsumerBean;
    }

}

4、有序消息接收Listener

package com.pojo.prj.aliyun.ons;

import com.aliyun.openservices.ons.api.Message;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

@Component
@Slf4j
public class OrderDemoMessageListener implements MessageOrderListener {
    @Override
    public OrderAction consume(final Message message, final ConsumeOrderContext context) {

        try {
            log.info("tcp内网连接" + new String(message.getBody(), StandardCharsets.UTF_8));
            return OrderAction.Success;
        } catch (Exception e) {
            //消费失败,挂起当前队列
            return OrderAction.Suspend;
        }
    }
}

5、消费普通消息客户端

package com.pojo.prj.aliyun.ons;


import com.aliyun.openservices.ons.api.Consumer;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.ons.api.bean.OrderConsumerBean;
import com.aliyun.openservices.ons.api.bean.Subscription;
import com.aliyun.openservices.ons.api.impl.authority.SessionCredentials;
import com.aliyun.openservices.ons.api.order.MessageOrderListener;
import com.aliyun.openservices.shade.com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.pojo.prj.config.RocketmqConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

//项目中加上 @Configuration 注解,这样服务启动时consumer也启动了
@Configuration
public class TcpConsumerClient {

    @Autowired
    private RocketmqConfig rocketmqConfig;

    @Autowired
    private TcpMessageListener messageListener;

    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public Consumer buildOrderConsumer() {
        Properties properties = new Properties();
        // 您在控制台创建的Group ID。
        properties.put(PropertyKeyConst.GROUP_ID, rocketmqConfig.getTcpGroupId());
        // AccessKey ID,阿里云身份验证标识。获取方式,请参见本文前提条件中的获取AccessKey。
        properties.put(PropertyKeyConst.AccessKey, rocketmqConfig.getAccessKey());
        // AccessKey Secret,阿里云身份验证密钥。获取方式,请参见本文前提条件中的获取AccessKey。
        properties.put(PropertyKeyConst.SecretKey, rocketmqConfig.getSecretKey());
        // 设置TCP协议接入点,进入控制台的实例详情页面的TCP协议客户端接入点区域查看。
        properties.put(PropertyKeyConst.NAMESRV_ADDR,
                rocketmqConfig.getTcpNameSrvAddr());
        // 集群订阅方式(默认)。
        // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING);
        // 广播订阅方式。
        // properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING);

        Consumer consumer = ONSFactory.createConsumer(properties);
        consumer.subscribe(rocketmqConfig.getTcpTopic(), "*", messageListener);
        return consumer;
    }

}

6、普通消息接收Listener

package com.pojo.prj.aliyun.ons;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.ConsumeContext;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.MessageListener;
import com.google.common.collect.Lists;
import com.pojo.common.core.enums.DeviceTypeEnum;
import com.pojo.common.core.utils.LocalDateUtil;
import com.pojo.common.core.utils.StringUtils;
import com.pojo.prj.aliyun.lot.DeviceServiceFactory;
import com.pojo.prj.aliyun.lot.service.DeviceConsumeService;
import com.pojo.prj.task.DeviceConsumeTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;

@Component
@Slf4j
public class TcpMessageListener implements MessageListener {

    @Override
    public Action consume(Message message, ConsumeContext consumeContext) {
        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
        String messageId = message.getMsgID();
        JSONObject object = JSONObject.parseObject(msg);
        String devicetype = object.getString("devicetype");
        if (Objects.equals(devicetype, DeviceTypeEnum.JSD.getCode())) {
            devicetype = DeviceTypeEnum.JSDWG.getCode();
            object.put("devicetype", devicetype);
        }
        if (devicetype.contains(DeviceTypeEnum.CAR01.getCode())) {
            devicetype = DeviceTypeEnum.CAR01.getCode();
            object.put("devicetype", devicetype);
        }
        List<String> deviceTypes = Lists.newArrayList(DeviceTypeEnum.JSDWG.getCode(),
                DeviceTypeEnum.VMS01.getCode(), DeviceTypeEnum.ZHDT01.getCode(),
                DeviceTypeEnum.ZNJSQ.getCode(), DeviceTypeEnum.CAR01.getCode());
        log.error("消费消息" + devicetype + "====" + messageId + "时间==" + LocalDateUtil.getTimeStr(message.getBornTimestamp()));
        if (StringUtils.isNotBlank(devicetype) && deviceTypes.contains(devicetype)) {
            DeviceConsumeService service = DeviceServiceFactory.getInstance(DeviceTypeEnum.getValue(devicetype));
            if (Objects.nonNull(service)) {
                DeviceConsumeTask deviceConsumeTask = DeviceConsumeTask.builder()
                        .deviceConsumeService(service)
                        .messageId(messageId)
                        .msg(object).build();
                DeviceConsumeTask.queueThreadPool.execute(deviceConsumeTask);
            }
        }
        return Action.CommitMessage;
    }
}

实例参考

springboot/java-springboot-demo · master · aliware_rocketmq / rocketmq-demo · CODE

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非ban必选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值