簡體   English   中英

如何從Xpages中的Java代理調用Java共享腳本庫?

[英]How to call a java shared script library from a Java agent in Xpages?

我有一個每天將在8:00運行的代理
我想編寫一個Java代碼(在共享庫中),並使用參數從代理中調用該庫。

例如:

代理代碼:

    // ....
    checkAndSendMail(email_1);
    checkAndSendMail(email_2);
    // ....

Java庫代碼:

public class Check{       
    public void checkAndSendMail(String email_param){
        // ...
        mail.send(email_param);
        // ...
    }    
}
  • 我可以從Xpages中的Java代理調用Java共享腳本庫嗎?
  • 如果是,那怎么打電話?

XPages和Domino Java Agent中的JVM是分開的,因此您不能在它們之間共享Java代碼。 如果轉到設計器中的腳本庫部分,則可以創建Java代碼。

Scriptlib Java

而不是XPages的Java / Jar部分。 並創建一個可以包含在Java代理中的新Java庫。

導入腳本庫

您可以執行此操作,但這只有在有很多“開銷”的情況下才有可能。 假設要在代理中加載Java類,可以執行以下操作:

  1. 獲取包含您的類的設計說明(具有特殊設計視圖或Java NAPI的fe)
  2. 使用DXL導出注釋
  3. 提取所有“ $ ClassData”字段的內容
  4. Base64解碼內容
  5. 跳過前42個字節,並使用您自己的類加載器加載結果字節數組(重寫執行defineClass調用的findClass方法)
  6. 現在,您可以在代理中實例化該類並通過反射來訪問它

如您所見,這是可能的,但是要付出更多的努力,而不僅僅是“加倍” DDE中的庫。

編輯:

這是代理的示例類加載器。 已添加Base64編碼的DXL。 代理實例化類ch.hasselba.demo.LoadedClass並調用方法printTime()

package ch.hasselba.demo;

public class LoadedClass {

    public void printTime(){
        System.out.println("Time: " + System.currentTimeMillis() );
    }
}

代理的代碼(使用lwpd.commons.jar

import lotus.domino.AgentBase;
import com.ibm.commons.util.io.base64.Base64;
import java.lang.reflect.Method;

public class JavaAgent extends AgentBase {

    public void NotesMain() {

        try {
            // trucated DXL string
            String dataDXL = "YQAYAAAAAACqAgAAAQAAAAAAAAAAAAAAYAC8AgAAqgKqAgAAAAAAAAAAyv66vgAAADEALwcAAgEAFWNoL2hhc3NlbGJhL3hwYWdlcy9aWgcA";

            // base64 decode the string
            String b64 = Base64.decode(dataDXL);
            byte[] b64Bytes = b64.getBytes();
            byte[] classBytes = new byte[b64Bytes.length - 42];

            // skip the first 42 bytes
            System.arraycopy( b64Bytes, 42, classBytes, 0, b64Bytes.length - 42);

            try {
                // load the class
                ByteClassLoader obj = new ByteClassLoader();
                Class theClass = obj.findClass("ch.hasselba.demo.LoadedClass", classBytes);
                // instantiate it
                Object theInstance = theClass.newInstance();

                // get the method printTime via Reflection & call it
                Method theMethod = theInstance.getClass().getMethod("printTime", null);
                theMethod.invoke( theInstance, null);
            } catch (Exception e) {
                e.printStackTrace();
            }

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

        }
    }

    // the class loader
    public static class ByteClassLoader extends ClassLoader {

        public Class findClass(String name, byte[] data) {
            return defineClass(name, data, 0, data.length);
        }
    }
}

邁克(Mike),弗雷德里克(Fredrik)是對的-不要分享。 除非...將共享代碼打包到Jar中,然后將其部署到服務器和/或客戶端的jvm / lib / ext目錄中。 您的管理員可能不會這樣。 OpenNTF上有一個updatesite.ntf的修補程序版本,允許將插件部署到服務器操作系統中。 您可以修改腳本以將jar部署到ext目錄中。 但請先征得管理員同意。

:-) STW

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM