我有一个代理人,每天早上8点开始运行 我想编写一个java代码(在共享库中)并使用参数从代理中调用该库。
例如:
代理商代码:
// ....
checkAndSendMail(email_1);
checkAndSendMail(email_2);
// ....
java库代码:
public class Check{
public void checkAndSendMail(String email_param){
// ...
mail.send(email_param);
// ...
}
}
答案 0 :(得分:6)
XPage中的JVM和Domino Java Agents是分开的,因此您无法在它们之间共享Java代码。 如果转到设计器
中的脚本库部分,则可以创建Java代码
不是适用于XPage的Java / Jar部分。并创建一个可以包含在Java代理中的新Java库。
答案 1 :(得分:4)
你可以这样做,但这只能带来很多“开销”。假设您要在代理中加载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);
}
}
}
答案 2 :(得分:2)
:-) stw