WSO2 ESB代理到WSO2是RemoteUserStoreManagerService

时间:2014-01-06 19:08:13

标签: wso2 wso2esb wso2is

我想通过WSO2 ESB代理RemoteUserStoreManagerService(在WSO2 IS上公开)。

当我调用getUserClaimValuesForClaims操作时,我得到了响应。我测试了WSO2 IS(连接到我的Active Directory)以获得性能。我发送了100个线程的请求(每个线程延迟250ms),它给了我250ms的平均响应(这对我来说没问题。)

所以我使用Transformation代理代理了getUserClaimValuesForClaims操作,它也有效。但是在性能测试期间(负载相同或更小)我有以下错误而不是所有消息都返回(平均100条消息中的1条)。

[2014-01-06 19:28:21,047]  INFO - LogMediator To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:d2b85c03-beaf-409b-bf39-2e8143bd9e0b, Direction: response
[2014-01-06 19:28:38,441] ERROR - SourceHandler I/O error: An established connection was aborted by the software in your host machine
  java.io.IOException: An established connection was aborted by the software in your host machine
    at sun.nio.ch.SocketDispatcher.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:202)
    at sun.nio.ch.IOUtil.read(IOUtil.java:175)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:243)
    at org.apache.http.nio.reactor.ssl.SSLIOSession.receiveEncryptedData(SSLIOSession.java:348)
    at org.apache.http.nio.reactor.ssl.SSLIOSession.isAppInputReady(SSLIOSession.java:376)
    at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady
 [2014-01-06 19:29:14,051]  WARN - TargetHandler http-outgoing-66: Connection time out while in state: REQUEST_DONE
 [2014-01-06 19:29:14,061]  WARN - EndpointContext Endpoint : AnonymousEndpoint will be marked SUSPENDED as it failed
 [2014-01-06 19:29:15,041]  WARN - EndpointContext Suspending endpoint : AnonymousEndpoint - last suspend duration was : 30000ms and current suspend duration is : 30000ms - Next retry after : Mon
 [2014-01-06 19:29:14,451]  WARN - SourceHandler Connection time out after request is read: http-incoming-57

我说的是,它在后端超时;但是我在faultSeuence中记录了响应。

我注意到问题是由代理实现中的XSLT介体引起的,因为当我删除xslt介体时,日志为空。我试过xquery,它是一样的。甚至outSequence中的日志调解器也会导致此问题。

这是我的最终代理。

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="GetUserProxy" transports="https http" startOnLoad="true" trace="disable">
<target>
    <endpoint>
        <address uri="https://localhost:9443/services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap12Endpoint/"/>
    </endpoint>
    <inSequence/>
    <outSequence>
        <log/>
        <send/>
    </outSequence>
    <faultSequence/>
</target>
</proxy>

当我删除日志中介时,WARN消息从日志中消失,所有响应消息都返回给SoapUI。

有人可以告诉我它为什么会这样吗? 非常感谢你。 大卫

3 个答案:

答案 0 :(得分:1)

RemoteUserStoreManagerService是一个管理服务。因此,您需要在基本身份验证标头或会话cookie中发送Identity Server的用户名/密码。我无法在您的代理配置中看到授权标头的设置,例如以下

<property expression="fn:concat('Basic ', base64Encode('username:password'))" name="Authorization" scope="transport"></property> 

更多细节将是here。您还需要创建一个消息体以发送到“RemoteUserStoreManagerService”并读取响应消息。这些必须使用ESB配置实现。但是,您也可以编写自定义ESB介体来执行此操作。可以找到调用此服务的示例Java代码here。您可以在here

中找到有关编写自定义调解器的详细信息

答案 1 :(得分:1)

我们已经发现,问题可能更为一般,并且与WSO2 IS无关,因为我们在将WSO2 IS服务与SoapUI模拟相似时遇到了同样的问题。

问题可能出在轴配置中的HTTP-passthru传输中,因为当我们切换到HTTP-NIO时,问题就会消失,而且速度更快。

有一篇关于performance tunnig的帖子帮助了我们。

但是,我想知道我们应该在生产中使用什么样的运输或问题出在哪里。因为现在看来我们不能将HTTP-passthru传输用于生产环境。

是否有人遇到此问题?

答案 2 :(得分:0)

您正在使用的ESB和IS的版本是什么??

尝试重新启动ESB并再次调用服务。请记住,对Identity Server的呼叫是一种安全呼叫。