我正在将您的optaplanner
用作医生调度系统。
我有一个问题要问你
我使用optaplanner作为后端系统,将XML文件通过PHP传递给optaplanner,然后由optaplanner将计算出的XML结果返回给PHP后端系统。现在,我希望医生能够实时查看网页中的更改。我可以实现吗?这是为了使optaplanner能够实时生成XML文件,而不是生成最后计算出的XML文件。
答案 0 :(得分:2)
是可以的,但是可能需要您稍微改变一下体系结构。
要将结果从服务器发送到客户端(用户的浏览器),您要使用网络套接字。
Optaplanner具有SolverEventListener,每次最佳解决方案更改时都会被调用。您可以做的是每次在侦听器中调用bestSolutionChanged时,都通过websocket发送解决方案。出于性能原因,您可能希望websocket发送请求是非阻塞操作,并且解决方案的序列化应该快速进行。您可能还希望在每个webocket发送请求/ bestSolutionChanged调用之间包含最短时间,因为一开始Optaplanner可能会经常找到新的最佳解决方案。
我不知道您将如何在PHP中执行此操作,但通常对于此类实时应用程序vert.x非常适合我(optaplanner解决方案的计算是在工作程序中进行的,新的解决方案是通过sockjs eventbus网桥通过eventbus发送)
答案 1 :(得分:1)
我主要按照Alex G的描述来实现它。
由于我们的解决方案可能变得非常庞大,所以我只是发出一个websocket事件,说明有一个新的最佳解决方案可用,让应用程序请求该解决方案,而不是每次找到新的最佳解决方案时都要序列化并推送完整的解决方案。
要获取xml:
如果我必须这样做(我更喜欢使用json,因为它更小并且更容易在javascript前端中进行处理),我的方法将是以下步骤:
1)创建一个SolverEventListener类
class SolverEventListenerImpl implements SolverEventListener<ProblemSolutionClass> {...
2)在事件求解器中注册eventListener
solver.addEventListener(new SolverEventListenerImpl());
3)覆盖bestSolutionChanged方法
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);
你在那里。