Spring TaskExecutor实现

时间:2018-05-22 09:41:49

标签: java spring multithreading executor

我正在处理的应用程序接收来自外部系统的通知,我想按顺序处理这些通知,因为我遇到了一些死锁。

我正在使用Spring的TaskExecutor,它相当于JDK 1.5的执行程序。

我已通过以下方式实施了它:

我是一个包含1个方法的java接口:

    public interface AsynchronousService {
    void executeAsynchronously(Runnable task);
}

和相应的实现:

    public class AsynchronousServiceImpl implements AsynchronousService {

    private TaskExecutor taskExecutor;

    @Override
    public void executeAsynchronously(Runnable task) {
        taskExecutor.execute(task);
    }

    @Required
    public void setTaskExecutor(TaskExecutor taskExecutor) {
        this.taskExecutor = taskExecutor;
    }
}

这是TaskExecutor的配置。我不确定这个配置。因为,我希望通知顺序执行,我为corePoolSize和maxPoolSize设置了1。这意味着在线程池中只创建一个线程,并从队列中顺序检索通知。我也设置了#34; false" for" WaitForTasksToCompleteOnShutdown"为了在每个任务执行后不关闭,而是在弹出上下文被销毁时。我的假设一般是否正确?

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="1"/>
    <property name="maxPoolSize" value="1"/>
    <property name="WaitForTasksToCompleteOnShutdown" value="false"/>
</bean>

然后我执行代码:

 asynchronousService.executeAsynchronously(new Runnable() {
     @Override
     public void run() {
         someMethod.processNotification(notification)
      }
   });

您如何看待我的实施?我错过了什么? 我不确定是否需要实现某些错误处理?

编辑: 有没有可能在春天调整任务执行器的实现来使用自定义队列?或者优先排序队列中的任务有多困难?我查看了一些实现,但是大多数实现都是从sratch实现执行器服务而不使用Spring。

1 个答案:

答案 0 :(得分:2)

  

我正在处理的应用程序接收来自外部的通知   系统,我想按顺序处理,因为我正在经历   一些僵局。

如果按顺序处理,则无论如何都不需要线程池。

  

因为,我希望通知顺序执行,我设置为1   corePoolSize和maxPoolSize

这将创建一个固定的池大小1.只有一个线程,所以它将按顺序执行

  

我还为“WaitForTasksToCompleteOnShutdown”设置了“false”   在每个任务执行后关闭,而不是在春天   上下文被破坏

这是错误的。此标志告诉池在关闭时等待任务完成(例如,如果调用# Version 1.0.0,则池将等待任何正在执行的线程)

总结一下:如果你想在没有并发的情况下逐个执行,不要使用线程池