代理未完成时返回 200 OK

Returning 200 OK while agent is not done

我在 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)

欢迎提出任何建议。

您收到的错误是因为您没有正确设置第二个代理的属性以使其与 RunOnServer 一起使用。但是 RunOnServer 不会解决您的问题。您的第一个特工将等待第二个。

不过,我的方法是让第一个代理创建文档并将其保存在某个数据库中。我将其称为 "trigger document"(因为这正是我在将近 20 年前设计一个使用此技巧的系统时所称的)。

您可以将触发器文档写入任何数据库。它不一定是您在应用程序中使用的主数据库。如果您想以这种方式设置它可能是这样,但我假设它是一个单独的数据库,因为那样可能更容易。我将其称为 AgentQueue 数据库。

您将第二个代理放入 AgentQueue 数据库,并将其设置为 运行 When documents are create or modified。您写入 AgentQueue 的触发器文档需要包含第二个代理需要的信息,以便为您的第三方进程提供数据 - 即,在您的 HTTP POST 中提交的数据字段,您的主应用程序中文档的 unids需要的等等 Y

您的第一个代理保存触发器文档并退出 - 向浏览器发送 200。第二个代理很快就会 运行 - 不一定立即,因为它将受到代理管理器中的限制。因为您的第二个代理程序一次只能 运行 一个副本,所以最好的编写方式是让它在其数据库中查找多个未处理的触发文档并处理所有这些文档,而不是只处理一个文档并终止。处理完触发文档后,它要么将其标记为 "Done" 并保存,要么将其删除。保存它可能很有用,因为您的第二个代理可以根据需要将进度和调试信息写入该文档。