2011-04-18 123 views
0

我有一個企業事件驅動的應用程序。 我有16個從JMS隊列讀取的MDB。當我得到了一些失控的例外,我收到這個棧:MDB在此異常後停止工作

####<Apr 18, 2011 11:47:15 AM CEST> <Error> <WebLogicServer> <sapmop11> <cont0Server11> <[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1303120035886> <BEA-000337> <[STUCK] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)' h 
as been busy for "647" seconds working on the request "[email protected]", which is more than the configured time (StuckThreadMaxTime) of "600" seconds. Stack trace: 
     java.lang.Thread.sleep(Native Method) 
     weblogic.ejb.container.internal.JMSPollerManager.waitForPollersToStop(JMSPollerManager.java:82) 
     weblogic.ejb.container.internal.JMSConnectionPoller.waitForMessagePollerExit(JMSConnectionPoller.java:795) 
     weblogic.ejb.container.internal.JMSConnectionPoller.disconnect(JMSConnectionPoller.java:920) 
     weblogic.ejb.container.internal.MDConnectionManager.timerExpired(MDConnectionManager.java:166) 
     weblogic.timers.internal.TimerImpl.run(TimerImpl.java:273) 
     weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:516) 
     weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) 
     weblogic.work.ExecuteThread.run(ExecuteThread.java:173) 
> 
####<Apr 18, 2011 11:48:15 AM CEST> <Error> <WebLogicServer> <sapmop11> <cont0Server11> <[ACTIVE] ExecuteThread: '9' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1303120095935> <BEA-000337> <[STUCK] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)' h 
as been busy for "707" seconds working on the request "[email protected]", which is more than the configured time (StuckThreadMaxTime) of "600" seconds. Stack trace: 
     java.lang.Thread.sleep(Native Method) 
     weblogic.ejb.container.internal.JMSPollerManager.waitForPollersToStop(JMSPollerManager.java:82) 
     weblogic.ejb.container.internal.JMSConnectionPoller.waitForMessagePollerExit(JMSConnectionPoller.java:795) 
     weblogic.ejb.container.internal.JMSConnectionPoller.disconnect(JMSConnectionPoller.java:920) 
     weblogic.ejb.container.internal.MDConnectionManager.timerExpired(MDConnectionManager.java:166) 
     weblogic.timers.internal.TimerImpl.run(TimerImpl.java:273) 
     weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:516) 
     weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) 
     weblogic.work.ExecuteThread.run(ExecuteThread.java:173) 
> 

這一切的多邊開發銀行停止從隊列中讀取後,應用程序需要重新啓動。

這是MDB的onMessage代碼:

@Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void onMessage(Message message) { 
     OnlineEventMessage<? extends Serializable> eventMessage = null; 
     try { 
      TextMessage textMessage = (TextMessage) message; 
      String stringMessage = textMessage.getText(); 

      logger.debug("e' stato ricevuto il messaggio {}", stringMessage); 
      logger.debug("eventMessageParser {}", onlineEventMessageParser); 
      logger.debug("legacyEventMessageService {}", legacyEventMessageService); 

      EventMessageAnagrafica anagrafica = anagraficaParser.parse(stringMessage, true); 
      String multichannelId = anagrafica.getMultichannelId(); 

      eventMessage = onlineEventMessageParser.parse(stringMessage, true); 

      MDC.put("multichannelId", multichannelId); 
      MDC.put("eventType", eventMessage.getEventType().getEventCode()); 
      legacyEventMessageService.handle(eventMessage); 
     } catch (JMSException e) { 
      retryJmsTemplate.send(destination, new RedeliveryMessageCreatorUtil(message)); 
      logger.error("si e' verificato un errore JMS nel processamento dell'evento {}, riaccodamento in corso...", e); 
     } catch (RuntimeException e) { 
      logger.error("si e' verificata una runtime exception per il messaggio {}", e); 

      legacyErrorHandlerService.handle(eventMessage); 

     } catch (Exception e) { 
      logger.error("si e' verificato un errore inaspettato per il messaggio {}", e); 
      if (eventMessage != null && eventMessage.getIdEventMessage() != null) { 
       logger.error("Il messaggio gia' presente nelle catene di elaborazione"); 
       OnlineEventMessage<?> onlineMessage = eventMessageDao.getItemByID(eventMessage.getIdEventMessage()); 
       if (onlineMessage != null) { 
        onlineMessage.setEventState(EventState.PROCESSING_ERROR); 
        eventMessageDao.updateItem(onlineMessage); 
        eventMessageDao.flush(); 
       } 
      } 
      context.setRollbackOnly(); 
     } 
    } 

任何想法? 親切的問候 Massimo

回答

0

這似乎是一個交易問題。下次嘗試進行線程轉儲並查看線程正在執行的操作。您可以通過管理控制檯執行此操作。