Xpages 计划的XOTS tasklet产生异常(OpenNTF Domino API)
也许我不太明白这个道理,但它并没有用一个样本记录下来,所以我不得不玩它。我创建了一个将用作XOTS tasklet的类:Xpages 计划的XOTS tasklet产生异常(OpenNTF Domino API),xpages,Xpages,也许我不太明白这个道理,但它并没有用一个样本记录下来,所以我不得不玩它。我创建了一个将用作XOTS tasklet的类: package org.sutol.demo.xots; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.concurrent.Callable; import java.util.logging.Level; import org.openntf.domino.
package org.sutol.demo.xots;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import org.openntf.domino.xots.Tasklet;
import org.openntf.domino.xsp.XspOpenLogUtil;
@Tasklet(session = Tasklet.Session.CLONE, schedule = "cron:0 */1 00-23 * * *")
public class PeriodicTask implements Callable<String> {
public String call() {
Calendar now = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss");
String result = "Message from PeriodicTask: " + formatter.format(now.getTime());
createOutput(result);
return result;
}
private void createOutput(String msg) {
System.out.println(msg);
XspOpenLogUtil.logEvent(null, msg, Level.INFO, null);
}
}
这里有几个问题:
- tasklet只执行一次,而不是我确定的每秒钟执行一次
- 我在服务器控制台上收到一条错误消息
08.11.2015 18:59:39 HTTP JVM: ### LOGSTART
08.11.2015 18:59:39 HTTP JVM: Message from PeriodicTask: 08.11.2015, 18:59:39
08.11.2015 18:59:39 HTTP JVM: INIT
08.11.2015 18:59:39 [ODA::WARNING] null
08.11.2015 18:59:39 [ODA::WARNING] (source:org.openntf.domino.utils.DominoUtils$4.run - See IBM_TECHNICAL_SUPPORT\org.openntf.log.X.Y.txt for full stack trace.)
08.11.2015 18:59:39 HTTP JVM: ### LOGSUCCESS
这是日志文件的内容:
2015-11-08T18:59:39 [WARNING]: com.ibm.xsp.util.FacesUtil.resolveVariable - null
java.lang.NullPointerException
at com.ibm.xsp.util.FacesUtil.resolveVariable(FacesUtil.java:1048)
at com.ibm.xsp.designer.context.XSPContext.getXSPContext(XSPContext.java:59)
at com.ibm.xsp.extlib.util.ExtLibUtil.getXspContext(ExtLibUtil.java:202)
at org.openntf.domino.xsp.XspOpenLogItem.setThisAgent(XspOpenLogItem.java:132)
at org.openntf.domino.xsp.XspOpenLogItem.getThisAgent(XspOpenLogItem.java:124)
at org.openntf.domino.xsp.XspOpenLogItem.writeToLog(XspOpenLogItem.java:419)
at org.openntf.domino.logging.BaseOpenLogItem.logEvent(BaseOpenLogItem.java:685)
at org.openntf.domino.xsp.XspOpenLogUtil.logEvent(XspOpenLogUtil.java:134)
at org.sutol.demo.xots.PeriodicTask.createOutput(PeriodicTask.java:24)
at org.sutol.demo.xots.PeriodicTask.call(PeriodicTask.java:18)
at org.sutol.demo.xots.PeriodicTask.call(PeriodicTask.java:1)
at org.openntf.domino.xsp.xots.XotsWrappedTask.invokeObject(XotsWrappedTask.java:145)
at org.openntf.domino.xsp.xots.XotsWrappedTask.invokeTasklet(XotsWrappedTask.java:125)
at org.openntf.domino.xsp.xots.XotsWrappedTask.callOrRun(XotsWrappedTask.java:55)
at org.openntf.domino.xsp.xots.XotsDominoExecutor$XotsWrappedCallable.call(XotsDominoExecutor.java:62)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:314)
at java.util.concurrent.FutureTask.run(FutureTask.java:149)
at org.openntf.domino.thread.AbstractDominoExecutor$DominoFutureTask.run(AbstractDominoExecutor.java:235)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:583)
at java.security.AccessController.doPrivileged(AccessController.java:384)
at java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:580)
at java.lang.Thread.run(Thread.java:767)
有没有人能告诉我一个更好的样本,或者我做错了什么?
我想单击一个按钮来启动定期任务(当然,我想单击另一个按钮来停止,但我不知道如何执行此操作)。删除对XspOpenLogUtil.logEvent的调用 它在Xots上下文中不可用我的错,我被困住了。 当我自动完成Xots类的schedule方法时,我无意中使用了错误的方法。它是来自
java.util.concurrent
的方法,而不是来自org.openntf.domino.thread
我改为正确的方法,需要一个周期调度器,如下所示:
public static void startPeriodicTasklet() {
PeriodicScheduler sched = new PeriodicScheduler(0, 1, TimeUnit.SECONDS);
Xots.getService().schedule(new PeriodicTask(), sched);
}
使用此方法,代码每秒执行一次。现在我只需要找出如何停止:-DXspContext在XOT中不可用。所有与XPages相关的元素,比如resolveVariable使用的VariableResolver,都需要以某种方式实例化。更复杂的是,它们需要使用与XPages运行时相同的类加载器进行实例化,否则它们将是XPages元素的单独实例,因此applicationScope将是单独的applicationScope,随后无法从XPage访问。我倾向于传入任何XPages运行时对象,并让我的实用工具方法使用try/catch转到XPages运行时,否则将返回Xots任务的相关属性。这解决了异常问题。谢谢你的提醒
public static void startPeriodicTasklet() {
PeriodicScheduler sched = new PeriodicScheduler(0, 1, TimeUnit.SECONDS);
Xots.getService().schedule(new PeriodicTask(), sched);
}