在 Spring 中创建工人

我正在编写一个带有 spring(mvc,data,security) 的网络服务器,它为物理设备提供任务(设备数量约为 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,因此内部的 worker 可以保存任务的结果。


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


这种方法有意义吗?也许有更好的方法来使用弹簧组件而不是线程来做到这一点。


慕妹3242003
浏览 104回答 2
2回答

芜湖不芜

我不会为每个设备(客户端)创建工作人员。因为您的控制器将能够为部署在基于每个请求线程的服务器上的并发请求提供服务。此外,这根本不是可扩展的——如果有一个新设备板载怎么办?您需要对数据库进行更改,以当前设计重新启动服务!如果您需要特定于设备的操作,您可以将其传递给来自设备客户端的请求参数。因此,没有必要保留一组预定义的工人。所以,设计看起来不错,除了工人集。

幕布斯7119047

在你的函数上使用 @Scheduled 注释来构建类似 cron 的东西
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java