我有一个接收重复SOAP消息的Web服务(Java / WebSphere 8.0),我正在探索从Web服务的角度处理这些重复消息的各种方法。
我正处于可以检测到何时处理重复内容的位置,但我想探索根本不响应消息并关闭HTTP连接的可能性。
是否可以让不的Web服务响应并在检测到重复时关闭连接?或者这在Web服务应用程序的上下文中是不可能的?
答案 0 :(得分:2)
我不认为这种行为是真正支持的,因为它(在我看来)违反了SOAP协议。处理此问题的标准方法是为您的用例发送SOAP错误。
如果SOAP错误确实没有选项,您可能会尝试使用无效的SOAP响应欺骗应用程序服务器。
==这里是龙! == 强>
你可以,例如尝试添加一个SOAPHandler
(为了简洁起见,我假设你知道这个概念以及如何实现它),它构造了一个无效的SOAP响应:
public class DuplicateDetectingSOAPHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
if (isDuplicate(context)) {
MessageFactory messageFactory;
try {
messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
SOAPMessage message = messageFactory.createMessage();
// detaching the SOAPBody violates api and causes an error
message.getSOAPBody().detachNode();
context.setMessage(message);
} catch (SOAPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
return true;
}
private boolean isDuplicate(SOAPMessageContext context) {
// determine if message is duplicate
}
我用标准的JDK webservice实现尝试了这个,它引起了你想要的行为。我不知道这是否适用于WebSphere。请记住,这会在Web服务实现本身中触发某种错误,并可能导致其他副作用。
要明确:我认为你根本不应该实现这种行为并寻找不同的解决方案。
也许空的SOAP响应也满足您的需求:
SOAPMessage message = messageFactory.createMessage();
context.setMessage(message);
这会产生一个空的SOAP响应:
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header/>
<env:Body/>
</env:Envelope>