我正在使用你的optaplanner作为医生日程安排系统。
我有个问题要问你:
我使用optaplanner作为后端系统,通过PHP将XML文件传递给optaplanner,并由optaplanner将计算出的XML结果返回给PHP后端系统。现在我想让医生实时看到网页上的变化。我能让它发生吗?它使optaplanner能够实时生成XML文件,而不是生成最终计算的XML文件。
发布于 2018-07-16 21:38:21
是的,这是可能的,但它可能需要您更改一下您的架构。
为了将结果从服务器发送到客户端(用户的浏览器),您需要使用websockets。
Optaplanner有一个SolverEventListener,每当最佳解决方案发生变化时都会调用它。您可以做的是每次在侦听器中调用bestSolutionChanged时通过websocket发送解决方案。出于性能原因,您可能希望websocket发送请求是非阻塞操作,并且解决方案的序列化应该很快发生。您可能还希望包含每个webocket send request/ best bestSolutionChanged调用之间的最短时间,因为在开始时Optaplanner可能会经常找到新的最佳解决方案。
我不知道你是如何在PHP中做到这一点的,但一般来说,对于这种类型的实时应用程序,vert.x非常适合我( optaplanner解决方案的计算是在worker verticle中处理的,新的解决方案通过sockjs eventbus桥通过eventbus发送出去)
发布于 2018-07-19 16:34:11
我主要是像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);原来你在这儿啊。
https://stackoverflow.com/questions/51357868
复制相似问题