【问题标题】:How to trigger the java agent from xpage button click event?如何从 xpage 按钮单击事件触发 java 代理?
【发布时间】:2013-03-08 03:30:35
【问题描述】:

我想通过触发我的 xpage 上的按钮单击事件来测试 java 代理以清除视图中的所有文档。我在 java 代理中没有错误,但它不工作。你能帮我度过这个阶段吗?

按钮点击事件:

var serverName=session.getCurrentDatabase().getServer();
//@WarningMessage("current one");
//@WarningMessage("server=" + serverName);
//var db:NotesDatabase = session.getDatabase(session.getCurrentDatabase().getServer(), "\ProTexII.nsf");
var db:NotesDatabase=session.getCurrentDatabase();
@WarningMessage("db=" + db);

var agent:NotesAgent = db.getAgent("SnapShotUpdate");
@WarningMessage("agent" + agent);

if (agent!=null){

 agent.run();
 @WarningMessage("view is fired!");

}

Java 代理:

package javaPkg;
import java.io.PrintWriter;

import lotus.domino.*;

public class SnapShotUpdate extends AgentBase{

 public void NotesMain() {
       try {

         //String p = session.getPlatform();
           //PrintWriter out=getAgentOutput();

          System.out.println("Hello i never give it up!!");


          Session session = getSession();
          AgentContext agentContext =session.getAgentContext();
          Database db=session.getCurrentDatabase();


          //**clear view "vActualSalesFromSD" before copying documents into it

          DocumentCollection dc= db.createDocumentCollection();
          View view= db.getView("vActualSalesFromSD");
          Document docToBeCleared= view.getFirstDocument();

          while (docToBeCleared != null) {

             {
                dc.addDocument(docToBeCleared);
             }

                docToBeCleared = view.getNextDocument(docToBeCleared);
          }

          dc.removeAll(true);
       } catch(Exception e) {
         e.printStackTrace();
       }
     }


}

【问题讨论】:

  • 发出任何警告消息了吗?您也可以直接使用 database.getAgent() ,因为对象数据库始终存在。会话也是如此。
  • 你有计划以后让这个代理更复杂吗?在当前的形式中,这是一个相当简单的操作……您不妨直接在按钮事件中运行此代码。如果您调用代理的唯一原因是要在签名者的权限下删除文档,请使用 sessionAsSigner 获取当前数据库的单独句柄;您通过该句柄在数据库中执行的任何操作都将作为签名者完成,而不是用户。
  • P.S.如果目标是从给定视图中删除所有文档,请不要费心循环:db.getView("vActualSalesFromSD").getAllEntries().removeAll(true) 将获得相同的结果。
  • 实际上我正在尝试编写和测试java代理,因为我不熟悉lotus脚本。此代理稍后会很复杂,并且会更改为计划代理。谢谢大家的建议。

标签: java xpages lotus-domino lotus


【解决方案1】:

您有 3 种可能性来触发您的代码:

  1. 您采取的方法
  2. 对 /yourdatabase.nsf/SnapshotUpdate?OpenAgent 进行 ajax 调用
  3. 建议不要使用代理(高度) -> 它已经是 Java,使用一个类并在您的 SSJS 中调用它

会出什么问题:

  1. 代理的目标不是“无”
  2. 您在该数据库中没有删除权限
  3. 您无权运行代理(不太可能,因为您可以运行 XPage)

我会这样写循环:

  public function clearView(Database db, String vName ) {
     try {
         View view= db.getView("vActualSalesFromSD");
         Document docToBeCleared= view.getFirstDocument();
         Document nextDoc = null;

         while (docToBeCleared != null) {
            nextDoc = view.getNextDocument(docToBeCleared);
            try {
                 docToBeCleared.remove(true);
                } catch (Exception didntWork) {
                // Do some logging here
                }
            // Recycle your objects
            doc.recycle();
            docToBeCleared = nextDoc;             
         }

        // cleanup, we recycle what we opened, but not the parameters
        // nextDoc and docToBeCleared are null already;
        v.recycle();

     } catch(Exception e) {
         e.printStackTrace();
     }
 }

让我们知道你的进步。

【讨论】:

  • 现在我的代理正在运行。问题是当我创建新代理时,会在 Src/(默认包)下自动创建一个 java 代理,但我在单独的包下创建了新的 java 类作为代理,并尝试从我的 xpage 调用它。谢谢它已经解决了:)
  • 你仍然不应该在这里使用代理 - 除非你能分享一个很好的理由
猜你喜欢
  • 2014-09-09
  • 1970-01-01
  • 2011-04-03
  • 2014-09-21
  • 2011-11-30
  • 1970-01-01
  • 2012-01-19
  • 2010-10-21
  • 2013-01-17
相关资源
最近更新 更多