有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    通常最好使用无状态对象作为侦听器,而不是使用ThreadLocal

    然而,如果您被迫以这种方式保持状态,您可以实现ApplicationListener<AmqpEvent>

    ApplicationListener将接收多个事件;具体地说,消费者正常停止时的AsyncConsumerStoppedEvent和消费者异常停止时的ListenerContainerConsumerFailedEvent。这两个事件发布在侦听器线程上,因此您可以在那里清除ThreadLocal

    其他事件可能会也可能不会在侦听器线程上发布