我想在自定义线程池/执行器服务上运行一些作业。
原因是我有很多工作可能会压倒正常的工作池,所以我想将它们分成一个专用池。
我尝试创建一个新的 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 [原因:com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java) 处的 java.lang.Object.wait(Native Method) 处的 java.lang.InterruptedException :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) at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java: 71) 在 org.hibernate.jdbc。ConnectionManager.openConnection(ConnectionManager.java:446) 在 org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) 在 org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160) 在 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(Job.java:139) at org.commercesciences.play.Jobs3$1.call(Jobs3.java:16) at java.util.concurrent.FutureTask $Sync.innerRun(FutureTask.java:334) 在 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)
为了在单独的线程上运行作业,我还需要做些什么吗?
我正在使用 play 1.2.4-mbknor-3。