optaplanner护士排班系统中的XML文件可以与前台实时交互



我正在使用您的optaplanner作为医生调度系统。

我有一个问题要问你:

我使用optaplanner作为后端系统,通过PHP将XML文件传递给optaplaner,并通过optaplanger将计算出的XML结果返回给PHP后端系统。现在我想让医生实时看到网页上的变化。我能做到吗?它使optaplanner能够实时生成XML文件,而不是生成在最后计算的XML文件。

是的,这是可能的,但可能需要对架构进行一些更改。

要将结果从服务器发送到客户端(用户的浏览器(,您需要使用websocket。

Optaplanner有SolverEventListener,每当最佳解决方案发生变化时都会调用它。您可以做的是,每次在侦听器中调用bestSolutionChanged时,都通过websocket发送解决方案。出于性能原因,您可能希望websocket发送请求是非阻塞操作,并且解决方案的序列化应该快速进行。您可能还希望在每次webocket发送请求/bestSolutionChanged调用之间包含最短的时间,因为在一开始,Optaplanner可能会经常找到新的最佳解决方案。

我不知道你会如何在PHP中做到这一点,但通常情况下,对于这种类型的实时应用程序,vert.x非常适合我(optaplanner解决方案的计算是在垂直工作者中处理的,新的解决方案是通过sockjs事件总线桥通过事件总线发送的(

我主要像Alex G描述的那样实现它

由于我们的解决方案可能会变得很大,我只是发送一个websocket事件,表示有一个新的最佳解决方案可用,并让应用程序请求该解决方案,而不是每次找到新的最佳方案时都序列化和推送完整的解决方案。

获取xml:

如果必须这样做(我更喜欢json,因为它更小,更容易在javascript前端处理(,我的方法将是以下步骤:

1( 创建SolverEventListener类

class SolverEventListenerImpl implements SolverEventListener<ProblemSolutionClass> {... 

2( 在求解器中注册eventListener

solver.addEventListener(new SolverEventListenerImpl());

3( 覆盖最佳解决方案更改方法

public void bestSolutionChanged( BestSolutionChangedEvent<ProblemSolutionClass> event) {      
ProblemSolutionClass solution = event.getNewBestSolution();

4( 将其转换为XML-例如,使用Optaplanner 中已经存在的Xstream内容

XStream xStream = new XStream();
xStream.setMode(XStream.ID_REFERENCES);
xStream.processAnnotations(xStreamAnnotatedClasses);
String xml = xstream.toXML(solution);

你来了。

最新更新