我在IBM Domino中构建了一个Java代理,它可以通过HTTP POST接收xml。现在在代理中,当我成功创建一个包含我作为额外收到的数据的文档时,我还执行将数据放入第三方软件的代码。最后一部分花了一些时间,比如10-30秒。 HTTP POST的发送方正在等待200 OK响应代码,当它等待很长时间它将收到超时错误。有没有办法在我执行将数据输入第三个软件的代码之前发回200 OK。例如,这是可能的:
我在考虑在服务器上运行另一个代理(将数据放入第三方软件):
String noteIdtemp = RequestDoc.getNoteID();
Agent ag2 = db.getAgent("test");
ag2.runOnServer(noteIdtemp);
但这似乎不起作用,我也遇到了错误:
09-02-2018 14:52:27 HTTP JVM: NotesException: Could not execute macro:
09-02-2018 14:52:27 HTTP JVM: Unsupported trigger and search in the background or embedded agent
09-02-2018 14:52:27 HTTP JVM: at lotus.domino.local.Agent.runOnServer(Unknown Source)
09-02-2018 14:52:27 HTTP JVM: at JavaAgent.NotesMain(Unknown Source)
09-02-2018 14:52:27 HTTP JVM: at lotus.domino.AgentBase.runNotes(Unknown Source)
09-02-2018 14:52:27 HTTP JVM: at lotus.domino.NotesThread.run(Unknown Source)
欢迎任何夸大其词。
答案 0 :(得分:1)
您获得的错误是因为您没有正确设置第二个代理的属性以使其与RunOnServer一起使用。但RunOnServer无法解决您的问题。你的第一个代理人将等待第二个代理人。
我这样做的方法是让第一个代理在一些数据库中创建并保存文档。我打电话给那个"触发文件" (因为这正是我在20年前设计出一个使用这个技巧的系统时所称的那个)。
您可以将触发器doc写入任何数据库。它不一定是您为应用程序工作的主数据库。如果你想以这种方式进行设置,我可以假设它是一个单独的数据库,因为它可能更容易。我将其称为AgentQueue db。
您将第二个代理程序放入AgentQueue数据库,然后将其设置为运行When documents are create or modified。您写入AgentQueue的触发器文档需要包含第二个代理所需的信息,以便为您的第三方进程提供信息 - 即,在您的HTTP POST中提交的数据字段,主应用程序中所需的文档,以及等等。
您的第一个代理会保存触发器文档并退出 - 向浏览器发送200。第二个代理将很快运行 - 不一定立即运行,因为它将受到代理管理器的限制。因为一次只能运行第二个代理的一个副本,所以编写的最佳方法是让它在其数据库中查找多个未处理的触发器文档并处理它们而不是仅处理一个文档并终止。处理完触发器文档后,它会将其标记为"完成"并保存它,或只是删除它。保存它可能很有用,因为如果需要,第二个代理可以将进度和调试信息写入该文档。