SpringCloud Stream整合rocketmq消息发送与接收
1.生产者
public interface RocketSource {
/**
* 这里的名称对应了spring.cloud.stream.rocketmq.bindings.<channelName>
* 集群单点消费消息
*/
/**
* 广播指令(对象消息)
*/
String DEVICE_COMMAND_OUTPUT = "device-command-output";
@Output(DEVICE_COMMAND_OUTPUT)
SubscribableChannel deviceCommandOutput();
}
2.通道绑定
/**
* 配置消息生产者
*/
@EnableBinding({RocketSource.class})
public class SteamBinding {
}
3.发生消息
public interface RocketMqSenderService {
<T> void sendWithTags(T message, String tag);
}
@Service
@Slf4j
public class RocketMqSenderServiceImpl implements RocketMqSenderService {
@Autowired
private RocketSource source;
/**
* 发送带tag的对象消息
*/
@Override
public <T> void sendWithTags(T msg, String tag) {
Message message = MessageBuilder.withPayload(msg)
.setHeader(MessageConst.PROPERTY_TAGS, tag)
// .setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL, 1000 * 60 * 1)//延时消息
.setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON)
.build();
log.info("MQ广播指令信息:{}",message);
source.deviceCommandOutput().send(message);
}
}```
4.消费者
public interface RocketSink {
/**
* 监听设备服务广播的指令(对象消息)
*/
String DEVICE_COMMAND_INPUT = "device-command-input";
@Input(DEVICE_COMMAND_INPUT)
SubscribableChannel deviceCommandInput();
}
5.通道绑定
/**
* steam配置
*/
@EnableBinding({RocketSink.class})//数组
public class SteamBinding {
}
6.接收并下发设备指令
@Service
@Slf4j
public class ExeCommandService {
/**
* 普通下发(不关注结果)
*/
@Autowired
private ObdSender obdSender;
// /**
// * 指令序列化下发
// */
// @Autowired
// private NotifyProxy notifyProxy;
//
// @Autowired
// private DeviceCommandFeign deviceCommandFeign;
/**
* 对象消息
*/
@StreamListener(RocketSink.DEVICE_COMMAND_INPUT)
public void commandInput(@Payload MessageWrapper message) {
log.info("设备服网关监听[{}]MQ下发设备指令:-->指令序列号:{}", message.getDeviceSn(), message.getSeq());
if (message == null) {
log.error("设备服网关监听MQ下发设备指令异常,消息内容为null");
return;
}
try {
if (obdSender.existSession(message)) {
obdSender.sendMessage(message);
/*// 1.检查该指令是否需要下发 ::网关执行状态:0=未发送到网关;1=网关已收到;2=网关下发成功;3=网关执行失败
Integer gatewayStatus = deviceCommandFeign.getGatewayStatus(message.getSeq(), SecurityConstants.FROM_IN);
if (gatewayStatus == null || gatewayStatus.intValue() == 1 || gatewayStatus.intValue() == 2){
log.info("网关重复消息--gatewayStatus{}--->seq{}",gatewayStatus,message.getSeq());
return;
}
int result = notifyProxy.notify(message,30000);//毫秒
switch (result){
case Constants
.NOTIFY_SUCCESS:
DeviceCommand success = new DeviceCommand();
success.setId(message.getSeq());
success.setDeviceSn(message.getDeviceSn());
success.setGatewayStatus(2);
success.setExecuteTime(OvmDateUtil.getCstNow());
success.setRemark(NetUtils.getLocalHost());
//修改平台执行指令的状态:平台已下发
deviceCommandFeign.handleGatewayResult(success, SecurityConstants.FROM_IN);
break;
case Constants
.NOTIFY_FAILURE:
DeviceCommand fail = new DeviceCommand();
fail.setId(message.getSeq());
fail.setGatewayStatus(3);
fail.setDeviceSn(message.getDeviceSn());
fail.setRemark(NetUtils.getLocalHost());
deviceCommandFeign.handleGatewayResult(fail, SecurityConstants.FROM_IN);
break;
case Constants
.NOTIFY_NO_SESSION:
log.debug("[{}]不在本服务器连接!",message.getDeviceSn());
break;
default:
log.debug("[{}]不在本服务器连接!",message.getDeviceSn());
break;
}*/
} else {
/** no session on this machine **/
log.debug("[{}]不在本服务器连接!", message.getDeviceSn());
return;
}
} catch (Exception e) {
log.error("下发命令遭遇异常:", e);
}
}