容器线程命名
一个 TaskExecutor 被用来调用消费者和监听器。您可以通过设置容器的 ContainerProperties 的 consumerExecutor 属性来提供一个自定义执行器。当使用线程池执行器时,请确保有足够的线程来处理所有使用它们的容器的并发。当使用 ConcurrentMessageListenerContainer 时,执行器中的一个线程被用于每个消费者 (concurrency)。
如果您不提供消费者执行器,每个容器都会使用一个 SimpleAsyncTaskExecutor。这个执行器会创建名称类似于 <beanName>-C-<n> 的线程。对于 ConcurrentMessageListenerContainer,线程名称中的 <beanName> 部分会变成 <beanName>-m,其中 m 代表消费者实例。n 每次容器启动时都会递增。因此,如果 bean 名称为 container,则在该容器第一次启动后,线程将被命名为 container-0-C-1、container-1-C-1 等;在停止并随后启动后,将被命名为 container-0-C-2、container-1-C-2 等。
从 3.0.1 版本开始,无论使用哪个执行器,您现在都可以更改线程的名称。将 AbstractMessageListenerContainer.changeConsumerThreadName 属性设置为 true,AbstractMessageListenerContainer.threadNameSupplier 将被调用以获取线程名称。这是一个 Function<MessageListenerContainer, String>,默认实现返回 container.getListenerId()。