首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring集成- AMQP支持消息通道和消息转换

Spring集成- AMQP支持消息通道和消息转换
EN

Stack Overflow用户
提问于 2016-03-27 14:50:03
回答 1查看 740关注 0票数 1

我正在我的Spring应用程序中尝试使用AMQP支持的消息通道,但我认为我从根本上误解了一些东西,特别是围绕Message<?>接口以及GenericMessage<?>实例是如何写入和读取RabbitMQ队列的。

假设我有一个包含以下域模型对象的应用程序:

代码语言:javascript
复制
@Immutable
class Foo {
  String name
  long quantity
}

我声明一个名为fooChannel的AMQP支持消息通道如下:

代码语言:javascript
复制
@Bean
public AmqpChannelFactoryBean deliveryPlacementChannel(CachingConnectionFactory connectionFactory) {
  AmqpChannelFactoryBean factoryBean = new AmqpChannelFactoryBean(true)
  factoryBean.setConnectionFactory(connectionFactory)
  factoryBean.setQueueName("foo")
  factoryBean.beanName = 'fooChannel'
  factoryBean.setPubSub(false)
  factoryBean
}

当我最初试图向我的fooChannel发送消息时,我收到了一个java.io.NotSerializableException。我意识到这是因为我的AMQP支持的fooChannel所使用的fooChannel使用的org.springframework.amqp.support.converter.SimpleMessageConverter只能使用字符串、可序列化实例或字节数组,而fooChannelFoo模型并不是这些东西中的任何一个。

因此,我认为应该使用org.springframework.amqp.support.converter.Jackson2JsonMessageConverter来确保正确地将Foo模型转换为/from和AMQP消息。但是,添加到支持MyfooChannel的RabbitMQ队列中的消息的类型似乎是org.springframework.messaging.support.GenericMessage类型。这意味着当我的AMQP支持的fooChannel尝试使用来自RabbitMQ队列的消息时,它会收到以下异常:

代码语言:javascript
复制
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class org.springframework.messaging.support.GenericMessage]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)

通过查看GenericMessage类,我发现它设计为不可变,这清楚地解释了为什么Jackson2JsonMessageConverter不能从JSON转换为GenericMessage类型。但是,我不确定我应该做什么才能让我的fooChannel得到Foo的支持,并使包含我的Foo模型的Spring消息的转换工作正常?

在我的应用程序流程中,我有以下Transformer组件,它使用来自(非AMQP支持的) barChannelBar模型,并将Foo模型放置在fooChannel上,如下所示:

代码语言:javascript
复制
@Transformer(inputChannel = 'barChannel', outputChannel = 'fooChannel')
public Foo transform(Bar bar) {
  //transform logic removed for brevity
  new Foo(name: 'Foo1', quantity: 1)
}

然后,我有一个ServiceActivator组件,我希望从fooChannel中使用它,如下所示:

代码语言:javascript
复制
@ServiceActivator(inputChannel = 'fooChannel')
void consumeFoos(Foo foo){
  // Do something with foo
} 

我正在使用spring-integration-core:4.2.5.RELEASEspring-integration-amqp:4.2.5.RELEASE

有人能告诉我Spring应用程序的配置哪里出了问题吗?

如果需要进一步的资料,以便更好地澄清我的问题或问题,请告诉我。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-27 15:44:39

是的-amqp支持的通道目前仅限于Java可序列化对象.

我们应该提供一个选项来将Message<?>映射到Spring Message (就像通道适配器那样),而不是.

代码语言:javascript
复制
this.amqpTemplate.convertAndSend(this.getExchangeName(), this.getRoutingKey(), message);

...which转换整个消息。

您可以使用一对通道适配器(出站/入站)来代替通道。

由于您使用的是Java,所以可以将适配器对封装在一个新的MessageChannel实现中。

我打开了一个JIRA问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36248691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档