在多线程环境中,我应该在接收rabbitListener组件中存储线程依赖的数据



我在多线程环境中使用基于注释的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也可以工作,但我更喜欢使用池

最新更新