SpringCloud Stream整合rocketmq消息发送与接收

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);
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Stream RocketMQ 支持多种消息类型的接口,包括字符串、字节数组、JSON、Java对象等。您可以根据您的需求选择适合的消息类型进行消息传输。 以下是 Spring Cloud Stream RocketMQ 支持的消息类型及其接口: 1. 字符串类型消息 发送字符串类型消息时,可以使用 `MessageChannel` 接口的 `send` 方法,例如: ```java public interface MySource { @Output("output") MessageChannel output(); } @Autowired private MySource source; source.output().send(MessageBuilder.withPayload("hello").build()); ``` 2. 字节数组类型消息 发送字节数组类型消息时,也可以使用 `MessageChannel` 接口的 `send` 方法,例如: ```java public interface MySource { @Output("output") MessageChannel output(); } @Autowired private MySource source; source.output().send(MessageBuilder.withPayload("hello".getBytes()).build()); ``` 3. JSON 类型消息 发送 JSON 类型消息时,可以使用 `@Payload` 注解,并指定消息类型,例如: ```java public interface MySource { @Output("output") MessageChannel output(); @Output("output-json") MessageChannel outputJson(); } @Autowired private MySource source; source.outputJson().send(MessageBuilder.withPayload(new Foo("bar")).setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON).build()); public static class Foo { private String value; public Foo(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } ``` 4. Java 对象类型消息 发送 Java 对象类型消息时,可以使用 `@Payload` 注解,并指定消息类型,例如: ```java public interface MySource { @Output("output") MessageChannel output(); @Output("output-obj") MessageChannel outputObj(); } @Autowired private MySource source; source.outputObj().send(MessageBuilder.withPayload(new Foo("bar")).build()); public static class Foo { private String value; public Foo(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } ``` 以上就是 Spring Cloud Stream RocketMQ 支持的不同类型消息的接口示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值