gpt4 book ai didi

java - 我可以在调用 Axis 2 Java 中的 stub 之前将属性设置为 MessageContext

转载 作者:行者123 更新时间:2023-11-30 07:15:30 25 4
gpt4 key购买 nike

我正在使用 AXIS 2 通过名为 ChannelConnectServiceStub 的 stub 调用 WS 方法。

生成 stub 和 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”)从我创建和调用 stub 的点传递到 LogHandler 类。我已经提到了我采用的两种方法。

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

  1. 有没有办法在 stub 被调用?
  2. 任何人都可以帮助将属性(property)从 stub 转移到多线程中不交换值的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());
}

}

最佳答案

确保获取 ConfigurationContext 的单例实例。

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

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

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();

关于java - 我可以在调用 Axis 2 Java 中的 stub 之前将属性设置为 MessageContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17653849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com