Java 长时间运行的Web服务体系结构

Java 长时间运行的Web服务体系结构,java,web-services,jboss,axis2,long-running-processes,Java,Web Services,Jboss,Axis2,Long Running Processes,我们使用axis2构建Web服务,使用Jboss服务器运行所有应用程序的逻辑。我们被要求构建一个与bean对话的web服务,该bean可能需要1小时才能响应(取决于请求的大小),因此我们无法在这段时间内保持与消费者的连接 我们可以使用异步Web服务,但效果并不理想,因此我们决定实现一个bean,该bean将执行Web服务背后的逻辑,并让服务异步调用该bean。webservice将生成一个令牌,该令牌将传递给消费者,消费者可以使用它来查询请求的状态 我的问题是: 当我从创建该bean的服务中的方

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

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

我的问题是:

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

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

    我的建议是使用Java5样式的线程池,使用factory类创建:

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

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

    您可以采取的另一种方法是使用JMS和DB

    这个过程将是

  • 在web服务调用中,将消息放入JMS队列
  • 将记录插入DB表,并将该记录的唯一id返回给客户端
  • 在侦听队列的MDB中,调用bean
  • 当bean返回时,用“Done”状态更新DB记录
  • 当客户端调用status时,读取数据库记录,根据记录返回“notdone”或“Done”
  • 当客户端呼叫且记录显示“完成”时,返回“完成”并删除记录
  • 这个过程在资源使用上有点重,但有一些优势

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

    当我使用此接口时,似乎创建了一个新线程。我尝试创建一个简单的线程,也尝试了定时器,然后我遇到了一个不同的问题。当子线程执行时,它似乎无法访问.aar文件中定义的数据类型。我的任何自定义数据类型都无法识别,我必须将它们放在tomcat lib文件夹中的一个单独的jar中才能工作。我想这里也会发生同样的事情。。。你知道有没有办法绕过它,这样我就不必把这个jar放在tomcat lib目录中了吗?谢谢那么我如何在地图中保存令牌呢?当方法将响应返回给webservice客户端时,对象将死亡。。。不