2011-05-18 19 views
5

我目前正在研究一系列警报,这些警告将检查来自外部Web服务的响应的状态,并根据响应对象的状态发送警报(用于例如超时,无效数据等)。我希望主线程在评估响应并发送警报时继续工作。使用后台线程与使用消息队列

我提供给我两个直接的选择:

  1. 使用ActiveMQ的发送对象为ObjectMessage的object队列进行处理。
  2. 使用命令模式并使用处理警报的异步命令。

这两个对我来说都是很不错的选择,但我倾向于使用线索命令,因为我不需要消息队列的大部分功能。

问题:你将如何决定使用哪一个?为什么?

回答

6

两个字:

保证交付。

如果这对你很重要,那么消息队列就是你想要的。

+0

这是真的。我可以使用一个持续队列来提高重启和其他服务器事件的可靠性。 – 2011-05-18 00:36:40

1

我会根据你已经在想什么来决定......一个完整的消息队列虽然非常强大,却比你需要的方式更大。更不用说它是另一个进程/服务器/等等。所以,我会为第二个选项投票。 :-)

+0

是的,我也这样倾斜。我应该提到activemq已经在这个应用程序中做了一堆东西,并且正在使用webapp运行在jvm上。 – 2011-05-18 00:35:00

2

这听起来像是你在一起处理应用程序中的事件。为此,您在java.util.concurrent包中有很多选项。消息队列有利于保证传递(可以提供持久性)并允许消息传递给多个服务器。

util.concurrent的ExecutorService允许您提交要在线程池上执行的任务。它返回的将来可以让你继续处理并在稍后检查结果。

Future<?> submit(Runnable task) 

如果这不完全符合您的要求,那么java.util.concurrent中可能还有其他选项。

+0

这是一个很好的观点 - 如果在整个集群中这是必要的,消息队列可能更有意义,但在这种情况下,因为每个服务器只处理命令可以在每个服务器上进行线程化的一部分响应。另一方面,持续队列将提高可靠性... – 2011-05-18 00:47:17

+0

@Dave正确,它会提高可靠性。这是一个要求吗?请记住,如果你的应用程序崩溃,如果事件丢失了,它是否重要?这取决于应用程序的类型,如果重要的话。 – 2011-05-18 00:49:43

+0

在这种情况下,100%的可靠性并不是必需条件,但它不会损害任何事情以期望可靠的警报,并且我还没有开始编写代码......您是否从您的一次资源成本体验中获得了一般意义与其他? – 2011-05-18 00:52:42