0

我正在尝试使用 JBeret 实现收集可能需要大约 5 天才能完成的大量数据。我们正在使用带有子系统(jberet)的 Wildfly 10.1.0 应用程序服务器作为内存作业存储库运行提取。

我将用于从数据库收集数据的块过程和用于压缩过程的批处理作为单个作业 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)

如果数据库中遇到任何异常问题,是否有可能暂停所有线程并将其恢复,以便我们可以从数据库中清除垃圾。

谢谢。

4

1 回答 1

0

您可以尝试使用threadpoolexecutor运行您的工作负载(当前是批处理) 。

首先设置一个线程threadpoolexecutor。然后,您需要一个线程来监控数据库运行状况(CPU、内存,任何您认为有用的东西)。根据运行状况,它将增加或减少线程池中的线程数量。

然后你将你的工作负载作为 Runnables 分配给 threadpoolexecutor,它会尝试使用所有可用线程来处理 Runnables 队列。

我知道这种方法不使用 JSR-352,但至少您可以控制并行工作的数量。您甚至可能会想,如果在所有线程都在使用时减少线程数会发生什么。应该杀死其中一个还是应该优雅地减少线程?

于 2020-12-01T20:10:42.813 回答