我正在努力解决一个问题。问题陈述是同时启动多线程。每个线程的职责是从DB中获取记录。每条记录都有groupID。这意味着如果我们获得包含10个不同GroupID的100000条记录,那么将创建10个文件,每个文件中包含相应数量的记录。现在我们需要将所有这10个文件发送到10个不同的来源。
如何在Springs中配置相同的?应该使用哪种设计模式。如果您有任何示例,请告诉我。
我正在使用属性文件来提供SQL语句,它将返回Result set,然后将它们存储在临时文件中。我通过电子邮件发送这些文件。但是我无法通过groupID和不同的邮件进行隔离。
答案 0 :(得分:0)
您可以通过多种方式完成此操作。我会建议你两个:
1)使用Spring Boot Batch Application,您可以轻松处理记录的多线程批处理并将其写入文件。
2)使用简单的Executor Service使其成为多线程。
一些建议:
不要写入从DB读取的每条记录上的文件。而是使用所有线程共享的同步Map<GroupId, List<Record>> map
,并在使用上述映射基于GroupId进行隔离时最终写入文件。
如果您希望根据任何参数对记录进行排序,请使用SortedList<Record>
。
如果记录数量很大,你可以用chucks写入文件,例如每次读取10000条记录时写入,然后清空地图并重新开始。
< / LI>PS:这可能不是最好的方法,但这就是我要解决这个问题陈述的方法。希望这会有所帮助。
答案 1 :(得分:0)
HI Guyz感谢您的帮助和建议。我尝试将你的想法与风险较低的方式相结合。
我的问题是运行了多个线程,这些线程从数据库获取数据并根据组ID填充文件。 **来自DB的组ID也可以在多个线程中使用,我也需要具有组ID数据的文件,但是2个或更多线程数据不应该转储到1个文件中。所以我遵循以下方法。
Abstract_DAO | V Abstract_Handler | V Thread_1_Handler_IMPL Thread_2_Handler_IMPL ....
发布线程启动后,我将从JSON / Properties文件中获取每个组ID的所有属性。地图。使用此地图&#34; PropClass&#34;在运行时用于获取writer / file / email / email_text / cc / file_temp_location。此外,对于每个线程,我将提供一个单独的临时位置,以便文件不会相互引用。此映射是并发的,并且已在多个线程中使用。通过这种方式,我每天可以从2000万客户的数据库中生成500000个报告。
如果我们可以即兴发挥这种方法,请告诉我。
答案 2 :(得分:-1)
如果我们分解问题,下面是我们要执行的步骤。
这些#1&amp; 2可以通过主线程执行的SQL来完成。 任务#3&amp; 4,可以通过为每个groupId生成一个工作线程来完成。 您可以使用BlockingQueue来放置将由工作线程使用的记录。
如何在Springs中配置相同的? 您可以使用Spring Batch Application。
应该使用哪种设计模式。 我建议,生产者/消费者设计模式。 http://javarevisited.blogspot.in/2012/02/producer-consumer-design-pattern-with.html