About Jobs
Who?       s_kozake(小酒信一) I’m Java Programmer
こんな心意気で頑張っております              Javaは亡びぬ              Javaは亡びぬ              何度でも蘇るさ!!              何度でも蘇るさ!!JVMの力こそプログラマーの夢だか...
About Jobs
の話じゃありません
play.jobs.*のお話です。
Playにジョブ管理機能があるのご存知でした?
Playのジョブ管理は結構便利です!!
起動時に実行するジョブpackage jobs;import play.*;import play.jobs.*;@OnApplicationStartpublic class Bootstrap extends Job {    public...
@OnApplicationStart(async=true)とすると、バックグラウンドで実行できます
スケジューリングされたジョブpackage jobs;import play.*;import play.jobs.*;@Every("10s")public class EveryTenSeconds extends Job {    pri...
10日毎 ・・・   @Every("10d")10時間毎 ・・   @Every("10h")10分毎 ・・・   @Every("10mn")      or   @Every("10min")10秒毎 ・・・   @Every("10s")
PlayはCRON式もサポートしています。
CRON式でスケジュールされたジョブpackage jobs;import play.*;import play.jobs.*;import java.util.Calendar;@On("2,3,5,7,11,13,17,19,23,29,3...
CRON式(基本) * * * * * ? *   秒         分          時間         日           月        曜日           年(0-59 *)   (0-59       (0-23 ...
CRON式(応用)  各項目には(, - /)を指定できます。@On(“0,30 * * * * ?”)・・・毎分0,30秒に実行@On(“30 10-20 * * * ?”)・・毎時10~20分の間、30秒に実行@On(“5/15 * * *...
CRON式(さらなる応用)  日には(L W)、曜日には(L #)を指定できます。日のLは月の最終日。曜日のLは月の最後の曜日。@On(“0 23 59 L * ?”)・・・毎月の最終日(1月なら31日、4月なら30日)の23:59:00に実行...
CRON式を環境変数に記述可能package jobs;import play.*;                                “cron.”で始まるものは環境変数import play.jobs.*;           ...
トリガータスクジョブpublic static void encodeVideo(Long videoId) {    new VideoEncoder(videoId).now();    renderText("Encoding start...
NOTEDEV モードでアプリケーションを実行する場合、アプリケーションは最初の HTTP リクエストがあるまで始動を控えます。さらには、DEV モードの場合、アプリケーションは必要に応じて自動的に再起動することがあります。PROD モードで実...
実演
Inside of Play.jobs
@EveryはScheduledThreadPoolExecutorのscheduleWithFixedDelayメソッドで実現している。@Onはタスク終了後にcron式の次の日付を求めて、duledThreadPoolExecutorのsch...
About cron4j
cron4jってご存知ですか?
Javaでunixのcrontabを使えます!
Quick StartMyTask.javapublic class MyTask implements Runnable {    public void run() {        System.out.println("Current ...
Main.javapublic class Main {    public static void main(String[] args) {            MyTask task = new MyTask();           ...
ファイルも扱えます
Main.javapublic class Main {    public static void main(String[] args) {            Scheduler scheduler = new Scheduler();...
cron4jtab.txt0 5 * * * sol.exe0,30 * * * * OUT:C:ping.txt ping 10.9.43.550,46 * * * * "OUT:C:My Folder With Spacesping.txt...
Taskの状態を制御したり、監視したりできます。
MyTaskExecutionListener.javapublic class MyTaskExecutorListener implements TaskExecutorListener {    public void execution...
MySchedulerListener.javaimport it.sauronsoftware.cron4j.SchedulerListener;import it.sauronsoftware.cron4j.TaskExecutor;pub...
Main.javaimport it.sauronsoftware.cron4j.Scheduler;public class Main {    public static void main(String[] args) {        ...
MyTask.javaimport it.sauronsoftware.cron4j.Task;import it.sauronsoftware.cron4j.TaskExecutionContext;public class MyTask e...
ジョブの画面制御も簡単
play.jobsとちゃうとこ  ・スケジュールは分単位まで  ・前のタスクが終わらんでも、次が動く  ・タスクは毎回newされるから、状態もてない  ・Java2から使える
Thank You!
About Jobs
Upcoming SlideShare
Loading in …5
×

About Jobs

978 views
888 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
978
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

About Jobs

  1. 1. About Jobs
  2. 2. Who? s_kozake(小酒信一) I’m Java Programmer
  3. 3. こんな心意気で頑張っております Javaは亡びぬ Javaは亡びぬ 何度でも蘇るさ!! 何度でも蘇るさ!!JVMの力こそプログラマーの夢だからね。。誰だ?今「バルス」とかいった奴
  4. 4. About Jobs
  5. 5. の話じゃありません
  6. 6. play.jobs.*のお話です。
  7. 7. Playにジョブ管理機能があるのご存知でした?
  8. 8. Playのジョブ管理は結構便利です!!
  9. 9. 起動時に実行するジョブpackage jobs;import play.*;import play.jobs.*;@OnApplicationStartpublic class Bootstrap extends Job { public void doJob() { Logger.info("=== Application start ==="); }}
  10. 10. @OnApplicationStart(async=true)とすると、バックグラウンドで実行できます
  11. 11. スケジューリングされたジョブpackage jobs;import play.*;import play.jobs.*;@Every("10s")public class EveryTenSeconds extends Job { private int count = 0; public void doJob() { count++; Logger.info("=== EveryTenSeconds execute " + count + "time" + (count > 1 ? "s" : "")); }}
  12. 12. 10日毎 ・・・ @Every("10d")10時間毎 ・・ @Every("10h")10分毎 ・・・ @Every("10mn")      or @Every("10min")10秒毎 ・・・ @Every("10s")
  13. 13. PlayはCRON式もサポートしています。
  14. 14. CRON式でスケジュールされたジョブpackage jobs;import play.*;import play.jobs.*;import java.util.Calendar;@On("2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59 * * * * ?")public class EveryPrimeNumber extends Job { public void doJob() { Logger.info("=== Every prime sec " + Calendar.getInstance().get(Calendar.SECOND) + " execute " ); }}
  15. 15. CRON式(基本) * * * * * ? * 秒 分 時間 日 月 曜日 年(0-59 *) (0-59 (0-23 (1-31 * ?) (1-12 * ?) (1-7 * ?) (1970-2099 *) *) *) or or [option] (JAN-DEC) (SUN-SAT) @On(“ 2 * * * * ?”)・・・毎分2秒に実行 @On(“ 0 0 * * * ?”)・・・毎時0分に実行 @On(“30 59 23 * * ?”)・・・毎日23:59:30秒に実行 @On(“30 59 23 ? * 2”)・・・毎金曜日の23:59:30秒に実 行
  16. 16. CRON式(応用) 各項目には(, - /)を指定できます。@On(“0,30 * * * * ?”)・・・毎分0,30秒に実行@On(“30 10-20 * * * ?”)・・毎時10~20分の間、30秒に実行@On(“5/15 * * * * ?”)・・・毎分5秒から15秒毎(5,20,35,50)に実行
  17. 17. CRON式(さらなる応用) 日には(L W)、曜日には(L #)を指定できます。日のLは月の最終日。曜日のLは月の最後の曜日。@On(“0 23 59 L * ?”)・・・毎月の最終日(1月なら31日、4月なら30日)の23:59:00に実行@On(“0 23 59 ? * 6L”)・・・毎月の最後の土曜日に実行日のWは一番近い月~金曜日。例えば、15Wは15日が土曜日なら、14日の金曜日に実行。15日が日曜日なら16日の月曜日に実行。15日が火曜日なら、15日火曜日に実行。1Wは1日が土曜日なら、3日の月曜日に実行曜日の#は月の何番目の曜日か。例えば、6#3は月の3回目の金曜日。
  18. 18. CRON式を環境変数に記述可能package jobs;import play.*; “cron.”で始まるものは環境変数import play.jobs.*; と認識されるimport java.util.Calendar;@On("cron.everyprimenumber")public class EveryPrimeNumber extends Job {  :application.confcron.everyprimenumber=2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59 * * * * ?#cron.everyprimenumber=never neverを設定すると、実行されませ んよ
  19. 19. トリガータスクジョブpublic static void encodeVideo(Long videoId) { new VideoEncoder(videoId).now(); renderText("Encoding started");} nowメソッドで即時実行できます。 戻り値は予約オブジェクトで受け取 れます。
  20. 20. NOTEDEV モードでアプリケーションを実行する場合、アプリケーションは最初の HTTP リクエストがあるまで始動を控えます。さらには、DEV モードの場合、アプリケーションは必要に応じて自動的に再起動することがあります。PROD モードで実行するとき、アプリケーションはサーバの起動と同時に開始します。
  21. 21. 実演
  22. 22. Inside of Play.jobs
  23. 23. @EveryはScheduledThreadPoolExecutorのscheduleWithFixedDelayメソッドで実現している。@Onはタスク終了後にcron式の次の日付を求めて、duledThreadPoolExecutorのscheduleメソッドを毎回読んでいる。 play.jobsはjava.util.concurrentの機能を色々 使ってて、勉強になるお
  24. 24. About cron4j
  25. 25. cron4jってご存知ですか?
  26. 26. Javaでunixのcrontabを使えます!
  27. 27. Quick StartMyTask.javapublic class MyTask implements Runnable { public void run() { System.out.println("Current system time: " + new Date()); System.out.println("Another minute ticked away..."); }} タスクを書いて。。
  28. 28. Main.javapublic class Main { public static void main(String[] args) { MyTask task = new MyTask(); Scheduler scheduler = new Scheduler(); scheduler.schedule("* * * * *", task); scheduler.start(); try { Thread.sleep(5L * 60L * 1000L); } catch (InterruptedException e) { ; } scheduler.stop(); }} スケジューラを起動するだけ。。
  29. 29. ファイルも扱えます
  30. 30. Main.javapublic class Main { public static void main(String[] args) { Scheduler scheduler = new Scheduler(); scheduler.scheduleFile("* * * * *", new File("cron4jtab.txt"); scheduler.start(); :こんな感じ
  31. 31. cron4jtab.txt0 5 * * * sol.exe0,30 * * * * OUT:C:ping.txt ping 10.9.43.550,46 * * * * "OUT:C:My Folder With Spacesping.txt" ping 10.9.43.550 3 * * * ENV:JAVA_HOME=C:jdks1.4.2_15 DIR:C:myproject OUT:C:myprojectbuild.log C:myprojectbuild.bat "Nightly Build"0 1 * * * java:test.TestClass#testMethod "Iron Maiden" "Megadeth" "Black Sabbath" "Led Zeppelin" "Blind Guardian" ファイルの中身。Javaメソッド単位で起動することも、外部プロセスを起動することも 可能。 Javaの場合、class#method の形式のメソッドを呼び出し可能 メソッドはstaticでString配列をパラメータで受け取れること。記述を省いた場 合、main(String[] args)が呼ばれます。 外部プロセスを呼び出す場合、  OUT・・標準出力  IN・・・・標準入力  ENV・・環境設定  DIR・・・作業フォルダ が指定可能です。 ファイルの中身はスケジューラ実行中にも変更可能&反映されます。
  32. 32. Taskの状態を制御したり、監視したりできます。
  33. 33. MyTaskExecutionListener.javapublic class MyTaskExecutorListener implements TaskExecutorListener { public void executionPausing(TaskExecutor executor) { System.out.println("Task pausing!"); } public void executionResuming(TaskExecutor executor) { System.out.println("Task resuming!"); } public void executionStopping(TaskExecutor executor) { System.out.println("Task stopping!"); } public void executionTerminated(TaskExecutor executor, Throwable exception) { System.out.println("Task terminated!"); } public void statusMessageChanged(TaskExecutor executor, String statusMessage) { System.out.println("Task statusMessage = ["+statusMessage+"]"); } public void completenessValueChanged(TaskExecutor executor, double completenessValue) { System.out.println("Task completeness["+completenessValue * 100+"]%"); }}
  34. 34. MySchedulerListener.javaimport it.sauronsoftware.cron4j.SchedulerListener;import it.sauronsoftware.cron4j.TaskExecutor;public class MySchedulerListener implements SchedulerListener { public void taskLaunching(TaskExecutor executor) { System.out.println("Task launched!"); executor.addTaskExecutorListener(new MyTaskExecutorListener()); } public void taskSucceeded(TaskExecutor executor) { System.out.println("Task completed!"); } public void taskFailed(TaskExecutor executor, Throwable exception) { System.out.println("Task failed due to an exception!"); exception.printStackTrace(); }}
  35. 35. Main.javaimport it.sauronsoftware.cron4j.Scheduler;public class Main { public static void main(String[] args) { MySchedulerListener listener = new MySchedulerListener(); MyTask task = new MyTask(); Scheduler scheduler = new Scheduler(); scheduler.addSchedulerListener(listener); : }}
  36. 36. MyTask.javaimport it.sauronsoftware.cron4j.Task;import it.sauronsoftware.cron4j.TaskExecutionContext;public class MyTask extends Task { public boolean canBePaused() { return true; } public boolean canBeStopped() { return true; } public boolean supportsCompletenessTracking() { return true; } public boolean supportsStatusTracking() { return true; } public void execute(TaskExecutionContext context) throws RuntimeException { for (int i = 1; i <= 30; i++) { System.out.println("Task says: " + i); context.setStatusMessage("i = " + i); Taskの状況メッセージを設定 context.setCompleteness(i / 30D); try { Taskの進捗を設定 Thread.sleep(1000); } catch (InterruptedException e) { ; } context.pauseIfRequested(); if (context.isStopped()) { ポーズ要求がある場合はwait break; } } 停止要求がある場合は終了 }}
  37. 37. ジョブの画面制御も簡単
  38. 38. play.jobsとちゃうとこ ・スケジュールは分単位まで ・前のタスクが終わらんでも、次が動く ・タスクは毎回newされるから、状態もてない ・Java2から使える
  39. 39. Thank You!

×