Cannot find a @StreamListener matching for message with id: 99a2a40a-fcf9-800a-384d-e3782846c0ed

rocketMQ报错Cannot find a @StreamListener matching for message with id: 99a2a40a-fcf9-800a-384d-e3782846c0ed

原因:

RocketMQ整合Spring cloud stream之后代码中写了

@StreamListener(value = OrderEventSink.ORDER_STATUS_CHANGED_EVENT_INPUT, condition = "headers['rocketmq_TAGS']=='ORDER'")
    public void handleOrderStatusChangedEvent(Message<OrderStatusChangedEvent> message) {}

但是配置文件没有配置

spring:
  cloud:
    stream:
        bindings:
            orderStatusChangedEventInput:
              destination: order_status_updated_event_topic
//以下代码没有配置
        rocketmq:
            bindings:
              OrderStatusChangedEventInput:
                consumer:
                  tags: ORDER

当消息发送到服务,但是被过滤了,就会包这个错

//org.springframework.cloud.stream.binding.DispatchingStreamListenerMessageHandler#handleRequestMessage这个类中报出来的错

protected Object handleRequestMessage(Message<?> requestMessage) {
        List<DispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper> matchingHandlers = this.evaluateExpressions ? this.findMatchingHandlers(requestMessage) : this.handlerMethods;
        if (matchingHandlers.size() == 0) {
            if (this.logger.isWarnEnabled()) {
// 这是报错的地方
                this.logger.warn("Cannot find a @StreamListener matching for message with id: " + requestMessage.getHeaders().getId());
            }

            return null;
        } else if (matchingHandlers.size() <= 1) {
            DispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper singleMatchingHandler = (DispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper)matchingHandlers.get(0);
            singleMatchingHandler.getStreamListenerMessageHandler().handleMessage(requestMessage);
            return null;
        } else {
            Iterator var3 = matchingHandlers.iterator();

            while(var3.hasNext()) {
                DispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper matchingMethod = (DispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper)var3.next();
                matchingMethod.getStreamListenerMessageHandler().handleMessage(requestMessage);
            }

            return null;
        }
    }

解决办法:

1. yml配置文件中配置上下面那个过滤的代码

spring:
  cloud:
    stream:
//以下代码配置上
        rocketmq:
            bindings:
              OrderStatusChangedEventInput:
                consumer:
                  tags: ORDER

配置上之后,在RocketMQ的broker上就过滤了,就不会发送到服务器上,消息查看就会出现

 消息被发送到服务器上,但是因为配置了head

, condition = "headers['rocketmq_TAGS']=='ORDER'"

 找不到监听的就报错

解决方法2:

yml不配置tag,在代码中配置

, condition = "headers['rocketmq_TAGS']=='ORDER'"

然后自己判断

@StreamListener(value = OrderEventSink.ORDER_STATUS_CHANGED_EVENT_INPUT, condition = "headers['rocketmq_TAGS']=='ORDER'")
    public void handleOrderStatusChangedEvent(Message<OrderStatusChangedEvent> message) {

    Object tags = message.getHeaders().get("rocketmq_TAGS");
        if(!tags.equals("ORDER")){
            return;
        }
//下面是自己的业务

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值