我在多线程环境中使用spring amqp的基于注释的方法(我有多个consumer =>多个兔子监听器容器)。
@RabbitListener(queues = "tasks")
public void receiveMessage(@Payload Task task) {
// usage of httpClient here with its own httpContext (would be fine)
// this method gets called from different listenerContainers / threads
}
我的包含带注释的receiveMessage()方法的组件需要使用apache http客户端进行一些http调用。由于我同时与多个消费者一起工作,因此从不同的线程调用此方法,并且apache http客户端文档说我应该为每个线程创建一个httpContext,以保证线程安全。由于所有线程都在调用相同的组件方法,因此我无法将httpContext放入组件中。
是否有类似于每个侦听器容器的侦听器容器上下文,我可以放置httpClientContext?或者有人知道如何轻松解决这个问题?我想到了ThreadLocal或httpContexts的中央注册表,但如果这样更容易就可以了。
答案 0 :(得分:1)
框架没有提供这样的内容;最简单的解决方案是将它们存储在LinkedBlockingQueue
之类的内容中,然后检查一下,使用它,并在完成后将其放回队列中(如果队列为空,则根据需要创建一个)。
ThreadLocal
也可以,但我更喜欢使用游泳池。