代码之家  ›  专栏  ›  技术社区  ›  Nuri Ensing

代理未完成时返回200 OK

  •  0
  • Nuri Ensing  · 技术社区  · 7 年前

    我在IBM Domino中构建了一个Java代理,它可以通过HTTP POST接收xml。现在,在代理中,当我成功地创建了一个文档,其中包含作为额外数据接收的数据时,我还会执行代码,将数据放入第三方软件。最后一部分需要一些时间,比如10-30秒。HTTP POST的发送方正在等待200 OK响应代码,当它等待的时间过长时,将出现超时错误。在我执行将数据放入第三方软件的代码之前,是否有办法将200 OK发回。例如,这是否可能:

    enter image description here

    我想在服务器上运行另一个代理(将数据放入第三方软件):

         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)
    

    欢迎提出任何建议。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Richard Schwartz    7 年前

    出现的错误是,您没有正确设置第二个代理的属性,无法将其与RunOnServer一起使用。但RunOnServer无法解决您的问题。您的第一个代理将等待第二个代理。

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

    您可以将触发器文档写入任何数据库。它不必是应用程序的主数据库。如果您想这样设置它,可以这样做,但我假设它是一个单独的数据库,因为这样可能更容易。我叫它AgentQueue db。

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

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