【问题标题】:Java internal message queue /JMSJava内部消息队列/JMS
【发布时间】:2013-03-10 13:10:50
【问题描述】:

我有一个我正在重写的 Web 应用程序,它当前执行大量的审计数据 sql 写入。用户交互的每一步都会导致执行一个将一些信息写入数据库的方法。 这可能会因数据库问题导致交互停止,从而影响用户。

理想情况下,我想移动这是一种基于消息的方法,如果需要写入数据,它也会从队列中触发,消费者在队列中拾取这些数据并将它们写入数据库。它不是必要的数据,如果服务器出现故障,丢失是可以接受的。

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

最好的方法是什么?

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

【问题讨论】:

  • 你可以使用 ActiveMQ..
  • @Anubhab,当已经有 JMS 代理运行时,ActiveMQ 嵌入在 WebSphere 中,真的吗??

标签: java spring jms message-queue


【解决方案1】:

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

由于您已经在 WebSphere 机器上运行,因此您确实有一个 JMS 代理 (SIBus)。启动异步操作的最简单方法是发送 JMS 消息并让 MDB 读取它们 - 并进行数据库插入。您可能会遇到一些问题,在 WebSphere 中生成自己的线程仍然可以利用 JNDI 资源的初始上下文。

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

【讨论】:

  • 我知道在 WebSphere 中产生线程的问题 - 但已经找到了使用工作池的方法。我不熟悉 SIBus - 这可以用作内部代理吗?那么只需创建一个内部队列并通过 JNDI 引用它?在这种情况下,您是否有更多关于使用 SIBus 的参考资料 - 从快速谷歌上我只能找到高级 IBM 信息
  • 这出现在谷歌搜索的顶部,涵盖了您需要的内容:ibm.com/developerworks/websphere/techjournal/0504_reinitz/…
【解决方案2】:

根据您对问题的描述,一个简单的队列就足够了。你可以有一个固定大小的队列,如果消息填得太快,你可以丢弃消息,因为你说它们并不重要。

需要考虑的事项:

  • 其他应用程序是否也需要此功能,现在还是在 未来。
  • 产生消息的速度是否如此巨大以至于它可以启动 大量用户登录时消耗大量堆内存 in. 重要的是如果消息不应该丢失。

【讨论】:

    【解决方案3】:

    我认为使用 JMS 进行日志记录是多余的,尤其是如果登录是使用 JMS 的唯一原因。

    看看DBAppender,可以直接登录数据库。如果您关心性能,您可以使用 Logback 异步记录。

    如果你仍然想采用 JMS 方式,那么 Logback 有 JMS Queue & Topic appenders

    【讨论】:

    • 需要明确的是,日志记录是将审计信息(用户 x 此时执行此操作)写入 SQL 数据库。我不是指应用程序日志记录。
    • 我的答案应该是审计或应用程序日志记录 :)
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 2014-02-02
      • 2014-09-16
      • 2011-10-01
      • 2015-02-25
      • 1970-01-01
      • 2010-09-19
      • 2011-06-14
      • 2014-03-29
      相关资源
      最近更新 更多