2012-02-04 33 views
1

我是JAVA中的多線程的新手,並且遇到問題。我得到一個異常,說一個睡眠線程正在中斷,導致與db的連接丟失

java.lang.InterruptedException:睡眠中斷

這個如下,以連接到數據庫的損失。我無法確定哪裏出了問題。它看起來像後,線程中斷,他們正在重新初始化,但不入門..

以下是我的run方法

public void run() { 
     LOG.info("Started"); 
     running = true; 
     while (running) { 
      Lock readLock = readWriteLock.readLock(); 
      readLock.lock(); 
      long loopDelay; 
      try { 
       loopDelay = executor.execute(); 
       if (loopDelay > 0) { 
        Thread.sleep(loopDelay); 
       } 
      } catch (Exception e) { 
       LOG.info("Executor Interrupted", e); 
       break; 
      } finally { 
       readLock.unlock(); 
      } 
     } 
     LOG.info("Stopped"); 
    } 

可能的解決方案:通過大衛建議的鏈接會後我覺得這裏的問題與David提到的相同,即「線程在睡眠時無法處理中斷。」所以爲了解決這個問題,我應該以更好的方式處理Interrrupted Exception,例如david的建議。

以下是我的堆棧跟蹤。有的一個可以幫我理解這個問題

2012-02-03 10:38:09,260 150696427 [taskDiscoveryCallExecutorThread] INFO (TaskExecutorThread.java:89) - Executor Interrupted 
    java.lang.InterruptedException: sleep interrupted 
     at java.lang.Thread.sleep(Native Method) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutorThread.run(TaskExecutorThread.java:86) 
    2012-02-03 10:38:09,261 150696428 [taskDiscoveryCallExecutorThread] INFO (TaskExecutorThread.java:95) - Stopped 
    2012-02-03 10:38:09,261 150696428 [main] INFO (TaskExecutorThread.java:69) - shutdown 
    2012-02-03 10:38:09,262 150696429 [taskRuleExecutorThread] ERROR (JDBCExceptionReporter.java:101) - Cannot get a connection, general error 
    2012-02-03 10:38:09,262 150696429 [taskRuleExecutorThread] ERROR (JDBCExceptionReporter.java:101) - Cannot get a connection, general error 
    2012-02-03 10:38:09,294 150696461 [taskRuleExecutorThread] DEBUG (EventScope.java:107) - Destroy scope for customer c02c5ac7-8dee-42aa-b344-ff7f7f6894f5 
    2012-02-03 10:38:09,294 150696461 [taskRuleExecutorThread] ERROR (TaskExecutor.java:205) - Catch exception 
    org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; Cannot get a connection, general error; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, general error 
     at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) 
     at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
     at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
     at org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424) 
     at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:410) 
     at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411) 
     at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
     at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1046) 
     at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1039) 
     at com.xyz.abc.web.dao.RuleDao.loadActive(RuleDao.java:53) 
     at com.xyz.abc.web.service.RuleServiceImpl.createRulesByTemplate(RuleServiceImpl.java:39) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
     at $Proxy60.createRulesByTemplate(Unknown Source) 
     at com.xyz.abc.rules.RulesInvoker.checkIsInitialized(RulesInvoker.java:97) 
     at com.xyz.abc.rules.RulesInvoker.invokeForEvent(RulesInvoker.java:73) 
     at com.xyz.abc.mdp.RabbitMqMessageProcessor.processMessage(RabbitMqMessageProcessor.java:53) 
     at sun.reflect.GeneratedMethodAccessor101.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:186) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutor.invokeMethod(TaskExecutor.java:156) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutor.invokeBean(TaskExecutor.java:139) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutor.doExecute(TaskExecutor.java:116) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutor.executeTask(TaskExecutor.java:104) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutor.access$200(TaskExecutor.java:39) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutor$1.doInTransaction(TaskExecutor.java:85) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutor$1.doInTransaction(TaskExecutor.java:79) 
     at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutor.execute(TaskExecutor.java:79) 
     at com.xyz.abc.backgroundtask.impl.TaskExecutorThread.run(TaskExecutorThread.java:84) 
    Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, general error 
     at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:118) 
     at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
     at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81) 
     at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) 
     at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) 
     at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) 
     at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1596) 
     at org.hibernate.loader.Loader.doQuery(Loader.java:717) 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270) 
     at org.hibernate.loader.Loader.doList(Loader.java:2294) 
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172) 
     at org.hibernate.loader.Loader.list(Loader.java:2167) 
     at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119) 
     at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706) 
     at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347) 
     at org.springframework.orm.hibernate3.HibernateTemplate$36.doInHibernate(HibernateTemplate.java:1056) 
     at org.springframework.orm.hibernate3.HibernateTemplate$36.doInHibernate(HibernateTemplate.java:1) 
     at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
     ... 33 more 
    Caused by: java.lang.InterruptedException 
     at java.lang.Object.wait(Native Method) 
     at java.lang.Object.wait(Object.java:485) 
     at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104) 
     at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 
     ... 50 more 
    2012-02-03 10:38:09,399 150696566 [taskRuleExecutorThread] INFO (TaskExecutor.java:93) - org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only 
2012-02-03 10:38:09,399 150696566 [taskRuleExecutorThread] INFO (TaskExecutorThread.java:89) - Executor Interrupted 
java.lang.InterruptedException: sleep interrupted 
    at java.lang.Thread.sleep(Native Method) 
    at com.xyz.abc.backgroundtask.impl.TaskExecutorThread.run(TaskExecutorThread.java:86) 
2012-02-03 10:38:09,399 150696566 [taskRuleExecutorThread] INFO (TaskExecutorThread.java:95) - Stopped 
2012-02-03 10:38:09,400 150696567 [main] INFO (TaskExecutorThread.java:69) - shutdown 
2012-02-03 10:38:09,400 150696567 [taskParatureExecutorThread] INFO (TaskExecutorThread.java:89) - Executor Interrupted 
java.lang.InterruptedException: sleep interrupted 
    at java.lang.Thread.sleep(Native Method) 
    at com.xyz.abc.backgroundtask.impl.TaskExecutorThread.run(TaskExecutorThread.java:86) 
2012-02-03 10:38:09,400 150696567 [taskParatureExecutorThread] INFO 

(TaskExecutorThread.java:95) - Stopped 
2012-02-03 10:38:09,400 150696567 [main] INFO (TaskExecutorThread.java:69) - shutdown 
+0

你需要提供你的程序的一些源代碼,然後我們可以看到那裏發生了什麼。 – gprathour 2012-02-04 07:18:59

+0

嗨GPS我仍然試圖找出代碼的哪個部分導致此線程中斷,什麼情況導致此中斷。這種中斷是非常零星..我沒有總是得到這個錯誤..但不知道有關代碼將盡快將代碼放在代碼拋出此異常 – 2012-02-04 07:31:09

回答

12

一個線程,而它的睡覺不能處理中斷。所以當線程退出睡眠狀態並處理中斷時,您需要捕獲異常。該方法在this answer中有很好的解釋。通常它看起來是這樣的:

try 
    { 
     Thread.sleep(whatever); 
    } 
    catch (InterruptedException e) 
    { 
     Thread.currentThread().interrupt(); // restore interrupted status 
    } 
+0

謝謝大衛爲我指向類似的問題..由於我是多線程新手,這種討論有助於理解..我無法找到這樣的討論 – 2012-02-04 07:27:45

1

你在你的代碼某處拋出異常中斷的可能信號,一個線程應該停止?你能提供這種方法的代碼:

com.xyz.abc.backgroundtask.impl.TaskExecutorThread.run 
+0

感謝尤金我會這麼做..我更新了我的問題 – 2012-02-04 12:08:48

+0

嗨尤金我已經用run方法更新了問題並且也更新了我的理解......你能幫忙嗎? – 2012-02-04 13:38:27