【问题标题】:How can I pass an object `Message` to the route?如何将对象“消息”传递给路由?
【发布时间】:2019-08-27 08:57:08
【问题描述】:

我创建了一个流,它使用来自 RabbitMQ 的消息,然后使用路由器按类型分配给适当的服务。 服务中的方法采用参数Message<?>,因为我需要在那里使用标头。但在这种方法中,我只收到java.lang.String 类型的消息有效负载,而不是org.springframework.messaging.Message 和 我收到错误java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.messaging.Message

Payload 不适合我,因为我需要从消息中获取标头。

@Bean
public IntegrationFlow testFlow(String queueName,
                                ConnectionFactory connectionFactory,
                                Service1 service1,
                                Service2 service2) {
    SimpleMessageListenerContainer consumerListener = new SimpleMessageListenerContainer(connectionFactory);
    consumerListener.addQueueNames(queueName);
    return IntegrationFlows.from(Amqp.inboundAdapter(consumerListener))
            .transform(s -> s, ConsumerEndpointSpec::transactional)
            .<Message<?>, String>route(HeadersUtil::getType, m -> m
                    .subFlowMapping(Type.SERVICE_1, sf -> sf.handle(service1::handleProcedure))
                    .subFlowMapping(Type.SERVICE_2, sf -> sf.handle(service2::handleProcedure)))
            .get();
}

方法handleProcedure的签名如下:

void handleProcedure(Message&lt;?&gt; message)

我希望在方法 handleProcedure 中获得 Message 的标头,但现在我得到了异常。

【问题讨论】:

    标签: spring-integration spring-integration-dsl spring-integration-amqp


    【解决方案1】:

    我认为您没有正确理解堆栈跟踪。

    您的void handleProcedure(Message&lt;?&gt; message) 及其service1::handleProcedure 方法引用完全符合IntegrationFlowDefinition 中的public B handle(MessageHandler messageHandler) { 方法签名。

    你的问题在这里:

    .<Message<?>, String>route(HeadersUtil::getType, 
    

    您的 HeadersUtil::getType 需要一条消息,但 lambda 调用的类型是 payload,在您的情况下是 String

    这应该可行:

    .<Message<?>, String>route(Message.class, HeadersUtil::getType, 
    

    【讨论】:

      【解决方案2】:

      您正在使用的.handlehandle(GenericHandler&lt;P&gt;) 版本仅获取有效负载。

      如果要接收完整的消息,则需要使用不同的重载.handle,例如handle("service1", "handleProcedure").handle(service1, "handleProcedure")

      【讨论】:

        猜你喜欢
        • 2019-12-15
        • 2022-12-17
        • 1970-01-01
        • 2022-09-24
        • 1970-01-01
        • 2021-09-01
        • 2018-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多