Java Spring批处理自定义编写器关闭方法被调用两次(需要特殊处理)

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

我有以下writer类原型:

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="")