我正在努力与jax-ws和自定义soapHandler。jax-ws soaphandler线程安全
我需要把一个上下文调用参数(即userID),并获得它在一个CustomHandler用于审计目的。
我试过RequestContext的方式,但由于isshared的溶液不是线程安全的所有请求地图:
客户端的方法调用把一些参数要求方面:
....
Map<String, Object> requestContext = provider.getRequestContext();
requestContext.put("userID", userId);
处理器
@Override
public boolean handleMessage(SOAPMessageContext context) {
String userId = (String) context.get("userID);
return true;
}
由于实例上下文是唯一的,因此这不是线程安全的。
于是,我就添加上下文参数在CustomSoapHandler实例:
@Override
public void deleteCard(String userId, String cardId, String multichannelId) {
DataPowerSOAPHandler handler = new DataPowerSOAPHandler(multichannelId);
List<Handler> handlerChain = null;
try {
BindingProvider provider = (BindingProvider) userWalletService;
handlerChain = provider.getBinding().getHandlerChain();
logger.debug("handlerChain size {}", handlerChain.size());
handlerChain.add(handler);
provider.getBinding().setHandlerChain(handlerChain);
userWalletService.deleteCard(userId, cardId);
} finally {
if (handlerChain != null && handlerChain.size() >0) {
handlerChain.remove(handler);
}
}
}
所以我修改了SOAP处理程序如下:
public class DataPowerSOAPHandler implements SOAPHandler<SOAPMessageContext> {
private String multichannelId;
@Override
public boolean handleMessage(SOAPMessageContext context) {
System.out.println("multichannelId");
return true;
}
这样,我创建一个自定义SoapHandler实例每个客户端请求。
我认为是线程安全的这样,那让我觉得在客户端调用的添加/删除HandlerChain的唯一的事情....
什么建议吗?
我用同一个问题的本地线程。 –