2016-07-08 66 views
4

我的應用程序正在通過Jms MessageListener類讀取消息,並在某個時間點拋出TaskRejectedException。我知道你們大多數人會說線程的數量超過maxPoolSize並且隊列也已滿。ThreadPoolExecutor :: Executor的TaskRejectedException

但我觀察到了一些東西。發送到從該消息監聽類中提取的消息是10353的隊列和我的ThreadPoolExecutor的彈簧特性的消息的數量低於:

<bean id="ticketReaderThreadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" scope="singleton" destroy-method="destroy"> 
    <property name="corePoolSize" value="10" /> 
    <property name="maxPoolSize" value="150" /> 
    <property name="queueCapacity" value="11000" /> 
</bean> 

現在根據我的maxPoolSize比足以應付這麼多的要求更。所以如果你們中的任何人都可以給出一個除maxPoolSize違規外的理由,那麼請這樣做。

我們現在第二次面臨這個問題,以前我們已經嘗試過增加maxPoolSize,但15天后我們再次遇到這種情況,每天大約有5000到8000次。

更新:

這是異常的全部堆棧跟蹤:在從隊列/讀出處理的消息 org.springframework.core.task.TaskRejectedException發生

一般例外: Executor [[email protected]]不接受任務:[email protected] at org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor.execute(ThreadPoolTask​​Executor.java:244) 在com.batman.rapid.rapidserver.sla.JmsTicketReceiver.onMessage(JmsTicketReceiver.java:58) 在org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:560) 在org.springframework.jms。 listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:498) 在org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467) 在org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java: 325) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263) at org.springfram ework.jms.listener.DefaultMessageListenerContainer $ AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058) 在org.springframework.jms.listener.DefaultMessageListenerContainer $ AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050) 在org.springframework.jms.listener。使用DefaultMessageListenerContainer $ AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947) 在java.lang.Thread.run(Thread.java:662) 產生的原因:在java.util.concurrent.ThreadPoolExecutor中的$ AbortPolicy java.util.concurrent.RejectedExecutionException .rejectedExecution(ThreadPoolExecutor.java:1774) at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:768) at java.util.concurrent.ThreadPoolExecutor.ex ecute(ThreadPoolExecutor.java:656) at org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor.execute(ThreadPoolTask​​Executor.java:241) ...10多

這是相關代碼:

if (message instanceof TextMessage) 
{ 
    textMessage = (TextMessage) message; 
    ticketReaderThreadPool.execute(new TicketHandler(textMessage.getText())); 
} 

下面是請求的配置:

<!-- End of JMS Queue Support --> 

    <bean id="ticketReaderThreadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" scope="singleton" destroy-method="destroy"> 
    <property name="corePoolSize" value="10" /> 
    <property name="maxPoolSize" value="150" /> 
    <property name="queueCapacity" value="11000" /> 
</bean> 

    <bean id="notificationThreadPool" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" scope="singleton" destroy-method="destroy"> 
      <property name="corePoolSize" value="10" /> 
      <property name="maxPoolSize" value="100" /> 
      <property name="queueCapacity" value="10000" /> 
    </bean> 

    <bean id="notificationManager" class="com.batman.rapid.rapidserver.sla.scheduler.NotificationManager" scope="singleton"> 
      <property name="defaultPercent" value="80"></property> 
    </bean> 

    <bean id="dbUpdateThreads" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" scope="singleton" destroy-method="destroy"> 
      <property name="corePoolSize" value="1" /> 
      <property name="maxPoolSize" value="100" /> 
      <property name="queueCapacity" value="10000" /> 
    </bean> 
+0

我們可以看到完整的JMS配置中的任何鎖? –

+0

我沒有得到你。請提供您的要求的詳細信息。 –

+0

我們希望看到相關的spring jms配置文件。 –

回答

1

不知道什麼是真正的原因。不過,我強烈地感覺到,最大消息數可能會超出您設置的maxqueueCapacity。但是,您使用的各種方法與JMS的一般用法不同。通常在DefaultMessageListener中,我們配置並行處理異步處理的最大消費者數量。基於服務器的資源,我們配置的最大消費者是服務器可以處理

不過你的情況從DefaultMessageListener消息被閱讀併產生新的線程,並在新的線程中執行業務邏輯。由於消息監聽器的讀取速度比業務邏輯快,因此任務會累積到線程任務隊列中。

我建議重新接近當前的實現。因爲它不支持交易。我的意思是當服務器崩潰時,任務中的所有掛起的消息處理將被終止/丟失,並且由於您將設置自動確認,消息將從隊列中移除。其他問題喜歡手動設置限制線程隊列等

最後回到你的問題,你可以做一個快速檢查是否有在150個線程您設置了