是否可以在Spring AMQP中使用异步消息接收器来处理多种内容类型?

时间:2014-03-06 20:32:27

标签: spring spring-amqp spring-rabbit

我在Spring-AMQP中使用异步消息接收器来接收消息。目前只处理具有JSON内容的消息,但我还要求处理具有XML内容的消息。我当前对MessageListener的实施已注入MessageConverter并在onMessage(Message)中使用它,如下所示:

MyMessage myMessage = (MyMessage) jsonConverter.fromMessage(message);

为了支持不同的内容类型,我显然可以使用MessageProperties来查询内容类型标题并手动选择要使用的转换器。但这似乎很多工作,像Spring应该为这种情况提供更好的支持。我希望找到一个从内容类型映射到特定转换器的通用MessageConverter实现,但似乎没有这样的东西。

我最好选择这样的委托转换器吗?或者有没有办法配置ListenerContainer以支持异步接收多个转换器,这些转换器会根据需要自动使用?

1 个答案:

答案 0 :(得分:1)

我们遇到open JIRA问题,请求支持CompositeMessageConverter。

侦听器容器不支持转换,但我们确实拥有支持它们的MessageListenerAdapter(但只有一个,还有处理回复等其他内容)。

使用适配器意味着您可以在侦听器上使用POJO方法...

public void handleMessage(MyObject foo) {...}

如果您将委托转换器(委托给json或编组转换器的转换器)放入MLA,并且两个转换器都创建相同的对象类型,这将正常工作。否则,签名必须采用Object,您必须进行instanceof次测试。

在某些时候,我想让适配器变得更聪明一些,所以它可以根据转换器创建的对象类型选择方法...

public void handleMessage(Foo foo) {...}

public void handleMessage(Bar bar) {...}

......但这确实是一个不同的问题。

如果您想出一个有用的转换器,您希望为该框架做出贡献,则指南为on the project wiki