3

我有一个 WEB 应用程序(带有纯 Java servlet),它有一些繁重的计算工作,具有数据库访问权限,可以在异步模式下完成。我计划使用专用服务器来执行此类批处理作业,并且我想知道使用哪些工具/技术/协议在 WEB 服务器中的 servlet 和新专用服务器中的批处理作业之间进行通信。我在看JMS。这是正确的选择吗?有行业标准和/或广泛采用的技术吗?我还需要同时处理多个作业的队列和优先级处理。

4

5 回答 5

3

JMS is a pretty standard solution. The high-end platforms (Sun's JCAPS, for example) makes heavy use of JMS to partition and manage the workload of web services.

There are many advantages to buying a high-end JMS implementation from Sun (or IBM or Microsoft). First, you get things like reliable message queues that are backed to the file system. No message can get lost. Second, you get some monitoring and management tools.

One cool thing is to have a JMS queue with (potentially) multiple subscribers to do workload balancing.

Another cool thing is to have JMS topic which has a logging process as well as the real work process subscribed. The logging process picks off the messages and simply records the essential stages of the job being started and stopped.

于 2008-10-23T10:47:47.343 回答
2

消息传递是最好的选择之一。

使消息传递框架非常通用,以便它可以处理任何类型的批处理作业。

一种方法是拥有一个事件/任务管理器,您可以在其中将事件放在队列中,队列使用者处理该事件并将其转换为一组任务。然后可以由单独的任务处理程序执行任务。任务还可以生成更多事件,这些事件可以再次放入队列以提供反馈循环。通过这种方式,您可以将类似工作流的功能添加到框架中,并允许您的批处理作业相互依赖。

于 2008-10-23T10:08:55.923 回答
1

JMS 将是从 servlet 发送批处理作业的合适解决方案。但它可能不是批处理服务器与 servlet 通信的最佳解决方案,因为它不能成为消息的侦听器。

由于我不知道从批处理服务器到 servlet 的通信应该包含什么内容,我只能说您可能可以使用几个选项(是的,JMS 就是其中之一)。但是它们基本上都依赖于对 servlet 的轮询调用,然后它将以某种方式检查批处理服务器是否有任何东西在等待。这可能只是批处理服务器上的 servlet 或对 JMS 响应队列进行接收调用。其他解决方案是可用的,但关键是它不是异步的,除非您能够通过 AJAX 之类的东西从批处理服务器一直推送到客户端(我猜是浏览器)。

无论如何,只是要记住一些事情。

于 2008-10-23T13:57:28.833 回答
1

异步处理的另一种替代方法是让 Web 应用程序将请求存储在数据库中,并让批处理轮询数据库以查找要处理的新批处理作业。由于您的应用程序看起来更小(纯 Java Servlet),这可能是一个更简单且成本更低的解决方案。

希望能帮助到你。

于 2008-10-23T14:13:02.280 回答
0

我们将 JMS 与 Web 服务一起使用:

  1. 客户端通过 Web 服务请求计算
  2. 服务器写入 JMS 消息,并创建一个 ID 值,该 ID 值与状态(最初为“待处理”)一起存储在数据库中。服务器将 id 返回给客户端。
  3. 服务器(可以是单独的服务器)读取 JMS 消息,进行计算,完成后将数据库中的状态更新为“已完成”
  4. 在计算过程中,客户端正在轮询服务器以确定使用另一个 Web 服务(连同 id)的状态。服务器返回从数据库中检索到的状态。一旦服务端计算完成,客户端会看到“Completed”状态并知道计算完成。
于 2009-10-30T20:12:34.827 回答