【发布时间】:2012-08-24 06:45:09
【问题描述】:
是否有任何已知方法可以在单个 WebContainer 中从一个 servlet 向另一个 servlet 发送新的 SOAP 请求,而无需消耗额外的 Web 容器线程?
到目前为止,我已经尝试将 RequestDispatcher.include(request, response) 与自定义请求和响应一起使用,以便我可以提供自己的输入并拦截被调用者的输出。 有了这个,我可以毫无问题地拦截输出(使用写入缓冲区的自定义 HttpServletResponse 类),但我无法使用此方法发送自定义输入。我正在使用 HttpServletRequestWrapper 的扩展来向第三方应用程序提供我自己的输入(而不是对我的应用程序的原始请求),但是似乎 WebSphere 或 Axis 正在丢弃我的包装器,因此我得到一个 SOAP 错误而不是有效的回应。 为了清楚起见,我不需要将原始请求转发给被调用者(这是一个 JSONP GET 请求),我需要在我的应用程序中制作一个新的 SOAP 请求并将其发送给被调用者。
我应该尝试这种方法的变体吗?是否有完全不同的方式在单个 Web 容器中发送请求?
非常感谢回复的人。
就上下文而言,我正在编写一个 JSON/REST Web 服务以在 WebSphere Application Server 上运行,而后者又通过 Axis 2 上的 SOAP 调用第三方产品。不幸的是,这个第三方产品只有 可通过 SOAP HTTP 接口访问,尽管它本身是在同一个 WebSphere Web 容器中运行的 Java servlet。
以前我一直使用基于第三方产品的 WSDL 的 SOAP 代理生成器生成的 HTTP 代理调用此应用程序。这很好用,但这意味着对我的服务的一次调用又会消耗两个 Web 容器线程,这是一个严重的漏洞。一旦 Web 容器线程池已满,它就会保持满状态,因为对我的 servlet 的请求在第三方应用程序响应之前一直持有线程,但它无法做到这一点,因为没有线程可用于处理我的 servlet 发出的 HTTP 请求。
更新: 我已经做了一些进一步的测试,并且能够成功地将这种类型的转发到我的 REST 服务。我能够使用合成的 ServletRequest 和 ServletResponse 查询我的 REST/JSON 服务,因此允许我实现我最初的目的如果我调用的产品没有使用 Axis SOAP 接口。 看起来 Axis 在寻找 SOAPAction 标头的位置与我预期的不同,因为我总是得到“找不到 SOAPAction 标头!”尽管我在合成请求中添加了 SOAPAction 标头,但仍返回错误消息(我已验证实际上添加了 SOAPAction 标头)。
【问题讨论】:
-
顺便说一句,这个问题是特定于 WebSphere 6.x 的。我听说 WebSphere 7 和更高版本正式支持从等待外部方的请求中分离线程,从而避免线程饥饿。