容器线程命名

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

如果未提供消费者执行器,则每个容器将使用一个SimpleAsyncTaskExecutor。此执行器创建的线程名称类似于<beanName>-C-<n>。对于ConcurrentMessageListenerContainer,线程名称的<beanName>部分变为<beanName>-m,其中m代表消费者实例。n在每次启动容器时都会递增。因此,如果bean名称为container,则此容器中的线程在第一次启动后将命名为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()