【发布时间】:2014-08-07 07:23:27
【问题描述】:
我正在为 jax-ws 和自定义soapHandler 苦苦挣扎。
我需要放置一个上下文调用参数(即用户 ID)并将其放在 CustomHandler 上以进行审计。
我尝试了 requestContext 方式,但由于所有请求都共享地图,因此解决方案不是线程安全的:
客户端方法调用将一些参数放在请求上下文中:
....
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....
有什么建议吗?
【问题讨论】:
-
我在同一问题上使用了本地线程。
标签: multithreading jax-ws