【问题标题】:Long running webservice architecture长期运行的 Web 服务架构
【发布时间】:2010-12-22 13:57:13
【问题描述】:

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

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

我的问题是:

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

【问题讨论】:

    标签: java web-services jboss axis2 long-running-processes


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 当我使用这个接口时,似乎创建了一个新线程。我尝试创建一个简单的线程,也尝试了 Timer,然后我遇到了一个不同的问题。当子线程执行时,它似乎无法访问 .aar 文件中定义的数据类型。我的自定义数据类型都没有被识别,我必须将它们放在 tomcat lib 文件夹中的一个单独的 jar 中才能工作。我假设这里也会发生同样的事情......你知道是否有办法解决它,所以我不必把这个 jar 放在 tomcat lib 目录中?谢谢
    • 另外,如何将令牌保存在地图中?当方法返回响应给 web 服务客户端时,对象会死掉...不是吗?
    【解决方案2】:

    您可以采取的另一种方法是使用 JMS 和数据库。

    这个过程是

    1. 在 Web 服务调用中,将消息放在 JMS 队列中
    2. 向数据库表中插入一条记录,并将该记录的唯一 ID 返回给客户端
    3. 在侦听队列的 MDB 中,调用 bean
    4. 当 bean 返回时,将 DB 记录更新为“完成”状态
    5. 客户端调用状态时,读取DB记录,根据记录返回“Not Done”或“Done”。
    6. 当客户端调用且记录显示“Done”时,返回“Done”并删除记录

    这个过程在资源使用上有点重,但有一些优势

    • 如果您的 bean 方法抛出异常,将重新传递一个 Durable JMS 队列
    • 如果您的服务器重新启动,Durable JMS 队列将重新传递
    • 通过使用数据库表而不是一些静态数据,您可以支持集群或负载平衡环境

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2012-12-11
      相关资源
      最近更新 更多