使用分区的一些线程的Spring批处理挂起

时间:2016-09-30 20:25:37

标签: spring grails groovy spring-batch

我们在Grails应用程序之上使用Spring Batch v2.1.9来每天处理100k个事务。此批处理作业的一个步骤必须从MongoDB读取这些事务,通过进行几个REST调用并更改状态来处理它们,最后将它们保存回MongoDB。这一特定步骤是使用本地分区器来尝试提高执行速度,现在在网格大小上使用100个线程。问题是,有时几个从属步骤卡住而不会继续,并使作业处于甚至无法重新启动的状态。 我的主步和从步配置是这样的:

batch.step(id: 'rulesMaster', next: 'filesBuilder') {
   batch.partition(step: 'jerseyRulesSlave', partitioner: 'rangePartitioner') {
        batch.handler('grid-size': 100, 'task-executor': 'taskExecutor')
   }
   batch.listeners {
        batch.listener(ref: "rulesStepConfigsLoaderListener")
   }
}

taskExecutor(SimpleAsyncTaskExecutor)

batch.step(id: 'rulesSlave') {
    batch.tasklet {
        batch.chunk(
            reader: 'transactionItemReader',
            processor: 'transactionProcessor',
            writer: 'transactionWriter',
            'commit-interval': 200
        )
    }
}

我们使用MySQL运行Spring Batch,在BATCH_STEP_EXECUTION上我们在COMPLETED状态下有这样的行:

STEP_EXECUTION_ID=10592, 
VERSION='5',
STEP_NAME='rulesSlave:partition88',
JOB_EXECUTION_ID='2045',
START_TIME='2016-09-30 02:08:19', 
END_TIME='2016-09-30 02:48:38',
STATUS='COMPLETED', 
COMMIT_COUNT='3', 
READ_COUNT= '582', 
FILTER_COUNT='0', 
WRITE_COUNT='582', 
READ_SKIP_COUNT='0', 
WRITE_SKIP_COUNT='0', 
PROCESS_SKIP_COUNT='0', 
ROLLBACK_COUNT='0', 
EXIT_CODE='COMPLETED', 
EXIT_MESSAGE='', 
LAST_UPDATED='2016-09-30 02:48:38'

和EXECUTING状态一样:

STEP_EXECUTION_ID='10593', 
VERSION='1', 
STEP_NAME='rulesSlave:partition89', 
JOB_EXECUTION_ID='2045', 
START_TIME='2016-09-30 02:08:20', 
END_TIME=NULL, 
STATUS='STARTED', 
COMMIT_COUNT='0', 
READ_COUNT='0', 
FILTER_COUNT='0', 
WRITE_COUNT='0', 
READ_SKIP_COUNT='0', 
WRITE_SKIP_COUNT='0', 
PROCESS_SKIP_COUNT='0', 
ROLLBACK_COUNT='0', 
EXIT_CODE='EXECUTING', 
EXIT_MESSAGE='', 
LAST_UPDATED='2016-09-30 02:08:20'

我们有几个问题:

  • 我们错过了什么吗?是否有任何错误配置?
  • 有没有办法手动更新Spring批处理表上的行以使作业处于可重新启动状态?
  • 我们怎么能注意到奴隶的步骤被卡住了所以我们可以发出警报?

在此先感谢,任何帮助将不胜感激!

0 个答案:

没有答案