【问题标题】:Whats the best way to process an asynchronous queue continuously in Java?在 Java 中连续处理异步队列的最佳方法是什么?
【发布时间】:2010-10-05 14:02:48
【问题描述】:

我很难弄清楚如何构建我系统的最后一部分。目前我正在运行一个 Tomcat 服务器,它有一个响应客户端请求的 servlet。每个请求依次将处理消息添加到异步队列(我可能会通过 Spring 使用 JMS,或者更可能使用 Amazon SQS)。

事件的顺序是这样的:

发送方:
1. 接受客户请求
2. 将一些数据添加到与此请求相关的数据库中,并具有唯一 ID
3. 在消息队列中添加一个代表这个请求的消息对象

接收方:
1.从队列中拉出一个新的消息对象
2. 打开对象并根据 msg 对象中包含的信息从网站获取一些信息。
3. 发送电子邮件提醒
4. 使用已完成此请求的操作的信息更新我的数据库行(相同的唯一 ID)。

我很难弄清楚如何正确处理接收方。一方面,我可能可以创建一个简单的 java 程序,我从命令行启动该程序,该程序选择队列中的每个项目并对其进行处理。那安全吗?让该程序作为 Tomcat 容器内的另一个线程运行是否更有意义?我不想连续执行此操作,这意味着接收端应该能够一次处理多个对象——使用多个线程。我希望它每天 24 小时始终运行。

构建接收端有哪些选择?

【问题讨论】:

  • 如果有人对我最终完成的工作感兴趣。我使用了 Amazon 的 SQS 并有一个轮询队列的 java 客户端(使用 spring 框架)。当它找到一个 msg 时,它会处理它并返回等待状态。我可能会添加 Quartz 线程,现在我只是启动多个进程。
  • 我面临着类似的问题。我想知道 Java 客户端是如何实现的。我希望它不会在消息的无限循环和池中运行?

标签: java asynchronous queue jms


【解决方案1】:

我已经通过将接收器托管在应用服务器中来完成这种事情,在我的例子中是 weblogic,但是 tomcat 也可以正常工作。不要轮询队列,使用基于事件的模型。这可以是手动编码的,也可以是消息驱动的 Web 服务。如果数据库更新是幂等的,您可以更新数据库并发送电子邮件,然后在队列上发出提交。多个线程都从同一个队列中读取不是问题。

我使用过各种 JMS 解决方案,包括 tibco、activemq(在 apache 包含它之前)和 joram。 Joram 是更可靠的开源解决方案,但现在它可能已经改变,因为它是 apache 的一部分。

【讨论】:

【解决方案2】:

如果您已经在使用 Spring,请查看 DefaultMessageListenerContainer。它允许您创建一个 POJO 消息驱动 bean。这可以在现有应用程序容器(您的 WAR 文件)中使用,也可以作为单独的进程使用。

【讨论】:

  • 在这种情况下,消费者是连续轮询队列还是以某种方式得到通知?
  • 我很确定 DefaultMessageListenerContainer 轮询。它的好处是它向您隐藏了投票/通知问题。你只需实现一个 jms MessageListener 并做任何你需要做的工作。
【解决方案3】:

“一方面,我可能会创建一个简单的 java 程序,我可以从命令行启动该程序,该程序会选择队列中的每个项目并对其进行处理。这样安全吗?”

它有什么不安全的地方?效果很好。

“让该程序作为 Tomcat 容器内的另一个线程运行是否更有意义?”

仅当 Tomcat 有大量空闲时间来处理后台处理时。通常情况下——你有空闲时间来做这种处理。

但是,线程并不是最优的。线程共享公共 I/O 资源,您的后台线程可能会减慢前端。

更好的是在“端口 80”前端和单独的后端进程之间有一个 JMS 队列。后端进程启动,连接到队列,获取并执行请求。后端进程可以(如有必要)是多线程的。

【讨论】:

    【解决方案4】:

    如果您使用 JMS,为什么要将任务放入数据库?

    您可以在 JMS 中使用持久队列。即使 JMS 代理死亡,这也会保留任务,直到它们被确认。您可以拥有冗余代理,这样如果一个代理死了,第二个代理就会自动接管。这可能比使用单个数据库更可靠。

    【讨论】:

    • 因为我将从目标网站检索一些信息并将其放在数据库中的行旁边。然后,客户需要在稍后的某个时间点检索此信息。我并没有真正将 db 用于冗余,而是用于存储数据以供以后检索。
    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多