2012-12-04 93 views
1

我想在自定義線程池/執行程序服務上運行一些作業。在自定義線程池上運行作業

原因是我有很多可能壓倒正常工作池的工作,所以我想將它們分離到專用池中。

我試圖創建一個新的ExecutorService並在其上運行的作業:

public static <T> F.Promise<T> runJobWithExecutor(ExecutorService executor, final Job<T> job) { 
    final F.Promise<T> promise = new F.Promise<T>(); 
    executor.submit(new Callable<T>() { 
     public T call() throws Exception { 
      T result = job.call(); 
      promise.invoke(result); 
      return result; 
     } 
    }); 
    return promise; 
} 

,但我得到不同的JPA錯誤:

一個SQLException是由以下故障引起: 的Java。 lang.InterruptedException [原因:java.lang.InterruptedException at java.lang.Object.wait(Native Method)at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1315) 在 com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) 在 com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) 在 com.mchange.v2。 c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 在 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 在 org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider。 getConnection(InjectedDataSourceConnectionProvider.java:71) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction的.java:81) 在 org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473) 在org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:60)在 play.db.jpa。 JPAPlugin.startTx(JPAPlugin.java:350)at play.db.jpa.JPAPlugin.beforeInvocation(JPAPlugin.java:318)at play.plugins.PluginCollection.beforeInvocation(PluginCollection.java:428) at play.Invoker $ Invocation.before(Invoker.java:217)at play.jobs.Job.call(Jo b.java:139)at org.commercesciences.play.Jobs3 $ 1.call(Jobs3.java:16)at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:334)at java.util .concurrent.FutureTask.run(FutureTask.java:166)在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java: 603) 在java.lang.Thread.run(Thread.java:722)

有什麼更多的,我需要以運行在單獨的線程工作要做?

我使用的是1.2.4-mbknor-3。

回答

1

幾件事涉及到你的問題的上下文(即使不是對它的直接回應)。

1)。 嘗試更改最大隊列大小。

int maxThreads = 50; 
int queueSize = 1000; // should be big enough! 
ExecutorService newExecutor = new ThreadPoolExecutor(maxThreads, maxThreads, Long.MAX_VALUE, TimeUnit.NANOSECONDS, new ArrayBlockingQueue<Runnable>(queueSize, true)); 

2)。 此外,就性能而言,如果您不需要Hibernate,請考慮使用Callable而不是Job - play!的作業本質上是非常重的,它根據需要初始化Hibernate和其他插件。

相關問題