java springrabitmq和线程本地何时是调用clean方法的好时机
我有一个@RabbitListener
和正常工作的队列。
在我的听者中,我设置了上下文
我知道有许多(可配置的)线程使用相同的队列(因此在实际执行相同的lisener代码时)
现在,我想,什么时候是理清背景的好时机
更准确地说,我要表达的问题是:
“当您结束消费时(无论是否异常),请清除上下文)”
下面,您可以看到我的问题的解决方案:
public class CustomContextHolder {
private static final ThreadLocal<DatabaseType> contextHolder =
new ThreadLocal<DatabaseType>();
public static void setContext(DatabaseType databaseType) {
contextHolder.set(databaseType);
}
public static CustomerType getContext() {
return (CustomerType) contextHolder.get();
}
public static void clearContext() {
contextHolder.remove();
}
}
@RabbitListener
void listenMessage(Message message) {
...
CustomContextHolder.set(...);
}
# 1 楼答案
通常最好使用无状态对象作为侦听器,而不是使用
ThreadLocal
然而,如果您被迫以这种方式保持状态,您可以实现
ApplicationListener<AmqpEvent>
该
ApplicationListener
将接收多个事件;具体地说,消费者正常停止时的AsyncConsumerStoppedEvent
和消费者异常停止时的ListenerContainerConsumerFailedEvent
。这两个事件发布在侦听器线程上,因此您可以在那里清除ThreadLocal
其他事件可能会也可能不会在侦听器线程上发布