我正在创建一个由Log4J appender组成的库,它异步地将事件发送到远程服务器。在创建日志语句时,appender会将事件异步记录到本地队列中,然后消费者池将检索并发送到远程。JMS是否需要持久阻塞队列?
完全内存解决方案将创建一个BlockingQueue来处理并发问题。但是,我希望队列被保留,这样如果远程服务器不可用,我不会将队列扩大或者在有限队列的情况下开始丢弃消息。
我正在考虑使用嵌入式H2数据库在本地存储事件,然后使用轮询机制来检索事件并发送到远程。我更愿意使用BlockingQueue而不是轮询数据库表。
JMS是答案吗?
编辑:
如果JMS是答案,这似乎是想通过这种方式,没有任何人有对可配置为只接受过程中的消息的轻量级的,可嵌入的JMS解决方案的建议?换句话说,我不想,也可能不会被允许打开一个TCP套接字来侦听。
编辑:
我有现在的ActiveMQ嵌入式和它似乎是工作。谢谢大家。
要知道JMS的实现,你正在使用以及基础设施如何建立。 JMS的一些实现允许多个线程同时读取和处理消息。从队列获取的角度来看,这保留了FIFO,但从处理消息的角度来看,不一定保留FIFO。再次检查一下你的实现。如果您正在运行支持并发读取的JMS,那么只要确保它被调整为禁止它们即可。或者如果你不在乎,那么你可以忽略我刚才所说的。 :) – 2010-11-15 13:53:17
谢谢。如果某些数据稍微无序,因为它可以按事件数据排序,那么也可以。我对JMS的关注是整合另一个库的开销。有许多不同的JMS实现 - 是否有比其他实现更容易实现的实现,并且可以嵌入式方式运行? – Collin 2010-11-15 13:58:02
我想找一个只支持通过JMS 1.1和/或1.2规范访问它的JMS实现。通过这种方式,您可以仅使用API以编程方式读取和写入队列。我之所以提到实现的唯一原因是,有时你必须使用供应商实现来配置某些东西来打开/关闭并发等。在我的情况下,我们坚持使用IBM产品,使我的公司热爱蓝色。但是你可能会逃避任何实现。在我们的例子中,我仍然告诉我们的开发人员坚持只使用API,并且不做特定的实现。 – 2010-11-15 19:46:05