如何将对象“消息”传递给路线?

时间:2019-04-05 12:41:27

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

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

有效负载不适合我,因为我需要从消息中获取标头。

@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<?> message)

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

2 个答案:

答案 0 :(得分:1)

我认为您无法正确理解堆栈跟踪。

您的void handleProcedure(Message<?> message)及其方法service1::handleProcedure完全适合public B handle(MessageHandler messageHandler) {中的IntegrationFlowDefinition方法签名。

您的问题在这里:

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

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

这应该有效:

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

答案 1 :(得分:0)

您使用的handle(GenericHandler<P>)的{​​{1}}版本仅获得有效负载。

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