在 IBM Domino 应用程序中使用 Quartz Scheduler



我对 Quartz 很陌生,但知道 3 件简单的事情,你必须拥有这些东西才能让它工作。 这些是作业、触发器和调度程序。

现在,在我们的多米诺骨牌应用程序中,我们必须使用它来刷新令牌。

我为它创建了 3 个基本类。

工作:

public class RefreshEGRZTokenJob implements Job 
{
public void execute(JobExecutionContext arg0) throws JobExecutionException 
{
System.out.println("stub for refreshing a token");  
}
}

触发器和类似main

public class RefreshEGRZTokenExecutor
{
private static String REFRESH_TOKEN_JOB = "refreshTokenJob";
public static void executeAndScheduleRefreshToken(int timeInSeconds) throws SchedulerException 
{
JobDetail job = JobBuilder.newJob(RefreshEGRZTokenJob.class)
.withIdentity(REFRESH_TOKEN_JOB).build();
Trigger trigger =  TriggerBuilder
.newTrigger()
.withIdentity(REFRESH_TOKEN_JOB)
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(timeInSeconds).repeatForever())
.build();
QuartzScheduler.getInstance().scheduleJob(job, trigger);
}
public static void pauseScheduler() throws SchedulerException 
{
QuartzScheduler.getInstance().standby();
}
}

和调度程序:

public final class QuartzScheduler 
{
private static Scheduler quartzSchedulerInstance;
public static Scheduler getInstance() throws SchedulerException 
{
if (quartzSchedulerInstance == null) 
{
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
quartzSchedulerInstance = scheduler;
}
return quartzSchedulerInstance;
}
}

我发出的调用来自一个按钮(在生产中,它将在用户授权后不久执行(

<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:      
ru.lanit.egrz.scheduler.RefreshEGRZTokenExecutor.executeAndScheduleRefreshToken(30);

}]]>
</xp:this.action>
</xp:eventHandler>

好吧,石英调度程序已启动并且设置了作业但不执行作业(我知道这一点,因为如果我按两次相同的按钮,它会给我一个解释,该作业已经存在(。

我猜多米诺的JVM不会让调度程序无限期运行。

我不使用标准 IBM 代理的原因很简单 - 它不允许在Code部分中使用 Java 代码。您必须导入并复制到目前为止拥有的所有内容,或者将其编译到 jar 中并导入。但是,如果您决定更改源代码中的任何内容,则必须重新编译整个jar(使用新的源代码(并重新导入。

有没有人集成了Domino JVM和Quartz?

如果是这样,请告诉我最佳实践以及如何使其工作。

提前谢谢。

我创建了一个插件,你可以在这里找到它:https://github.com/hasselbach/domino-quartz

缺少功能项目和更新站点项目。

您必须在服务器和 DDE 中安装插件,并在 XPages 应用程序中激活它。

这里有一组障碍需要克服:

  1. 你的调度程序需要"永远"运行,所以你需要从它不会死的地方运行它。那个地方是一个OSGi插件。调度程序的位置是激活器类。 类似这些内容:
import java.util.logging.Logger;
import org.eclipse.core.runtime.Plugin;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator extends Plugin implements BundleActivator {
@Override
public void start(final BundleContext context) throws Exception {
// Here you start your scheduler
}
}
  1. 你需要从某个地方调用它(这不应该是SSJS(。因此,您将创建一个可以访问插件激活器的托管 Bean。将 Bean 代码放入插件中。定义后,您可以在按钮中调用 bean 方法

  2. 您的计划程序运行令牌刷新。刷新后的令牌应该发生什么变化?


说了这么多。您可能可以使用更简单的解决方案(除非您的令牌需要毫秒级精度(:

  • 为会话上下文创建受管 Bean(每个 Bean 按用户单独实例化(。
  • 在 bean 中,您将从您的按钮(或其他地方(调用一个新线程。该线程会休眠一段时间,然后再次执行。检查已关闭的属性,以便可以正常终止。

希望有帮助

最新更新