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