2

カスタムスレッドプール/エグゼキュータサービスでいくつかのジョブを実行したいと思います。

その理由は、通常のジョブプールを圧倒する可能性のあるジョブがたくさんあるので、それらを専用のプールに分割したいと思います。

新しい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(ネイティブメソッド)のjava.lang.InterruptedException 1315)com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)atcom.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 71)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)at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:60)atplay.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)at java.util.concurrent.FutureTask.run(FutureTask.java:166)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor .java:603)at java.lang.Thread.run(Thread.java:722)

別のスレッドでジョブを実行するために必要なことは他にありますか?

私はplay1.2.4-mbknor-3を使用しています。

4

1 に答える 1

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 が必要ない場合は、Job の代わりに Callable を検討してください - play! の Job は本質的に非常に重いため、必要に応じて Job ごとに Hibernate やその他のプラグインを初期化します。

于 2012-12-05T11:38:36.850 に答える