如何动态重新安排Liferay任务?

时间:2015-11-19 12:25:27

标签: java liferay scheduled-tasks portlet

我创建了一个portlet(扩展MVCPortlet),其中包含一个扩展MessageListener的类来执行某些自动化任务。我们称这个班为SessionCollector

文件liferay-portlet.xml包含以下配置代码段:

<scheduler-entry>
    <scheduler-event-listener-class>
        com.myportal.scheduler.SessionCollector
    </scheduler-event-listener-class>

    <trigger>
        <simple>
            <simple-trigger-value>10</simple-trigger-value>
            <time-unit>minute</time-unit>
        </simple>
    </trigger>
</scheduler-entry>

任务设定为每10分钟开始一次。

问题是,在我的项目中,每个配置变量必须位于服务器类路径中可用的属性文件中。假设我有一个.properties文件,其中包含以下行:

session.collector.cron.text=0 0/5 * * * ?

所以,我想重新安排使用该Cron表达式的任务,这意味着该任务将每5分钟运行一次。

我试图在portlet的init ( )方法中编写重新安排,但无济于事。

这是代码,有一些简化:

@Override
public void init ( ) throws PortletException {
    // Reads the contents of the properties file.
    String cronText = getCronText ( );

    String jobName = SessionCollector.class.getName ( );
    String jobGroup = SessionColllector.class.getName ( );

    // The trigger is set to fire up using the Cron expression.
    Trigger trigger = TriggerFactoryUtil.buildTrigger (
        TriggerType.CRON,
        jobName,
        jobGroup,
        new Date ( ),
        null,
        cronText
    );

    // This is the message to fire the rescheduling.
    Message message = new Message ( );
    message.put (SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME, jobName);
    message.put (SchedulerEngine.PORTLET_ID, this.getPortletName ( ));

    // And finally, the actual reschedule.
    SchedulerEngineUtil.schedule (
        trigger,
        StorageType.PERSISTED,
        ""
        "liferay/scheduler_dispatch",
        message,
        5
    );
}

我怀疑问题在于我获取portlet id的方式(至少,它可能是问题之一)。无论如何,重新安排没有任何例外,但重新安排不会发生。任务每10分钟继续运行,而不是5分钟。

因此,要明确的是,有没有办法在portlet本身中动态地重新安排任务?请注意,portlet刚刚部署,但没有添加到任何页面,因此,它没有任何渲染代码。

谢谢!

更新(2015年11月23日)

此问题已被提议为another question的副本,但我认为这是相当无关的。

我的问题与Liferay用于调度/重新安排自动化任务的机制有关,使用Quartz作为底层调度程序引擎,另一个问题与H2数据库/ Hibernate层问题有关,据我所知。 / p>

1 个答案:

答案 0 :(得分:0)

您要安排还是 重新安排?要重新安排,您首先需要删除旧的时间表:

SchedulerEngineHelperUtil.delete(SessionCollector.class.getName(),
    StorageType.MEMORY_CLUSTERED);

StorageType.MEMORY_CLUSTERED是部署使用的存储类型)

但是如果你想在初始化时创建一个新的时间表,你也可以从liferay-portlet.xml中删除触发器。

接下来是您的日程安排。这对Liferay 6.2来说对我有用,但这可能会在不同的Liferay版本之间发生变化:

Message message = new Message();
message.put(SchedulerEngine.MESSAGE_LISTENER_CLASS_NAME, className);
message.put(SchedulerEngine.DESTINATION_NAME, DestinationNames.SCHEDULER_DISPATCH);
message.put(SchedulerEngine.RECEIVER_KEY, new ReceiverKey(className, className));
message.put(SchedulerEngine.PORTLET_ID, context.getPortletName());

SchedulerEngineHelperUtil.schedule(trigger, 
    StorageType.MEMORY_CLUSTERED, "description",
    DestinationNames.SCHEDULER_DISPATCH, message, 0);

我认为您不需要StorageType.PERSISTED用于特定于portlet的调度程序。