我在多线程环境中使用基于注释的spring amqp方法(我有多个消费者=>多个兔子侦听器容器)。
@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的中央注册表,但如果这更容易,那就太好了。
框架没有提供这样的功能;最简单的解决方案是将它们存储在LinkedBlockingQueue
之类的东西中,然后检出一个,使用它,并在完成后将其放回队列中(如果队列为空,则必要时创建一个)。
ThreadLocal
也可以工作,但我更喜欢使用池