Forums

Home » Liferay Portal » 日本語 » 3. 開発

Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Hidekazu Yamaji
Quartz Scheduler
August 2, 2012 6:38 PM
Answer

Hidekazu Yamaji

Rank: New Member

Posts: 2

Join Date: May 15, 2012

Recent Posts

週次で自動でemailを送信するポートレットを作成しています。
liferay-portlet.xmlに
<scheduler-entry>
  <scheduler-event-listener-class>com.lms.slayer.util.AutoEmailSender</scheduler-event-listener-class>
    <trigger>
<cron>
<cron-trigger-value>0 55 01 ? * FRI</cron-trigger-value>
      </cron>
</trigger>
</scheduler-entry>
ユーザーが送信する日時を変更できるようにするためcron-trigger-valueの値をポートレットのconfigrationから編集するようにしましたが、これだとliferay-portlet.xmlを変更するたびにオートデプロイしていまいます。
そこで
Trigger trigger = new CronTrigger(jobName, groupName, schedulerStartDate, schedulerEndDate, cronText);
SchedulerEngineUtil.schedule(trigger, StorageType.MEMORY, null, DestinationNames.SCHEDULER_DISPATCH, "actual_required_message", 10);
SchedulerEngineUtil.start();
のようにしてliferay-portlet.xmlを使わずに自動起動させたいと思っておりますがうまく動きません。
同じような要件で解決策をご存知の方がいらっしゃいましたらご教授願います。
Daniel Kiyotomo Ozeki
RE: Quartz Scheduler
August 13, 2012 11:36 AM
Answer

Daniel Kiyotomo Ozeki

LIFERAY STAFF

Rank: New Member

Posts: 16

Join Date: March 1, 2012

Recent Posts

ヤマジ様、

ご質問ありがとうございます。現在LIferay本社での回答検索中です。少々お待ちください。


大関
Daniel Kiyotomo Ozeki
RE: Quartz Scheduler
August 13, 2012 12:07 PM
Answer

Daniel Kiyotomo Ozeki

LIFERAY STAFF

Rank: New Member

Posts: 16

Join Date: March 1, 2012

Recent Posts

ヤマギさん、

コードにSchedulerEventのオブジェクトを追加することで動くはずです。

TriggerとSchedulerEngineUtil.Scheduleのコードラインがありますがこの二つの間にSchedulerEventのオブジェクトを入れてください。SchedulerEventにTrigger を入れ、さらにSchedulerEngineUtil.scheduleの「trigger」を消しその変わりにSchedulerEventを入れてください。

下記にコードをコピーし入れる場所をハイライトしました。(注意:大文字にされているものは実際に入れる文字ではありません。ただどこに何を入力するかを示しております。)

Trigger trigger = new CronTrigger(jobName, groupName, schedulerStartDate, schedulerEndDate, cronText);
ここにSchedulerEventのオブジェクトを追加する ( そしてここに上記のTriggerを入力する )
SchedulerEngineUtil.schedule(ここにSchedulerEventを入力する,StorageType.MEMORY, null, DestinationNames.SCHEDULER_DISPATCH, "actual_required_message", 10);
SchedulerEngineUtil.start();

いかがでしょうか?
Hitoshi Ozawa
RE: Quartz Scheduler
August 13, 2012 3:45 PM
Answer

Hitoshi Ozawa

Rank: Liferay Legend

Posts: 7990

Join Date: March 23, 2010

Recent Posts

小沢です。

「。。。うまく動きません。」では曖昧過ぎて意味が不明です。ジョブが実行されないのでしょうか?実行中にエラーになるのでしょうか?
それともコンパイル中にエラーになるのでしょうか?

分からないことがあった場合はLiferayのソースコードを参照するのが一番早いと思います。

SchedulerEngineUtilは掲示板で使われています:

\portal-impl\src\com\liferay\portlet\messageboards\service\impl\MBMailingListLocalServiceImpl.java

行#197: protected void scheduleMailingList(MBMailingList mailingList)

String groupName = getSchedulerGroupName(mailingList);

Calendar startDate = CalendarFactoryUtil.getCalendar();

CronText cronText = new CronText(
startDate, CronText.MINUTELY_FREQUENCY,
mailingList.getInReadInterval());

Trigger trigger = new CronTrigger(
groupName, groupName, startDate.getTime(), null,
cronText.toString());

MailingListRequest mailingListRequest = new MailingListRequest();

mailingListRequest.setCompanyId(mailingList.getCompanyId());
mailingListRequest.setUserId(mailingList.getUserId());
mailingListRequest.setGroupId(mailingList.getGroupId());
mailingListRequest.setCategoryId(mailingList.getCategoryId());
mailingListRequest.setInProtocol(mailingList.getInProtocol());
mailingListRequest.setInServerName(mailingList.getInServerName());
mailingListRequest.setInServerPort(mailingList.getInServerPort());
mailingListRequest.setInUseSSL(mailingList.getInUseSSL());
mailingListRequest.setInUserName(mailingList.getInUserName());
mailingListRequest.setInPassword(mailingList.getInPassword());
mailingListRequest.setAllowAnonymous(mailingList.getAllowAnonymous());

SchedulerEngineUtil.schedule(
trigger, StorageType.MEMORY_CLUSTERED, null,
DestinationNames.MESSAGE_BOARDS_MAILING_LIST, mailingListRequest,
0);
Hitoshi Ozawa
RE: Quartz Scheduler
August 15, 2012 4:00 PM
Answer

Hitoshi Ozawa

Rank: Liferay Legend

Posts: 7990

Join Date: March 23, 2010

Recent Posts

山地様、

動きましたでしょうか?

既に御存じだとは思いますが、大関様が指摘されたようなscheduleメソッドのシグニチャは存在しません。

SchedulerEngineUtil.schedule(ここにSchedulerEventを入力する,StorageType.MEMORY, null, DestinationNames.SCHEDULER_DISPATCH, "actual_required_message", 10);

JavaDoc
http://docs.liferay.com/portal/6.1/javadocs-all/com/liferay/portal/kernel/scheduler/SchedulerEngineUtil.html

SchedulerEntryを利用する場合は以下のメソッドを利用します:
static void schedule(SchedulerEntry schedulerEntry, StorageType storageType, String portletId, int exceptionsMaxSize)

ただし、今回は実行日時を動的に指定していた言うことなので、山地様も使われていた以下のメソッドを使います:
schedule(Trigger trigger, StorageType storageType, String description, String destinationName, Message message, int exceptionsMaxSize)
Hidekazu Yamaji
RE: Quartz Scheduler
August 22, 2012 7:25 PM
Answer

Hidekazu Yamaji

Rank: New Member

Posts: 2

Join Date: May 15, 2012

Recent Posts

大関様、小沢様

ご回答を頂きありがとうございました。
下記のようにコードを修正して自動起動できました。

Trigger trigger = new CronTrigger(jobName, groupName, schedulerStartDate, schedulerEndDate, cronText);
SchedulerEntry entry = new SchedulerEntryImpl();
entry.setEventListenerClass("com.lms.slayer.util.AutoModerationRequest");
entry.setTriggerValue(cronText);
entry.setTriggerType(TriggerType.CRON);
SchedulerEngineUtil.schedule(entry, StorageType.MEMORY, this.getClass().getClassLoader(), 0);
Hitoshi Ozawa
RE: Quartz Scheduler
September 19, 2012 3:48 AM
Answer

Hitoshi Ozawa

Rank: Liferay Legend

Posts: 7990

Join Date: March 23, 2010

Recent Posts

山地様、

動くようになってなによりです。また何か質問がありましたら気楽に投稿してください。

小沢