Java Spring批处理自定义编写器关闭方法被调用两次(需要特殊处理)
我有以下writer类原型:Java Spring批处理自定义编写器关闭方法被调用两次(需要特殊处理),java,spring,spring-batch,Java,Spring,Spring Batch,我有以下writer类原型: public class MyWriter extends AbstractItemStreamItemWriter<FieldSet> { ... @Override public void close() { ... { ... } 作业是从MQ侦听器触发的,如下所示: @Autowired private Job job; @Autowired private JobLaunche
public class MyWriter extends AbstractItemStreamItemWriter<FieldSet> {
...
@Override
public void close()
{
...
{
...
}
作业是从MQ侦听器触发的,如下所示:
@Autowired
private Job job;
@Autowired
private JobLauncher jobLauncher;
@JmsListener(destination = "queue_name")
public void receiveMessage(TextMessage message) throws JMSException
{
log.warn("Received message {} with listener {}.", message, this);
JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
// add job parameters here
...
JobParameters jobParameters = jobParametersBuilder.toJobParameters();
try
{
JobExecution jobExecution = jobLauncher.run(job, jobParameters);
log.trace("jobExecution = " + jobExecution);
}
catch (JobExecutionException jee)
{
log.warn("Could not run job {}", job);
}
}
我遇到的问题是MyWriter的close方法被调用了两次。每个调用的堆栈跟踪是:
Thread [DefaultMessageListenerContainer-2] (Suspended (breakpoint at line 162 in MyWriter))
MyWriter.close() line: 162
MyWriter$$FastClassBySpringCGLIB$$80508a22.invoke(int, Object, Object[]) line: not available
MethodProxy.invoke(Object, Object[]) line: 204
CglibAopProxy$CglibMethodInvocation.invokeJoinpoint() line: 720
CglibAopProxy$CglibMethodInvocation(ReflectiveMethodInvocation).proceed() line: 157
DelegatingIntroductionInterceptor.doProceed(MethodInvocation) line: 133
DelegatingIntroductionInterceptor.invoke(MethodInvocation) line: 121
CglibAopProxy$CglibMethodInvocation(ReflectiveMethodInvocation).proceed() line: 179
CglibAopProxy$DynamicAdvisedInterceptor.intercept(Object, Method, Object[], MethodProxy) line: 655
MyWriter$$EnhancerBySpringCGLIB$$e345242b.close() line: not available
CompositeItemStream.close() line: 85
TaskletStep.close(ExecutionContext) line: 305
TaskletStep(AbstractStep).execute(StepExecution) line: 271
--> SimpleStepHandler.handleStep(Step, JobExecution) line: 148
SimpleJob(AbstractJob).handleStep(Step, JobExecution) line: 392
SimpleJob.doExecute(JobExecution) line: 135
SimpleJob(AbstractJob).execute(JobExecution) line: 306
SimpleJobLauncher$1.run() line: 135
SyncTaskExecutor.execute(Runnable) line: 50
SimpleJobLauncher.run(Job, JobParameters) line: 128
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 497
AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) line: 302
ReflectiveMethodInvocation.invokeJoinpoint() line: 190
ReflectiveMethodInvocation.proceed() line: 157
SimpleBatchConfiguration$PassthruAdvice.invoke(MethodInvocation) line: 127
ReflectiveMethodInvocation.proceed() line: 179
JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 208
$Proxy105.run(Job, JobParameters) line: not available
MyMQListener$$EnhancerBySpringCGLIB$$28277c0e(MyMQListener).receiveMessage(TextMessage) line: 74
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 497
InvocableHandlerMethod.doInvoke(Object...) line: 198
InvocableHandlerMethod.invoke(Message<?>, Object...) line: 116
MessagingMessageListenerAdapter.invokeHandler(Message, Session, Message<?>) line: 90
MessagingMessageListenerAdapter.onMessage(Message, Session) line: 66
DefaultMessageListenerContainer(AbstractMessageListenerContainer).doInvokeListener(SessionAwareMessageListener, Session, Message) line: 721
DefaultMessageListenerContainer(AbstractMessageListenerContainer).invokeListener(Session, Message) line: 681
DefaultMessageListenerContainer(AbstractMessageListenerContainer).doExecuteListener(Session, Message) line: 651
DefaultMessageListenerContainer(AbstractPollingMessageListenerContainer).doReceiveAndExecute(Object, Session, MessageConsumer, TransactionStatus) line: 315
DefaultMessageListenerContainer(AbstractPollingMessageListenerContainer).receiveAndExecute(Object, Session, MessageConsumer) line: 253
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener() line: 1150
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop() line: 1142
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run() line: 1039
Thread.run() line: 745
线程[DefaultMessageListenerContainer-2](挂起(MyWriter中第162行的断点))
MyWriter.close()行:162
MyWriter$$FastClassBySpringCGLIB$$80508a22.调用(int,Object,Object[])行:不可用
调用(对象,对象[])行:204
CglibAopProxy$CglibMethodInvocation.invokeJoinpoint()行:720
CglibAopProxy$CglibMethodInvocation(ReflectiveMethodInvocation).procedue()行:157
DelegatingIntroductionInterceptor.doProceed(方法调用)行:133
DelegatingIntroductionInterceptor.invoke(方法调用)行:121
CglibAopProxy$CglibMethodInvocation(ReflectiveMethodInvocation).procedue()行:179
CglibAopProxy$DynamicAdvisedInterceptor.intercept(对象,方法,对象[],方法代理)行:655
MyWriter$$EnhancerBySpringCGLIB$$e345242b.close()行:不可用
CompositeItemStream.close()行:85
TaskletStep.close(ExecutionContext)行:305
TaskletStep(AbstractStep).execute(StepExecution)行:271
-->SimpleStreamHandler.handleStep(步骤,作业执行)行:148
SimpleJob(AbstractJob).handleStep(步骤,作业执行)行:392
SimpleJob.doExecute(作业执行)行:135
SimpleJob(AbstractJob).execute(JobExecution)行:306
simplejoblancher$1.run()行:135
SyncTaskExecutor.execute(可运行)行:50
simplejoblancher.run(作业、作业参数)行:128
NativeMethodAccessorImpl.invoke0(方法、对象、对象[])行:不可用[本机方法]
NativeMethodAccessorImpl.invoke(对象,对象[])行:62
DelegatingMethodAccessorImpl.invoke(对象,对象[])行:43
调用(对象,对象…)行:497
AopUtils.invokeJoinpointUsingReflection(对象、方法、对象[])行:302
ReflectiveMethodInvocation.invokeJoinpoint()行:190
ReflectiveMethodInvocation.procedure()行:157
SimpleBatchConfiguration$PassthruAdvice.invoke(MethodInvocation)行:127
ReflectiveMethodInvocation.procedure()行:179
调用(对象、方法、对象[])行:208
$Proxy105.运行(作业、作业参数)行:不可用
MyMQListener$$EnhancerBySpringCGLIB$$28277c0e(MyMQListener)。接收消息(文本消息)行:74
NativeMethodAccessorImpl.invoke0(方法、对象、对象[])行:不可用[本机方法]
NativeMethodAccessorImpl.invoke(对象,对象[])行:62
DelegatingMethodAccessorImpl.invoke(对象,对象[])行:43
调用(对象,对象…)行:497
InvocableHandlerMethod.doInvoke(对象…)行:198
InvocableHandlerMethod.invoke(消息、对象…)行:116
MessagingMessageListenerAdapter.invokeHandler(消息、会话、消息)行:90
消息(消息,会话)行:66
DefaultMessageListenerContainer(AbstractMessageListenerContainer).doInvokeListener(SessionAwareMessageListener,会话,消息)行:721
DefaultMessageListenerContainer(AbstractMessageListenerContainer).invokeListener(会话,消息)行:681
DefaultMessageListenerContainer(AbstractMessageListenerContainer).doExecuteListener(会话,消息)行:651
DefaultMessageListenerContainer(AbstractPollingMessageListenerContainer).doReceiveAndExecute(对象、会话、MessageConsumer、事务状态)行:315
DefaultMessageListenerContainer(AbstractPollingMessageListenerContainer).receiveAndExecute(对象、会话、MessageConsumer)行:253
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener()行:1150
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop()行:1142
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run()行:1039
Thread.run()行:745
及
线程[DefaultMessageListenerContainer-2](挂起(MyWriter中第162行的断点))
MyWriter.close()行:162
NativeMethodAccessorImpl.invoke0(方法、对象、对象[])行:不可用[本机方法]
NativeMethodAccessorImpl.invoke(对象,对象[])行:62
DelegatingMethodAccessorImpl.invoke(对象,对象[])行:43
调用(对象,对象…)行:497
DisposableBeanAdapter.invokeCustomDestroyMethod(方法)行:354
DisposableBeanAdapter.destroy()行:277
DisposableBeanAdapter.run()行:236
StepContext.close()行:213
StepSynchronizationManager$1.关闭(StepContext)行:53
StepSynchronizationManager$1.关闭(对象)行:36
StepSynchronizationManager$1(SynchronizationManager支持).release()行:190
StepSynchronizationManager.release()行:112
TaskletStep(AbstractStep).doExecutionRelease()行:290
TaskletStep(AbstractStep).execute(StepExecution)行:278
-->SimpleStreamHandler.handleStep(步骤,作业执行)行:148
SimpleJob(AbstractJob).handleStep(步骤,作业执行)行:392
SimpleJob.doExecute(作业执行)行:135
SimpleJob(AbstractJob).execute(JobExecution)行:306
simplejoblancher$1.run()行:135
SyncTaskExecutor.execute(可运行)行:50
simplejoblancher.run(作业、作业参数)行:128
NativeMethodAccessorImpl.invoke0(方法、对象、对象[])行:不可用[本机方法]
NativeMethodAccessorImpl.invoke(对象,对象[])行:62
DelegatingMethodAccessorImpl.invoke(对象,对象[])行:43
调用(对象,对象…)行:497
AopUtils.invokeJoinpointUsingReflection(对象、方法、对象[])行:302
ReflectiveMethodInvocation.invokeJoinpoint()行:
Thread [DefaultMessageListenerContainer-2] (Suspended (breakpoint at line 162 in MyWriter))
MyWriter.close() line: 162
MyWriter$$FastClassBySpringCGLIB$$80508a22.invoke(int, Object, Object[]) line: not available
MethodProxy.invoke(Object, Object[]) line: 204
CglibAopProxy$CglibMethodInvocation.invokeJoinpoint() line: 720
CglibAopProxy$CglibMethodInvocation(ReflectiveMethodInvocation).proceed() line: 157
DelegatingIntroductionInterceptor.doProceed(MethodInvocation) line: 133
DelegatingIntroductionInterceptor.invoke(MethodInvocation) line: 121
CglibAopProxy$CglibMethodInvocation(ReflectiveMethodInvocation).proceed() line: 179
CglibAopProxy$DynamicAdvisedInterceptor.intercept(Object, Method, Object[], MethodProxy) line: 655
MyWriter$$EnhancerBySpringCGLIB$$e345242b.close() line: not available
CompositeItemStream.close() line: 85
TaskletStep.close(ExecutionContext) line: 305
TaskletStep(AbstractStep).execute(StepExecution) line: 271
--> SimpleStepHandler.handleStep(Step, JobExecution) line: 148
SimpleJob(AbstractJob).handleStep(Step, JobExecution) line: 392
SimpleJob.doExecute(JobExecution) line: 135
SimpleJob(AbstractJob).execute(JobExecution) line: 306
SimpleJobLauncher$1.run() line: 135
SyncTaskExecutor.execute(Runnable) line: 50
SimpleJobLauncher.run(Job, JobParameters) line: 128
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 497
AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) line: 302
ReflectiveMethodInvocation.invokeJoinpoint() line: 190
ReflectiveMethodInvocation.proceed() line: 157
SimpleBatchConfiguration$PassthruAdvice.invoke(MethodInvocation) line: 127
ReflectiveMethodInvocation.proceed() line: 179
JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 208
$Proxy105.run(Job, JobParameters) line: not available
MyMQListener$$EnhancerBySpringCGLIB$$28277c0e(MyMQListener).receiveMessage(TextMessage) line: 74
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 497
InvocableHandlerMethod.doInvoke(Object...) line: 198
InvocableHandlerMethod.invoke(Message<?>, Object...) line: 116
MessagingMessageListenerAdapter.invokeHandler(Message, Session, Message<?>) line: 90
MessagingMessageListenerAdapter.onMessage(Message, Session) line: 66
DefaultMessageListenerContainer(AbstractMessageListenerContainer).doInvokeListener(SessionAwareMessageListener, Session, Message) line: 721
DefaultMessageListenerContainer(AbstractMessageListenerContainer).invokeListener(Session, Message) line: 681
DefaultMessageListenerContainer(AbstractMessageListenerContainer).doExecuteListener(Session, Message) line: 651
DefaultMessageListenerContainer(AbstractPollingMessageListenerContainer).doReceiveAndExecute(Object, Session, MessageConsumer, TransactionStatus) line: 315
DefaultMessageListenerContainer(AbstractPollingMessageListenerContainer).receiveAndExecute(Object, Session, MessageConsumer) line: 253
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener() line: 1150
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop() line: 1142
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run() line: 1039
Thread.run() line: 745
Thread [DefaultMessageListenerContainer-2] (Suspended (breakpoint at line 162 in MyWriter))
MyWriter.close() line: 162
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 497
DisposableBeanAdapter.invokeCustomDestroyMethod(Method) line: 354
DisposableBeanAdapter.destroy() line: 277
DisposableBeanAdapter.run() line: 236
StepContext.close() line: 213
StepSynchronizationManager$1.close(StepContext) line: 53
StepSynchronizationManager$1.close(Object) line: 36
StepSynchronizationManager$1(SynchronizationManagerSupport<E,C>).release() line: 190
StepSynchronizationManager.release() line: 112
TaskletStep(AbstractStep).doExecutionRelease() line: 290
TaskletStep(AbstractStep).execute(StepExecution) line: 278
--> SimpleStepHandler.handleStep(Step, JobExecution) line: 148
SimpleJob(AbstractJob).handleStep(Step, JobExecution) line: 392
SimpleJob.doExecute(JobExecution) line: 135
SimpleJob(AbstractJob).execute(JobExecution) line: 306
SimpleJobLauncher$1.run() line: 135
SyncTaskExecutor.execute(Runnable) line: 50
SimpleJobLauncher.run(Job, JobParameters) line: 128
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 497
AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) line: 302
ReflectiveMethodInvocation.invokeJoinpoint() line: 190
ReflectiveMethodInvocation.proceed() line: 157
SimpleBatchConfiguration$PassthruAdvice.invoke(MethodInvocation) line: 127
ReflectiveMethodInvocation.proceed() line: 179
JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 208
$Proxy105.run(Job, JobParameters) line: not available
MyMQListener$$EnhancerBySpringCGLIB$$28277c0e(MyMQListener).receiveMessage(TextMessage) line: 74
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 497
InvocableHandlerMethod.doInvoke(Object...) line: 198
InvocableHandlerMethod.invoke(Message<?>, Object...) line: 116
MessagingMessageListenerAdapter.invokeHandler(Message, Session, Message<?>) line: 90
MessagingMessageListenerAdapter.onMessage(Message, Session) line: 66
DefaultMessageListenerContainer(AbstractMessageListenerContainer).doInvokeListener(SessionAwareMessageListener, Session, Message) line: 721
DefaultMessageListenerContainer(AbstractMessageListenerContainer).invokeListener(Session, Message) line: 681
DefaultMessageListenerContainer(AbstractMessageListenerContainer).doExecuteListener(Session, Message) line: 651
DefaultMessageListenerContainer(AbstractPollingMessageListenerContainer).doReceiveAndExecute(Object, Session, MessageConsumer, TransactionStatus) line: 315
DefaultMessageListenerContainer(AbstractPollingMessageListenerContainer).receiveAndExecute(Object, Session, MessageConsumer) line: 253
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener() line: 1150
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop() line: 1142
DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run() line: 1039
Thread.run() line: 745
@Bean(destroyMethod="")