2013-03-21 127 views
2

我有一个Web应用程序,我正在重写当前执行大量的审计数据sql写入。用户交互的每一步都会产生一个将某些信息写入数据库的方法。 这有可能通过导致交互停止由于数据库问题而影响用户。Java内部消息队列/ JMS

理想情况下,我想移动这是一种基于消息的方法,如果需要写入数据,它也会被排除在队列之外,消费者将其选中并将其写入数据库。这不是重要数据,如果服务器出现故障,丢失是可以接受的。

如果我应该尝试使用嵌入式JMS队列和代理或Java队列,我只是有点困惑。或者我不熟悉的东西(建议?)

什么是最好的方法?

更多信息: 该应用程序使用spring并运行在websphere 6.所有消息通信是本地的,它不会与另一台服务器通信。

+0

您可以使用ActiveMQ .. – Anubhab 2013-03-21 06:14:01

+0

@Anubhab,ActiveMQ嵌入在WebSphere中,当已经有一个JMS代理运行时,真的吗? – 2013-03-26 22:42:30

回答

0

只有在涉及不同的服务器时,我才会使用JMS队列。所以在你的情况下,我会用简单纯Java和一些Java队列来完成它。

1

我认为使用JMS进行日志记录是矫枉过正的,特别是如果登录是使用JMS的唯一原因。

看看DBAppender,你可以直接登录数据库。如果性能是您关心的问题,那么可以使用Logback进行异步日志记录。

如果你还想去JMS方式的logback然后有JMS Queue & Topic追加程序

+0

要明确,日志记录正在将审计信息(此时用户x执行此操作)写入SQL数据库。我不是指应用程序日志记录。 – NathanS 2013-03-21 07:43:54

+0

我的答案应该用于审计或应用程序日志:) – 2013-03-21 09:07:13

1

一个普通的队列就足够了根据您的问题描述。您可以拥有一个固定大小的队列并放弃消息,因为您认为他们并不重要。

需要考虑的事情:

  • 被其他应用程序需要太多,现在或将来 此功能。
  • 生产邮件的速度如此之大,以至于当大量用户登录时,它可以启动 消耗大量堆内存。 英寸重要的是,如果邮件不应该丢失。
1

但我不确定这是否是Java EE容器内的最佳实践。

由于您已经在WebSphere机器上运行,所以您确实有一个JMS代理(SIBus)。启动异步事件的最简单方法是发送JMS消息并让MDB读取它们并执行数据库插入操作。您可能在WebSphere中产生自己的线程时仍然可以使用JNDI资源的初始上下文。

在非Java EE的情况下,我会使用类似于普通LinkedBlockingQueue或任何阻塞队列的东西,并且只需要一个线程轮询该队列以便将新消息插入到数据库中。

+0

我知道有关WebSphere中spawn线程的问题 - 但已经找到了解决此问题的方法,即使用工作池。我不熟悉SIBus - 这可以用作内部经纪人吗?那么只需创建一个内部队列并通过JNDI引用它呢?在这种情况下,您是否还有更多关于使用SIBus的参考资料 - 从快速谷歌我只能找到高级IBM信息 – NathanS 2013-03-25 23:43:46

+0

这出现在谷歌搜索的顶部,并涵盖您需要:http://www.ibm.com/developerworks /websphere/techjournal/0504_reinitz/0504_reinitz.html – 2013-03-26 06:34:47