Java 在不使用额外线程的情况下,向同一web容器中的另一个servlet发送新请求

Java 在不使用额外线程的情况下,向同一web容器中的另一个servlet发送新请求,java,servlets,websphere,Java,Servlets,Websphere,在一个WebContainer中,是否有任何已知的方法可以在不消耗额外web容器线程的情况下将新的SOAP请求从一个servlet发送到另一个servlet 到目前为止,我已经尝试使用RequestDispatcher.include(request,response)和定制的请求和响应,这样我就可以提供自己的输入并截获被叫方的输出。 有了它,我能够截获输出而不出问题(使用写入缓冲区的自定义HttpServletResponse类),但我无法使用此方法发送自定义输入。我正在使用HttpServl

在一个WebContainer中,是否有任何已知的方法可以在不消耗额外web容器线程的情况下将新的SOAP请求从一个servlet发送到另一个servlet

到目前为止,我已经尝试使用RequestDispatcher.include(request,response)和定制的请求和响应,这样我就可以提供自己的输入并截获被叫方的输出。 有了它,我能够截获输出而不出问题(使用写入缓冲区的自定义HttpServletResponse类),但我无法使用此方法发送自定义输入。我正在使用HttpServletRequestWrapper的扩展向第三方应用程序提供我自己的输入(而不是对我的应用程序的原始请求),但是,似乎WebSphere或Axis正在丢弃我的包装,因此我得到的是SOAP错误而不是有效响应。 为了清楚起见,我不需要将原始请求转发给被调用方(这是一个JSONP GET请求),我需要在我的应用程序中创建一个新的SOAP请求,并将其发送给被调用方

我应该试试这种方法有什么变化吗?在单个web容器中发送请求是否有完全不同的方式

非常感谢那些作出回应的人

对于上下文,我正在编写一个JSON/REST web服务以在WebSphereApplicationServer上运行,而WebSphereApplicationServer又通过Axis2上的SOAP调用第三方产品。不幸的是,这个第三方产品只能通过soaphttp接口使用,尽管它本身是在同一websphereweb容器中运行的javaservlet

之前,我一直在使用基于第三方产品WSDL的SOAP代理生成器生成的HTTP代理调用此应用程序。这可以正常工作,但这意味着对我的服务的一次调用会消耗两个web容器线程,这是一个严重的漏洞。一旦web容器线程池满了,它就会保持满状态,因为对我的servlet的请求会一直保留线程,直到第三方应用程序响应,这是它无法做到的,因为没有线程可用于处理我的servlet发出的HTTP请求

更新: 我已经做了一些进一步的测试,并且能够成功地将这种类型的转发到我的REST服务。我能够使用合成的ServletRequest和ServletResponse查询我的REST/JSON服务,因此,如果我调用的产品没有使用Axis SOAP接口,我就可以实现我最初的目的。
Axis查找SOAPAction标头的位置似乎与我预期的不同,因为尽管我将SOAPAction标头添加到合成请求中,但我始终会收到“未找到SOAPAction标头!”错误消息(我已验证SOAPAction标头实际上已添加).

事实证明,由于“缺少”SOAPAction头,我无法让服务与Axis一起工作的原因与WebSphere或Axis完全无关。这是一个ConcurrentHasMap,它不知何故比较了两个等价的字符串,并表示它们不同,因此当Axis查找SOAPAction头时,它从未返回。为了解决这个问题,我只需测试“SOAPAction”上的查询,并对响应进行硬编码

因此,为了将来的参考,这里是我使用的一般设置

  • 创建一个实现
    HttpServletRequest
    的类,该类封装了构造函数中提供的另一个
    HttpServletRequest
    。在这个类中,
    getHeader
    方法被重写以捕获对SOAPAction头的请求,其他头请求可能会转发到原始请求(Axis似乎不会查找SOAPAction头以外的任何内容)。我还使用了
    getInputStream
    方法返回我自己的ServletInputStream实现,该实现使用固定的文本编码从字节缓冲区读取,并使用
    getContentLength
    方法返回与我的数据一致的长度

  • 创建一个实现HttpServletResponse的类,该类仅正确实现getWriter和getOutputStream方法。
    getOutputStream
    方法返回一个自定义的
    ServletOutputStream
    实现,该实现将其输出记录到字节缓冲区。
    getWriter
    方法返回了一个特殊的PrintWriter,该PrintWriter写入了
    getOutputStream
    返回的同一个ServletOutputStream,除了这个writer在写入后总是需要刷新之外——我不确定为什么会出现这种情况

  • 在使用
    RequestDispatcher.include(request,response)
    发送请求之前,我将我的合成
    HttpServletRequest
    包装在一个
    HttpServletRequestWrapper
    中,奇怪的是,它似乎很有帮助。然后,我以通常的方式使用了
    RequestDispatcher.include(request,response)
    ,并从自定义ServletOutputStream的字节缓冲区中读取SOAP服务的输出,以便像发出HTTP请求一样进行处理


  • 另外,这个问题是WebSphere6.x特有的。我听说WebSphere7和更高版本正式支持从等待外部方的请求中删除线程,从而避免线程饥饿。