在多线程环境中,我应该在哪里将线程相关数据存储在接收rabbitListener组件中?

时间:2016-10-25 14:07:45

标签: spring-boot spring-amqp spring-rabbit spring-rabbitmq

我在多线程环境中使用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的中央注册表,但如果这样更容易就可以了。

1 个答案:

答案 0 :(得分:1)

框架没有提供这样的内容;最简单的解决方案是将它们存储在LinkedBlockingQueue之类的内容中,然后检查一下,使用它,并在完成后将其放回队列中(如果队列为空,则根据需要创建一个)。

ThreadLocal也可以,但我更喜欢使用游泳池。