从当前的DataBase Java-Agent调用另一个DataBase的java-Agent

时间:2016-01-07 12:56:57

标签: java xpages lotus-domino agent

我有一个java-agent,我可以从中调用另一个代理,并通过它传递包含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 个答案:

答案 0 :(得分:3)

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

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

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

e.g。 C:\IBM\Domino\Data\first\xyz.nsffirst\xyz.nsf/local/notesdata/second/abc.nsfsecond/abc.nsf

第三:你得到的noteid是来自调用数据库的文档。在" target" - 代理中,您必须从源数据库中获取文档,否则它将抛出错误或 - 如果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中的设置)必须具有对目标数据库和目标服务器(如果它不同)的足够访问权。

如果安全性不正确,则无效:向我们显示确切的错误/跟踪。

答案 1 :(得分:0)

我可以建议采用不同的方法吗?如果您不需要代理商立即回复,作为代码中的返回值,为什么不向其他数据库发送特殊邮件?创建邮件代理(在收到新邮件后触发),在发件人端创建NotesDocument对象,添加引用您希望代理处理的文档所需的值,如服务器名称,replicaId数据库和uniqueId。代理接收邮件并检查字段以查找它应该执行的操作。接收数据库应在N& A书中作为Mail-in数据库提及。

优点是多方面的:没有权利的麻烦,明确的界面,无需打开其他数据库,代理经理在方便的时候执行代理,您可以轻松地以相同的方式添加更多功能,等等。 / p>