Container Thread Naming

TaskExecutor 用于调用消费者和侦听器。您可以通过设置容器的 ContainerPropertiesconsumerExecutor 属性来提供自定义执行器。使用池化执行器时,请确保有足够线程来处理其中使用它们的全部容器中的并发。在使用 ConcurrentMessageListenerContainer 时,来自执行器的某个线程用于每个消费者(concurrency)。

如果您未提供消费者执行器,系统会为每个容器使用 SimpleAsyncTaskExecutor。此执行器创建具有类似于 <beanName>-C-<n> 的名称的线程。对于 ConcurrentMessageListenerContainer,线程名称中的 <beanName> 部分将变为 <beanName>-m,其中 m 表示消费者实例。在首次启动容器后,n 会在每次启动容器时递增。因此,在首次启动容器后,名为 container 的 bean 中的线程将被命名为 container-0-C-1container-1-C-1 等;在停止然后后续启动后,它们将被命名为 container-0-C-2container-1-C-2 等。

从版本 3.0.1 开始,无论使用哪个执行器,您现在都可以更改线程的名称。将 AbstractMessageListenerContainer.changeConsumerThreadName 属性设置为 true,系统会调用 AbstractMessageListenerContainer.threadNameSupplier 以获取线程名称。这是一个 Function<MessageListenerContainer, String>,其默认实现返回 container.getListenerId()