spring-integration - 如何将对象“消息”传递给路由?
问题描述
我创建了一个流,它使用来自 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
,但现在我得到了异常。
解决方案
我认为您没有正确理解堆栈跟踪。
您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,
推荐阅读
- python-3.x - 在单个 Try: 块中处理多个但相同类型的异常 - NoSuchElementException
- android - 活动情况下的 Robolectric 测试用例是通过上下文启动的
- blockchain - Oracle 区块链平台 - 实例创建失败
- php - 在 mySQL 中创建包含连字符、百分号、句号等名称的表
- azure-active-directory - 更改密码时权限不足
- odoo - 如何解决 odoo 11 中 KeyError 'order_line' 的问题
- java - 将字符串转换为 LocalDate
- wordpress - 将父级设置为单个自定义帖子(面包屑问题)
- scala - 将时间戳列与字符串列连接起来
- jsf - 如何在 JSF 中正确使用 commandButton?