完成处理后,使用相同的线程进行其他数据库操作

时间:2016-10-11 08:56:43

标签: java multithreading hibernate oracle11g batch-processing

我正在编写一个hibernate应用程序,它涉及对存储的记录进行批处理。

假设数据库表中存储了30000条记录,并且我使用了30个线程。每个线程并行处理1000个记录,即逐批处理。 Thread1处理1到1000 Thread2:1001到2001等。这里的处理意味着我正在批量执行所有这些操作。我正在处理这些记录,通过解析它们将它们发送到Web服务。

方案是数据库表中有一个名为status的列,如果webservice接受了记录,则记录的status列为1,否则为0。

现在问题出现在Thread1完成处理id为#1到1000且线程2仍在处理1001到2001的记录时。假设id为5到30且40到50状态的记录是0即未送达网络服务。现在我的场景需要已经完成处理的线程,即Thread1应该开始处理id为5到30和40到50的记录,并尝试将记录中的消息重新发送到webservice。

我正在使用ExecutorService进行相同的编码,如何实现上述目标。

1 个答案:

答案 0 :(得分:1)

您可以使用共享阻塞队列,该队列填充了您需要处理的记录(这意味着您在ExecutorService个线程之外的某处选择了30000条记录)。

然后,在您的Thread代码中,每个帖子从队列中获取前1000条(using this method)条记录并进行处理。这是重要的部分:Web服务拒绝的记录被放回队列 - 所以当另一个执行程序线程可用时,它将选择未传递的。

您需要在记录中添加递送计数器,并检查邮件是否重新递送有限次数(因此如果它们以某种方式格式错误,则不会永远重新发送)。