我正在处理的应用程序接收来自外部系统的通知,我想按顺序处理这些通知,因为我遇到了一些死锁。
我正在使用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。
答案 0 :(得分:2)
我正在处理的应用程序接收来自外部的通知 系统,我想按顺序处理,因为我正在经历 一些僵局。
如果按顺序处理,则无论如何都不需要线程池。
因为,我希望通知顺序执行,我设置为1 corePoolSize和maxPoolSize
这将创建一个固定的池大小1.只有一个线程,所以它将按顺序执行
我还为“WaitForTasksToCompleteOnShutdown”设置了“false” 在每个任务执行后关闭,而不是在春天 上下文被破坏
这是错误的。此标志告诉池在关闭时等待任务完成(例如,如果调用# Version 1.0.0
,则池将等待任何正在执行的线程)
总结一下:如果你想在没有并发的情况下逐个执行,不要使用线程池