我正在努力與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的唯一的事情....
什麼建議嗎?
我用同一個問題的本地線程。 –