有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

xpages从当前数据库javaAgent调用另一个数据库的javaAgent

我有一个java代理,我可以从中调用另一个代理,通过它传递的参数包含NoteId,并且使用该NoteId,我能够成功地完成该文档中的工作。直到这里一切都清楚了

与此相关的主要问题是,是否可以从当前数据库代理运行同一服务器上另一个数据库的代理

为了更清楚地说明一个例子 我有两个数据库,“ABC.nsf”和“XYZ.nsf”,JavaAgent“A”在“ABC.nsf”中,JavaAgent“B”在“XYZ.nsf”中。在我的xpage中,我有一个运行代理“a”的按钮,甚至代理“a”也可以从同一数据库运行任何其他javaAgent

代码:

 Document mainDoc = db.getDocumentByUNID(tempDoc.getItemValueString("mainDocId"));
 String noteID = mainDoc.getNoteID();
 String agentName = "NotificationManager";
 Agent agent = db.getAgent(agentName);
 if (agent != null) 
     agent.runOnServer(noteID);
 else 
    System.err.println("Something is wrong");

但实际上我想从“ABC.nsf”中的JavaAgent“A”运行位于“XYZ.nsf”中的JavaAgent“B”

经过一些研究,我参考了这段代码。 代码

Database db=session.getDatabase(current_server, "path/to/XYZ.nsf"); 
Agent myAgent=db.getAgent("B"); 
myAgent.run(); 

是的,我在那里没有成功, 需要一些想法来实现这一点。任何建议都将受到欢迎


共 (2) 个答案

  1. # 1 楼答案

    我可以建议一种不同的方法吗?如果不需要代理立即回复,作为代码中的返回值,为什么不向另一个数据库发送一封特殊邮件?创建邮件代理(在收到新邮件后触发),在发件人端创建NotesDocument对象,添加引用代理要处理的文档所需的值,如服务器名称、数据库的replicaId和uniqueId。代理接收邮件并检查字段,以确定它应该做什么。接收数据库应在N&;一本书作为数据库中的邮件

    优点是多方面的:没有权限问题,界面清晰,无需打开其他数据库,代理由代理管理器在方便的时间执行,您可以轻松地以同样的方式添加更多功能,等等

  2. # 2 楼答案

    示例代码原则上是正确的。只是一些你必须知道的事情:

    首先,服务器的名称可以是“”或服务器的真实名称。但是如果有服务器,那么您必须检查服务器文档中的Trusted servers:-部分(安全选项卡-服务器访问部分)。在那里,服务器本身必须是字段的成员(作为名称或组中的成员),否则您可能无法打开另一个数据库

    第二件事:目标数据库的路径是相对于数据目录的,并且必须是给定操作系统的正确格式

    例如C:\IBM\Domino\Data\first\xyz.nsf将是first\xyz.nsf,而/local/notesdata/second/abc.nsf将是second/abc.nsf

    第三:您获得的noteid来自调用数据库的文档。在“目标”-代理中,您必须从源数据库获取文档,否则它将抛出错误,或者(由于noteid只是一个序列号)从目标数据库返回与您正在搜索的文档无关的文档

    呼叫代理A的代码如下:

    Session session = getSession();
    AgentContext agentContext = 
    session.getAgentContext();
    Database dbCurrent = agentContext.getCurrentDatabase();
    Database dbTarget = session.getDatabase(dbCurrent.Server, "XYZ.nsf"); 
    Agent myAgent=dbTarget.getAgent("B"); 
    myAgent.runOnServer(noteID); 
    

    被称为特工B的人可能是这样的

    Session session = getSession();
    AgentContext agentContext = 
    session.getAgentContext();
    Database dbCurrent = agentContext.getCurrentDatabase();
    Database dbSource = session.getDatabase(dbCurrent.Server, "ABC.nsf"); 
    Document doc = dbSource.getDocumentByID(agentContext.getCurrentAgent().getParameterDocID())
    

    这应该可以工作(如果服务器上的安全性正常)。 正如Paul在评论中提到的,安全性还意味着代理签名者或web用户(取决于代理A中的设置)必须有足够的权限访问目标数据库和目标服务器(如果不同)

    如果在安全性正确的情况下仍无法工作:向我们显示准确的错误/跟踪