在多线程环境中,我应该将线程相关数据存储在接收 rabbitListener 组件中的什么位置?
Where should i store thread dependent data within a receiving rabbitListener component in a multithreaded environment?
我在多线程环境中使用 spring amqp 的基于注解的方法(我有多个消费者 => 多个 rabbit 侦听器容器)。
@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
也可以,但我更喜欢使用池。
我在多线程环境中使用 spring amqp 的基于注解的方法(我有多个消费者 => 多个 rabbit 侦听器容器)。
@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
也可以,但我更喜欢使用池。