我创建了一个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刚刚部署,但没有添加到任何页面,因此,它没有任何渲染代码。
谢谢!
此问题已被提议为another question的副本,但我认为这是相当无关的。
我的问题与Liferay用于调度/重新安排自动化任务的机制有关,使用Quartz作为底层调度程序引擎,另一个问题与H2数据库/ Hibernate层问题有关,据我所知。 / p>
答案 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的调度程序。