在 IBM Domino 应用程序中使用 Quartz Scheduler
Use Quartz Scheduler in IBM Domino Application
我是 Quartz 的新手,但知道 3 个简单的东西,你必须具备这些东西才能让它工作。
这些是作业、触发器和调度程序。
现在,在我们的 domino 应用程序中,我们必须使用它来刷新令牌。
我已经为它创建了 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>
好吧,quartz scheduler 已初始化,作业已设置但不执行作业(我知道这一点是因为如果我按同一个按钮两次,它会给我一个作业已经存在的例外)。
我猜 Domino 的 JVM 不会让调度程序 运行 无限期地运行。
我不使用标准 IBM 代理的原因很简单 - 它不允许在 Code
部分使用 Java 代码。您必须要么导入并复制您目前拥有的所有内容,要么将其编译到 jar 中并导入。但是,如果您决定更改源代码中的任何内容,则必须重新编译整个 jar(使用新的源代码)并重新导入。
有人集成过 Domino JVM 和 Quartz 吗?
如果是这样,请告诉我最佳做法以及如何使其发挥作用。
提前致谢。
您需要克服一系列障碍:
- 您的调度程序需要 运行 "forever",因此您需要 运行 它不会死的地方。那个地方是一个 OSGi 插件。您的调度程序的位置将是激活器 class。类似的东西:
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
}
}
您需要从某个地方调用它(不应该是 SSJS)。因此,您将创建一个可以访问插件激活器的托管 bean。将bean代码放入插件中。一旦你定义了它,你就可以在你的按钮中调用bean方法
您的调度程序 运行 是一个令牌刷新。刷新后的令牌应该发生什么?
说了这么多。您可能可以使用 更简单的 解决方案(除非您的令牌需要毫秒精度):
- 为会话上下文创建一个 managed bean(每个 bean 都是针对每个用户单独实例化的)。
- 在 bean 中有一个方法,您将从您的按钮(或其他地方)调用该方法,该方法会在您再次执行之前触发 new thread. That thread sleeps for a while。检查 属性 是否正在关闭,以便您可以正常终止。
希望对您有所帮助
我已经创建了一个插件,你可以在这里找到它:https://github.com/hasselbach/domino-quartz
功能项目和 updatesite 项目丢失。
您必须在服务器和 DDE 中安装该插件,并在您的 XPages 应用程序中激活它。
我是 Quartz 的新手,但知道 3 个简单的东西,你必须具备这些东西才能让它工作。 这些是作业、触发器和调度程序。
现在,在我们的 domino 应用程序中,我们必须使用它来刷新令牌。
我已经为它创建了 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>
好吧,quartz scheduler 已初始化,作业已设置但不执行作业(我知道这一点是因为如果我按同一个按钮两次,它会给我一个作业已经存在的例外)。
我猜 Domino 的 JVM 不会让调度程序 运行 无限期地运行。
我不使用标准 IBM 代理的原因很简单 - 它不允许在 Code
部分使用 Java 代码。您必须要么导入并复制您目前拥有的所有内容,要么将其编译到 jar 中并导入。但是,如果您决定更改源代码中的任何内容,则必须重新编译整个 jar(使用新的源代码)并重新导入。
有人集成过 Domino JVM 和 Quartz 吗?
如果是这样,请告诉我最佳做法以及如何使其发挥作用。
提前致谢。
您需要克服一系列障碍:
- 您的调度程序需要 运行 "forever",因此您需要 运行 它不会死的地方。那个地方是一个 OSGi 插件。您的调度程序的位置将是激活器 class。类似的东西:
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
}
}
您需要从某个地方调用它(不应该是 SSJS)。因此,您将创建一个可以访问插件激活器的托管 bean。将bean代码放入插件中。一旦你定义了它,你就可以在你的按钮中调用bean方法
您的调度程序 运行 是一个令牌刷新。刷新后的令牌应该发生什么?
说了这么多。您可能可以使用 更简单的 解决方案(除非您的令牌需要毫秒精度):
- 为会话上下文创建一个 managed bean(每个 bean 都是针对每个用户单独实例化的)。
- 在 bean 中有一个方法,您将从您的按钮(或其他地方)调用该方法,该方法会在您再次执行之前触发 new thread. That thread sleeps for a while。检查 属性 是否正在关闭,以便您可以正常终止。
希望对您有所帮助
我已经创建了一个插件,你可以在这里找到它:https://github.com/hasselbach/domino-quartz
功能项目和 updatesite 项目丢失。
您必须在服务器和 DDE 中安装该插件,并在您的 XPages 应用程序中激活它。