首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在spring-amqp中阅读兔消息的最早入口点是什么?

在spring-amqp中阅读兔消息的最早入口点是什么?
EN

Stack Overflow用户
提问于 2018-01-18 17:53:24
回答 2查看 957关注 0票数 8

我将线程本地的兔消息数据存储在MDC中。我希望为传入的兔消息清除旧的上下文数据并添加新的上下文数据,比如从报头中读取某些值或将兔消息的有效负载作为byte[]读取。不幸的是,我经常看到在消息命中带@RabbitHandler注释的方法之前发生异常。有没有一个更早的入口点可以用来建立这个上下文?我不知道反序列化发生之前会发生什么,但理想情况下,我希望在尝试反序列化之前访问消息。也许在某个地方有一个onMessageReceived(byte[] message, Map headers)方法钩子。调用堆栈中越早越好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-18 22:05:36

@RabbitHandlerAbstractRabbitListenerContainerFactory填充,它可以与自定义的MessageConverterhttps://docs.spring.io/spring-amqp/docs/2.0.1.RELEASE/reference/html/_reference.html#message-converters一起提供。从MessagingMessageListenerAdapter.toMessagingMessage()调用它的fromMessage()。这是在MessagingMessageListenerAdapter.onMessage()中完成的。这确实是你可以挂接的非常早的地方。实际上,您仍然有一个原始的org.springframework.amqp.core.Message对象,没有任何转换,并且具有所有可用的头和属性。

嗯,你也可以注入:

代码语言:javascript
复制
/**
 * @param afterReceivePostProcessors the post processors.
 * @see AbstractMessageListenerContainer#setAfterReceivePostProcessors(MessagePostProcessor...)
 */
public void setAfterReceivePostProcessors(MessagePostProcessor... afterReceivePostProcessors) {

出于类似的原因你也在请求。

票数 2
EN

Stack Overflow用户

发布于 2018-01-18 22:06:16

一种解决方案是使用SimpleMessageListenerContainer而不是@RabbitHandler注释,并使用自定义消息侦听器适配器。

示例:

代码语言:javascript
复制
@Bean
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
                                         MessageListenerAdapter listenerAdapter) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.setQueueNames(queueName);
    container.setMessageListener(listenerAdapter); // custom listener
    container.setMessageConverter(null); // disable default conversion
    return container;
}

@Bean
MessageListenerAdapter listenerAdapter() {
    RawMessageDelegate delegate = new RawMessageDelegate();
    return new MessageListenerAdapter(delegate);
}

public class RawMessageDelegate {

    void handleMessage(Message message) {
        byte[] body = message.getBody();
        MessageProperties properties = message.getMessageProperties();
        Map<String, Object> headers = properties.getHeaders();
        // handle raw data
    }

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

https://stackoverflow.com/questions/48318322

复制
相关文章

相似问题

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