[英]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和Domino Java Agent中的JVM是分開的,因此您不能在它們之間共享Java代碼。 如果轉到設計器中的腳本庫部分,則可以創建Java代碼。
而不是XPages的Java / Jar部分。 並創建一個可以包含在Java代理中的新Java庫。
您可以執行此操作,但這只有在有很多“開銷”的情況下才有可能。 假設要在代理中加載Java類,可以執行以下操作:
如您所見,這是可能的,但是要付出更多的努力,而不僅僅是“加倍” 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.