我正在用 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,它在一定周期内从数据库获取下一个任务(通过 sleep 循环)。当任务执行时,worker 将结果保存到数据库并更新任务状态。
这种方法有意义吗?也许有更好的方法使用 spring 组件而不是 Thread 来做到这一点。
最佳答案
我不会为每个设备(客户端)创建工作人员。因为您的 Controller 将能够为部署在基于每个请求线程的服务器上的并发请求提供服务。此外,这根本不可扩展——如果板上有新设备怎么办?您需要对数据库进行更改,使用当前设计重新启动服务!!
如果您需要设备特定的操作,您只需将其传递到设备客户端的请求参数即可。因此,无需保留一组预定义的工作人员。
所以,除了工作组之外,设计看起来不错。
关于java - 在 Spring 中创建 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54322474/