首页 > 解决方案 > 如何将对象“消息”传递给路由?

问题描述

我创建了一个流,它使用来自 RabbitMQ 的消息,然后使用路由器按类型分配给适当的服务。服务中的方法需要参数Message<?>,因为我需要在那里使用标头。但是在这种方法中,我只收到带有 type 的消息有效负载,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<?> message)

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

标签: spring-integrationspring-integration-dslspring-integration-amqp

解决方案


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

void handleProcedure(Message<?> message)及其方法service1::handleProcedure引用完全符合.public B handle(MessageHandler messageHandler) {IntegrationFlowDefinition

你的问题在这里:

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

HeadersUtil::getType需要一条消息,但 lambda 调用的类型payloadString您的情况。

这应该有效:

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

推荐阅读