容器執行緒命名
一個 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()。