容器线程命名

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属性设置为trueAbstractMessageListenerContainer.threadNameSupplier将被调用以获取线程名称。 这是一个Function<MessageListenerContainer, String>,默认实现返回container.getListenerId()