The batch and task classes are the same than into the previous tutorial.
This implementation store the ids into the memory.
# MyBatchFramework configuration file (v. 1.0) mbf.batch.className = fr.cyberteche.batchservice.test.BatchTest mbf.threadPool.minSize = 1 mbf.threadPool.maxSize = 2 mbf.threadPool.blockingQueueCapacity = 2 mbf.executionHistory.className = net.sf.mybatchfwk.history.MemoryExecutionHistory
We can see that the list of completed and failed tasks are well displayed.
18:56:32,093 INFO [BatchTest.init] ###> init
18:56:32,125 INFO [BatchTest.execute] ###> begin execute
18:56:32,125 INFO [MyTask.run] [Task '1'] begin of execution
18:56:32,125 INFO [MyTask.run] [Task '2'] begin of execution
18:56:34,125 INFO [MyTask.run] [Task '1'] execution done
18:56:34,125 INFO [BatchTest.endOfExecution] task execution success: id='1'
18:56:34,125 INFO [BatchTest.execute] ###> end execute
18:56:34,125 INFO [MyTask.run] [Task '3'] begin of execution
18:56:34,125 ERROR [BatchTest.endOfExecution] task execution failure: id='3'
net.sf.mybatchfwk.TaskExecutionException: error of execution
at net.sf.mybatchfwk.test.MyTask.run(MyTask.java:30)
at net.sf.mybatchfwk.PausableThreadPoolExecutor$Worker.runTask(PausableThreadPoolExecutor.java:400)
at net.sf.mybatchfwk.PausableThreadPoolExecutor$Worker.run(PausableThreadPoolExecutor.java:421)
at java.lang.Thread.run(Unknown Source)
18:56:34,140 INFO [MyTask.run] [Task '4'] begin of execution
18:56:34,140 INFO [MyTask.run] [Task '2'] execution done
18:56:34,140 INFO [BatchTest.endOfExecution] task execution success: id='2'
18:56:34,140 INFO [MyTask.run] [Task '5'] begin of execution
18:56:36,140 INFO [MyTask.run] [Task '4'] execution done
18:56:36,140 INFO [BatchTest.endOfExecution] task execution success: id='4'
18:56:36,140 INFO [MyTask.run] [Task '5'] execution done
18:56:36,140 INFO [BatchTest.endOfExecution] task execution success: id='5'
18:56:36,140 INFO [BatchTest.end] ###> end
18:56:36,140 INFO [BatchTest.end] ###> ---Execution report---
18:56:36,156 INFO [BatchTest.end] Begin date: Sun Oct 22 18:56:32 CEST 2006
18:56:36,156 INFO [BatchTest.end] End date: Sun Oct 22 18:56:36 CEST 2006
18:56:36,156 INFO [BatchTest.end] Number of completed tasks: 4
18:56:36,156 INFO [BatchTest.end] Completed tasks: 1, 2, 4, 5
18:56:36,156 INFO [BatchTest.end] Number of failed tasks: 1
18:56:36,171 INFO [BatchTest.end] Failed tasks: 3
18:56:36,171 INFO [BatchTest.end] ###> ----------------------
This implementation store the ids into files.
# MyBatchFramework configuration file (v. 1.0) mbf.batch.className = fr.cyberteche.batchservice.test.BatchTest mbf.threadPool.minSize = 1 mbf.threadPool.maxSize = 2 mbf.threadPool.blockingQueueCapacity = 2 mbf.executionHistory.className = net.sf.mybatchfwk.history.FileExecutionHistory mbf.executionHistory.storageFolder = c:\\test
We can see that the list of completed and failed tasks are well displayed.
19:00:38,734 INFO [BatchTest.init] ###> init
19:00:38,765 INFO [BatchTest.execute] ###> begin execute
19:00:38,765 INFO [MyTask.run] [Task '1'] begin of execution
19:00:38,765 INFO [MyTask.run] [Task '2'] begin of execution
19:00:40,765 INFO [MyTask.run] [Task '1'] execution done
19:00:40,765 INFO [BatchTest.endOfExecution] task execution success: id='1'
19:00:40,765 INFO [MyTask.run] [Task '3'] begin of execution
19:00:40,781 ERROR [BatchTest.endOfExecution] task execution failure: id='3'
net.sf.mybatchfwk.TaskExecutionException: error of execution
at net.sf.mybatchfwk.test.MyTask.run(MyTask.java:30)
at net.sf.mybatchfwk.PausableThreadPoolExecutor$Worker.runTask(PausableThreadPoolExecutor.java:400)
at net.sf.mybatchfwk.PausableThreadPoolExecutor$Worker.run(PausableThreadPoolExecutor.java:421)
at java.lang.Thread.run(Unknown Source)
19:00:40,781 INFO [MyTask.run] [Task '4'] begin of execution
19:00:40,781 INFO [MyTask.run] [Task '2'] execution done
19:00:40,781 INFO [BatchTest.endOfExecution] task execution success: id='2'
19:00:40,781 INFO [MyTask.run] [Task '5'] begin of execution
19:00:40,781 INFO [BatchTest.execute] ###> end execute
19:00:42,781 INFO [MyTask.run] [Task '4'] execution done
19:00:42,781 INFO [BatchTest.endOfExecution] task execution success: id='4'
19:00:42,781 INFO [MyTask.run] [Task '5'] execution done
19:00:42,781 INFO [BatchTest.endOfExecution] task execution success: id='5'
19:00:42,781 INFO [BatchTest.end] ###> end
19:00:42,796 INFO [BatchTest.end] ###> ---Execution report---
19:00:42,812 INFO [BatchTest.end] Begin date: Sun Oct 22 19:00:38 CEST 2006
19:00:42,812 INFO [BatchTest.end] End date: Sun Oct 22 19:00:42 CEST 2006
19:00:42,812 INFO [BatchTest.end] Number of completed tasks: 4
19:00:42,812 INFO [BatchTest.end] Completed tasks: 1, 2, 4, 5
19:00:42,812 INFO [BatchTest.end] Number of failed tasks: 1
19:00:42,812 INFO [BatchTest.end] Failed tasks: 3
19:00:42,812 INFO [BatchTest.end] ###> ----------------------
Contents of the file c:\test\mbf-completedTasks.txt:
1 2 4 5
Contents of the file c:\test\mbf-failedTasks.txt:
3
Imagine now that the user want to execute again the batch in order to execute the previously failed tasks, but without modify the java source. He just need to add two parameters, in order to specify that he doesn't want to execute the new and completed tasks:
# MyBatchFramework configuration file (v. 1.0) mbf.batch.className = fr.cyberteche.batchservice.test.BatchTest mbf.batch.executeNewTasks = false mbf.batch.executeCompletedTasks = false mbf.threadPool.minSize = 1 mbf.threadPool.maxSize = 2 mbf.threadPool.blockingQueueCapacity = 2 mbf.executionHistory.className = net.sf.mybatchfwk.history.FileExecutionHistory mbf.executionHistory.storageFolder = c:\\test
Execution logs:
19:36:55,718 INFO [BatchTest.init] ###> init
19:36:55,750 INFO [BatchTest.execute] ###> begin execute
19:36:55,750 INFO [BatchTest.execute] ###> end execute
19:36:55,750 INFO [MyTask.run] [Task '3'] begin of execution
19:36:55,781 ERROR [BatchTest.endOfExecution] task execution failure: id='3'
net.sf.mybatchfwk.TaskExecutionException: error of execution
at net.sf.mybatchfwk.test.MyTask.run(MyTask.java:30)
at net.sf.mybatchfwk.PausableThreadPoolExecutor$Worker.runTask(PausableThreadPoolExecutor.java:400)
at net.sf.mybatchfwk.PausableThreadPoolExecutor$Worker.run(PausableThreadPoolExecutor.java:421)
at java.lang.Thread.run(Unknown Source)
19:36:55,781 INFO [BatchTest.end] ###> end
19:36:55,781 INFO [BatchTest.end] ###> ---Execution report---
19:36:55,796 INFO [BatchTest.end] Begin date: Sun Oct 22 19:36:55 CEST 2006
19:36:55,796 INFO [BatchTest.end] End date: Sun Oct 22 19:36:55 CEST 2006
19:36:55,796 INFO [BatchTest.end] Number of completed tasks: 0
19:36:55,812 INFO [BatchTest.end] Completed tasks:
19:36:55,812 INFO [BatchTest.end] Number of failed tasks: 1
19:36:55,812 INFO [BatchTest.end] Failed tasks: 3
19:36:55,812 INFO [BatchTest.end] ###> ----------------------
With the three parameters executeNewTasks, executeCompletedTasks and executeFailedTasks, the user can filter the tasks before execution. Six possibilities of filtration: new+completed, new+failed, completed+failed, new, failed, completed.