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

Using the same thread for other database operations after it has finished processing

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

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

场景是数据库中有一个名为 status 的列 table,如果该记录被 web 服务接受,则该记录的状态列将设为 1,否则为 0。

现在,当线程 1 处理完 ID 为 1 到 1000 的记录而线程 2 仍在处理 1001 到 2001 时,问题就出现了。假设 ID 为 5 到 30 和 40 到 50 的记录状态为 0,即未传送到 Web 服务.现在我的场景要求线程已经完成处理,即 Thread1 应该开始处理 ID 为 5 到 30 和 40 到 50 的记录,并尝试将记录中的消息重新传送到 Web 服务。

我正在使用 ExecutorService 编写相同的代码,如何实现上述内容。

您可以使用共享阻塞队列,其中充满了您需要处理的记录(这意味着您 select 那 30000 条记录位于 ExecutorService 线程之外的某处)。

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

您需要在您的记录中添加投递计数器,并检查邮件是否被重新投递了有限的次数(因此如果它们格式不正确,它们不会永远被重新投递)。