当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring RabbitMQ MessageListener获取MessageProperties

程阳平
2023-03-14

我正在创建一个Spring MessageListenerAdapter,用于侦听XML消息队列。

这是我的amqp配置:

    @Bean()
    SimpleMessageListenerContainer simpleMessageListenerContainer(ConnectionFactory connectionFactory,
                                                                  MessageListenerAdapter messageListener) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames("queueA", "queueB");
        container.setMessageListener(messageListener);
        container.setChannelTransacted(true);
        return container;
    }

    @Bean
    MessageListenerAdapter messageListener(Receiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

当前,消息的接收工作正常,但仅当我的侦听器的返回类型是字符串时。

通过以下侦听器,我可以接收XML消息,所以这很好。但我无法获取原始消息的消息属性:

@Component
public class Receiver {

    public void receiveMessage(String message) {
        try {
            if (message.isEmpty()) {
                log.info("---> Received message is empty!");
            } else {
                log.info("---> Received message: <{}>", message);
            }
        } catch (Exception e) {
            log.error("---> Exception in processing receiv                                              
                   ed message!", e);
        }
    }                                                                                                                            
}                                 

如果我将receiveMessage()的返回类型更改为字节[]或消息,则会收到以下错误消息:

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Failed to invoke target method 'receiveMessage' with argument type = [class java.lang.String], value = [{myXmlMessage}]

我已经尝试过MessageConverters,但我是RabbitMQ的新手。谢谢你的帮助!

共有1个答案

司毅庵
2023-03-14

我自己找到了解决方案:默认情况下,MessageListenerAdapter使用MessageConverter。为了防止出现这种情况,必须将MessageConverter设置为null。现在它工作了,我收到了包含所有messageProperties的普通消息!

@Bean
MessageListenerAdapter messageListener(Receiver receiver) {
    MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(receiver, "receiveMessage");
    messageListenerAdapter.setMessageConverter(null);
    return messageListenerAdapter;
}
 类似资料:
  • 我正在将esapi安全筛选器应用到我的应用程序中,正在使用conf.properties文件中的属性启用/禁用此安全筛选器。当它被禁用时,它工作得很好,但当它被启用时,我无法访问我的应用程序,这里是我的代码: 我已经调试了这个问题,但无法解决它。当Request.getPathInfo()被启用时,我将其作为“”获取,当它被禁用时,我将返回路径。 如何解决这个问题,请帮助我。提前谢谢。

  • 我有一些url。我想从url指向的html中获取所有href,从所有获取的hrefs中获取所有href(递归)。关键是我想设置“递归”的深度。例如,如果深度=1,我只需要来自超文本标记语言的href。如果深度=2,我需要来自超文本标记语言的hrefs(假设为list1)和来自list1的每个href的hrefs,依此类推 以下是我使用jsoup得到的结果: 我应该如何修复递归条件以使其正确?

  • 问题内容: 我在访问SimpleXML对象的部分时遇到问题。当我整个对象时,我得到正确的输出,而当我其余对象(嵌套标签)时,我得到正确的输出,但是当我遵循docs和时 ,我得到一个空对象,尽管事实是第一个清楚地表明,存在要输出的属性。 任何人都知道我在这里做错了/如何进行这项工作? 问题答案: 您可以通过在XML节点上调用attribute()函数来获取XML元素的属性。然后,您可以var_dum

  • 问题内容: 我正在运行jstat -gc(来自OpenJDK): 如何阅读: 用过的堆 堆大小 最大堆 从此输出,就像VisualVM所示? 问题答案: 有关一般参考,请参见https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html。 当前堆大小将是所有以“ C”结尾的字段的总和-S0C,S1C,EC,OC(Metas

  • 我正在创建一个fetchBill函数。分配https://randomapi.com/api/006b08a801d82d0c9824dcfdfdfa3b3c到一个api变量。它使用浏览器的fetch函数向api发出HTTP请求。它在一个函数中使用箭头函数。然后调用fetch函数,并在将其转换为JSON后返回响应。使用另一个。然后调用第一个函数,该函数将JSON数据传递给displayCartTo

  • 问题内容: 我正在尝试使用Flask访问用户代理,但是我找不到有关它的文档,或者它没有告诉我。 问题答案: 您还可以使用包含以下属性的对象,这些属性是基于useragent字符串创建的: 平台(Windows,Linux,MacOS等) 浏览器(chrome,firefox,msie等) 版 语言 字串()