在春季创造工人

时间:2019-01-23 08:00:33

标签: java spring spring-mvc

我正在编写一个带有spring(mvc,data,security)的Web服务器,该服务器为物理设备(设备数量大约为100)提供服务。 设备内部没有查询实现。例如,要执行某些任务,您需要编写如下内容:

Device driver = new DeviceDriver();
driver.setSettings(settingsJson);
driver.open(); // noone else can't connect to this device, open() can take up to 1 second
driver.setTask(taskJson);
driver.processTask(); // each task takes a few seconds to execute
String results = driver.getResults();
driver.close();

我并不是真正的体系结构设计专家,所以对于现在实现的网络服务器,如下所示:

TaskController (@ RestController)-处理带有任务的传入Post请求,并将其持久化到数据库中。

DeviceService (@ Service)-具有init方法,该方法从数据库获取设备列表,并为每个设备创建/启动一个工作进程。它将taskRepository传递给每个工作人员,因此内部工作人员可以保存任务结果。

Worker -扩展 Thread ,它从数据库中获取一定时间的下一个任务(通过带睡眠的循环)。执行任务时,工作程序将结果保存到db并更新任务状态。

这种方法有意义吗?也许有更好的方法使用spring组件而不是Thread。

2 个答案:

答案 0 :(得分:1)

我不会为每个设备(客户端)创建工作者。因为您的控制器将能够为基于每个请求线程的服务器上部署的并发请求提供服务。此外,这根本无法扩展-如果板上有新设备怎么办?您需要对数据库进行更改,以当前设计重新启动服务!

如果需要设备特定的操作,则可以将其传递给设备客户端的请求参数。因此,无需保留一组预定义的工人。

因此,除工作集外,设计看起来还不错。

答案 1 :(得分:0)

在你的函数上使用@Scheduled 注释来构建类似 cron 的东西