我正在开发一个独立的java应用程序,它通过网络从大约1000个测量设备收集数据并将数据保存到数据库。 由于设备输出速度和/或网络速度较慢,数据收集每个设备可能需要几分钟的时间。数据收集必须在一定的时间窗口内进行,所以我需要并行工作。Java并发/联网方法
我的方法是为每个测量设备创建一个线程,将数据放入队列中,并在队列的另一端有一个或多个其他线程转换并保留数据。
这是一种可行的方法吗?现代机器能够处理多线程和网络连接吗?这是多大的可扩展性,在什么时候我需要在几台机器上工作?
如果你能给我关于你会推荐的concurreny类的指针(即什么样的队列,ThreadPoolExecutor等 - 我还没有使用java.util.concurrent,书本在邮件中) 。
有没有更好的方法?
UPDATE:
感谢您的答案至今,这里是一些你要求的更多信息。
我从设备收到的数据是小于1kb的文件形式。在一次传输过程中,我可能会得到类似于25.000个文件的内容,尽管通常它少得多。
数据转换不是cpu密集型的,基本上解析文件并将其转换为java数据类型(该文件包含像unsigned char和unix时间戳这样的c数据类型)以及CRC计算。我创建了一个包含一个文件内容的对象,我使用JPA将其保存到数据库中(我想我也可以在这种情况下使用普通的JDBC)。测量文件中没有顺序,因为它们包含设备的序列号和时间戳。
在稍后的时间点,当满足某些条件时,我将不得不添加某种警报,但这不应该是cpu密集型的。
从答案到目前为止我收集的网络连接和线程数应该不成问题。
我唯一想知道的是关于队列的方法。另一种方法是让数据收集线程也调用DAO方法来保存文件。我想我必须尽可能使DAO线程安全,但我认为有几个线程也可以完成这项工作,因为大部分时间将用于传输网络数据。
另外我会研究异步I/O和一些提供它的框架。再次
谢谢,我会在稍后选择一个答案,也许我会得到一些更多的输入:)
“放在一个队列中的数据” - 你要摆在那排队什么样的数据? –