2

我正在使用 AXIS 2 使用名为 ChannelConnectServiceStub 的存根调用 WS 方法。

生成存根和 ConfigurationContext :

public class TestWSClient {

    private void init() throws Exception {

        String                  proxyUrl                    = "http://subdom.dom.com/testpath/TestConnect.asmx";
        ConfigurationContext    ctx                         = ConfigurationContextFactory.createConfigurationContextFromFileSystem("/rootFolder/Axis2/axis2-1.4.1/repository", "/rootFolder/Axis2/axis2-1.4.1/conf/axis2.xml");
        ChannelConnectServiceStub channelConnectServiceStub = new ChannelConnectServiceStub(ctx,proxyUrl);

        ctx.setProperty("testid", "testidval"); // Approach 1
        channelConnectServiceStub._getServiceClient().getServiceContext().setProperty("testid", "testidval"); // Approach 2

    }
}

我正在使用 LogHandler 来记录消息请求和响应。

日志处理程序:

class LogHandler extends AbstractHandler implements Handler {

    @Override
    public InvocationResponse invoke(MessageContext messageContext) throws AxisFault {

        String testID       = null;
        String invokeStr    = null;
        String axisService  = null;
        String action       = null;

        invokeStr       = messageContext.getEnvelope().toString();
        axisService     = messageContext.getAxisService().getName();
        action          = messageContext.getAxisMessage().getAxisOperation().getInputAction();

        testID = (String) messageContext.getProperty("testid");// Approach 1
        testID = (String) messageContext.getServiceContext().getProperty("testid");// Approach 2

        return InvocationResponse.CONTINUE;
    }

}

我想将一个属性(“testid”)从我创建和调用存根的点传递给 LogHandler 类。我已经提到了我采取的两种方法。

两者都在传递价值。但问题是,有多个客户端线程使用同一个 TestWSClient 来使用服务。因此,当涉及到 LogHandler 时,不同客户端设置的不同值正在互换。(但invokeStr、AxisService 和action 没有这个问题)。

  1. 有没有办法在调用存根之前将属性传递给 MessageContext?
  2. 任何人都可以帮助从存根获取属性到 LogHandler,而无需在多线程环境中交换值。

我也尝试过以下一个,但失败了,因为operationContext它是 NULL。

OperationContext operationContext = stub._getServiceClient().getLastOperationContext();
logger.info("operationContext : " + operationContext);

if (operationContext != null) {

    MessageContext outMessageContext = operationContext.getMessageContext("Out");

    if (outMessageContext != null) {
        logger.info("outMessageContext.getEnvelope().toString() : " + outMessageContext.getEnvelope().toString());
        outMessageContext.setProperty("Portal", getPortal());
    }

    MessageContext inMessageContext = operationContext.getMessageContext("In");
    logger.info("inMessageContext : " + inMessageContext);

    if (inMessageContext != null) {
        logger.info("inMessageContext.getEnvelope().toString() : " + inMessageContext.getEnvelope().toString());
        inMessageContext.setProperty("Portal", getPortal());
    }

}
4

2 回答 2

3

确保获取 ConfigurationContext 的单例实例。

当您从 ServiceContext 执行 setProperty 和 getProperty 时,请注意您正在为每个 jvm 获取 Property 对象的共享副本,因此使用唯一键代替“testid”键,

例如:在存根初始化后的客户端代码中,而不是,

channelConnectServiceStub._getServiceClient().getServiceContext()
  .setProperty("testid","testidval");

尝试

channelConnectServiceStub._getServiceClient().getServiceContext()
 .setProperty(stub._getServiceClient().getServiceContext().getName(), "testidval");

并检索属性,在 loghandler 中使用相同的键(msgContext.getServiceContext().getName()每个流都是唯一的)

代替

messageContext.getServiceContext().getProperty("testid");

尝试

messageContext.getServiceContext()
 .getProperty(msgContext.getServiceContext().getName());

另请注意,当您将值存储在 jvm 共享属性对象上时,为了避免内存增长,一旦不再需要该值,就将其删除。

messageContext.getServiceContext()
 .removeProperty(msgContext.getServiceContext().getName();
于 2013-07-16T10:57:00.280 回答
1

要为不同的消息设置不同的属性,您需要在 Messagecontext 中设置它们。但在客户端存根消息上下文将为空。在 Servicecontext 设置属性就像;该属性在服务调用完成之前一直存在。

您可以做的是,从客户端存根中,添加一个自定义soap 标头并在标头中设置ID..从处理程序中读取该标头。

ServiceClient serviceClient = stub._getServiceClient();
serviceClient.addStringHeader("xx")
于 2013-07-15T15:05:20.033 回答