2017-06-21 74 views
0

我有一个相当复杂的应用程序(这是一个命令和控制中心弹簧+基于角度的应用程序,旨在供警察和其他应急中心控制器使用)。按正确顺序处理方法/线程

应用程序的主要组件(让我们称之为主干[spring web app])与不同的应用程序/硬件进行通信。大部分通信都是通过使用RabbitMQ消息完成的(让我们称它们为电报或简称为TM)。

当创建骨干新线程时收到其中一个TM,并在其中执行一些方法/方法。

问题在于它可能发生骨干几乎同时接收两个或多个TM,并且由于它们在不同线程中执行,可能会发生这样的情况,即它们未按照到达的顺序进行调整,因此出现错误的信息呈现给用户。

通常,我用Redis处理的这类问题。我有一个Redis的锁,基本上看起来像这样

distributedRedisLocker.lock(() -> { 
    executeSomeMethod(); 
}, howLongIsLockKept, howLongDoWeWaitForItToFinnish); 

但在这种情况下,我想避免使用Redis的,没有任何其他的Java /基于弹簧的解决方案呢?

我不需要它与我拥有的redis锁一样,只是我想要的是TMs按照它们到达的顺序被处理,并且如果它们中的一个在方法执行中某处失败,它不会阻止下一个一个永远。

+3

在像Executors.newSingleThreadExecutor()这样的单线程执行程序中处理这些TM如何? –

+0

这听起来很正确,会尝试一下并更新进度。 – mirzak

回答

1

转发为答案。

解决您的问题的一种方法是避免并发。你可以使用Executors.newSingleThreadExecutor()只使用一个线程:

ExecutorService executor = Executors.newSingleThreadExecutor(); 

然后

executor.execute(...); 

executor.submit(...); 

这将帮助你避免竞争:如果一些TM A被添加到执行队列由该执行者在一些TM B之前定义,然后A将作为整体在B之前执行。除了可以包含在执行程序实现中的隐式锁,但是它们被封装并且不会在发生错误时永远保持交付状态),所以不涉及显式锁。

有一个微妙的时刻:如果两个TMs在同一时间到达,那么不可能预测哪个将会在更早和稍后添加。

+0

我想知道的是,如果我拥有不同类型的TM,并且如果我同时获得两个TM但具有不同类型,我希望它们立即执行,而不是等待第一个TMMS。这会起作用吗? – mirzak

+0

不同类型的TM是否相互独立?如果可以同时执行它们,则可以为每个TM类型创建一个单线程执行程序,并在TM类型选择的执行程序上执行TM。 –

+0

是的,它们是独立的。将尽力去做。我在想它,我认为这可以用java同步块来完成。 – mirzak