我需要拦截来自 RabbitMQ 的每条传入消息,从中提取一些特定的标头并将其放入线程上下文中。我在互联网上看到了不同的解决方案,但它们与代码配置一起使用,而我有 xml 配置并且无法更改它。 这是我的配置:
<bean id="eventPublisherService"
class="...">
...
</bean>
<rabbit:connection-factory id="connectionFactory"
host="${queuing.connection.host}" virtual-host="${queuing.connection.virtualHost}"
username="${queuing.connection.username}" password="${queuing.connection.password}"/>
<rabbit:admin connection-factory="connectionFactory"/>
<rabbit:queue name="${some.queue}"/>
... more queues
<rabbit:template id="amqpTemplate"
connection-factory="connectionFactory" channel-transacted="true"/>
<bean id="mailingConsumer" class="..."/>
... more beans
<rabbit:listener-container connection-factory="connectionFactory" advice-chain="retryAdvice">
<rabbit:listener ref="mailingConsumer" queue-names="${...}" id="mailingConsumerId"/>
... more listeners
</rabbit:listener-container>
我尝试使用 MessagePostProcessor,但我不确定如何将其集成到现有的设置中。
是的。
<rabbit:listener-container>
不会公开 setAfterReceivePostProcessors()
的属性。
你可以通过
advice-chain
来实现这一点。我看到你已经设置了 retryAdvice
。因此,在调用 MethodInterceptor
之前实现一个 invocation.proceed()
并设置所需的线程上下文。
您可以考虑使用
ListenerContainerFactoryBean
作为 <bean>
定义,而不是 <rabbit:listener-container>
。