Xpages 计划的XOTS tasklet产生异常(OpenNTF Domino API)

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.

也许我不太明白这个道理,但它并没有用一个样本记录下来,所以我不得不玩它。我创建了一个将用作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.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);
}

使用此方法,代码每秒执行一次。现在我只需要找出如何停止:-D

XspContext在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);
}