我正在尝试收集使用JBeret实现可能需要大约5天完成的大量数据。我们使用带有子系统(jberet)的Wildfly 10.1.0 Application Server作为内存中的作业存储库来运行提取。
我将用于从数据库和batchlet收集数据的块进程用于压缩过程,作为单个作业ID下的两个步进过程。
此外,我正在使用多线程运行提取,这意味着我们使用10个线程并行收集数据。
由于数据库缓慢/内存问题面临作业失败异常。
2018-01-07 00:49:24,999 ERROR [org.jberet] (Batch Thread - 8) JBERET000007: Failed to run job simple-batchlet-job, step1, org.jberet.job.model.Chunk@3f63b3dd: javax.transaction.RollbackException: ARJUNA016102: The transaction is not active! Uid is 0:ffffac1d2026:37db6cf6:5a4f7329:49355
at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1190)
at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
如果数据库中出现任何异常问题并且将其恢复,以便我们可以清除数据库中的垃圾,是否有可能暂停所有线程。
感谢。
答案 0 :(得分:0)
您可以尝试使用threadpoolexecutor运行您的工作负载(当前为批处理)。
首先设置一个线程threadpoolexecutor。然后,您需要一个线程来监视数据库的运行状况(CPU,内存,任何您认为有用的东西)。根据运行状况,它会增加或减少线程池中的线程数量。
然后,将工作负载作为Runnables分配到threadpoolexecutor中,该线程将尝试使用所有可用线程来处理Runnables队列。
我知道这种方法不使用JSR-352,但至少您可以控制并行工作量。您甚至可能会认为,如果在使用所有线程时减少线程数,将会发生什么情况。应该杀死其中之一还是应该减少线程数量?