2

我们使用axis2来构建我们的webservices和一个Jboss服务器来运行我们所有应用程序的逻辑。我们被要求构建一个与 bean 对话的 Web 服务,该 bean 可能需要长达 1 小时才能响应(取决于请求的大小),因此我们将无法在此期间保持与消费者的连接。

我们可以使用异步 Web 服务,但效果并不理想,因此我们决定可以实现一个 bean,该 bean 将执行 Web 服务背后的逻辑,并让服务异步调用该 bean。Web 服务将生成一个令牌,该令牌将传递给消费者,消费者可以使用它来查询请求的状态。

我的问题是:

  1. 从创建该 bean 的服务中的方法返回后,如何查询 Jboss 服务器上 bean 的状态。我需要使用有状态的bean吗?
  2. 如果我想从 web 服务端进行异步调用,我可以使用有状态 bean 吗?
4

2 回答 2

3

Another approach you could take is to make use of JMS and a DB.

The process would be

  1. In web service call, put a message on a JMS Queue
  2. Insert a record into a DB table, and return a unique id for that record to the client
  3. In an MDB that listens to the Queue, call the bean
  4. When the bean returns, update the DB record with a "Done" status
  5. When the client calls for status, read the DB record, return "Not Done" or "Done" depending on the record.
  6. When the client calls and the record indicates "Done", return "Done" and delete the record

This process is a bit heavier on resource usage, but has some advantages

  • A Durable JMS Queue will redeliver if your bean method throws an Exception
  • A Durable JMS Queue will redeliver if your server restarts
  • By using a DB table instead of some static data, you can support a clustered or load balanced environment
于 2009-12-03T04:44:07.210 回答
1

我不认为有状态会话 bean 是您问题的答案,它们是为长时间运行的会话会话而设计的,这不是您的场景。

我的建议是使用 Java5 风格的ExecutorService线程池,使用Executors工厂类创建:

  1. 当 Web 服务服务器初始化时,创建一个ExecutorService实例。
  2. Web 服务调用进来,处理程序创建一个Callable实例。该Callable.call()方法将以任何形式对业务逻辑 bean 进行实际调用。
  3. Callable被传递给ExecutorService.submit(),它立即返回一个Future表示调用最终结果的对象。将Executor开始Callable在单独的线程中调用您的。
  4. 生成一个随机token,以token为key存储Future在a中。Map
  5. 将令牌返回给 Web 服务客户端(步骤 1 到 4 应立即执行)
  6. 稍后,他的 Web 服务客户端再次调用请求结果,并传入令牌
  7. Future服务器使用令牌查找, 并使用超时值调用get(),Future以便它只等待很短的时间来获得答案。该get()调用将返回任何Callable调用的执行结果。
    • 如果答案可用,则将其返回给客户端,并Future从 `Map.
    • 否则,告诉客户稍后再来。

这是一个非常强大的方法。如果您愿意,您甚至可以配置ExecutorService以限制可以同时执行的调用数量。

于 2009-12-02T23:46:03.080 回答