7

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

事件的顺序是这样的:

发送方:
1. 接受客户端请求
2. 将一些数据添加到与此请求相关的具有唯一 ID 的 DB 中
3. 将表示此请求的消息对象添加到消息队列

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

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

构建接收端有哪些选择?

4

4 回答 4

3

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

它有什么不安全的地方?它工作得很好。

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

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

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

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

于 2009-02-05T02:43:24.790 回答
3

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

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

于 2009-02-05T02:45:43.363 回答
1

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

于 2009-02-05T02:42:00.593 回答
0

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

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

于 2009-02-05T02:41:31.313 回答