使用 Servlet 配置消息处理程序
要在 Servlet 调用 Web 服务时调用此处理程序,需要执行以下步骤来配置处理程序:
打开 web.xml 文件,并转到 Handlers 选项卡,如图 1 中所示。
图 1. Handlers 选项卡
单击 Add 并使用所需的值填写空白字段,如图 2 中所示。
图 2. 填写消息处理程序详细信息
单击 Finish 并保存 web.xml 文件。
这样就完成了消息处理程序的配置。
编写可靠的非托管 Web 服务客户机
非托管 客户机是在非托管环境中运行的客户机,例如独立 Java™ 客户机。对于此类客户机,您需要以编程方式配置处理程序。清单 3 显示了可靠的非托管客户机代码。
清单 3. 非托管客户机
public class MyWSInvoker {
/**
*
*/
public MyWSInvoker() {
super();
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
try {
ArrayList handlerList = new ArrayList();
//Instantiate HandlerInfo class by passing your MessageHandler
// class and put this
//HandlerInfo class into an arraylist
handlerList.add(new HandlerInfo(ClientHandler.class, null, null));
ServiceFactory fact = ServiceFactory.newInstance();
Service service = fact.createService(new QName(
"http://ws.reliablewsclient.ibm.com", "DemoWSService"));
HandlerRegistry handlerRegistry = service.getHandlerRegistry();
//QName passed in setHandlerChain method should be QName of
// PortType
handlerRegistry.setHandlerChain(new QName(
"http://ws.reliablewsclient.ibm.com", "DemoWS"),
handlerList);
Call call = service.createCall();
call.setPortTypeName(new QName(
"http://ws.reliablewsclient.ibm.com", "DemoWS"));
call.setOperationName(new QName(
"http://ws.reliablewsclient.ibm.com", "generateId"));
call.setTargetEndpointAddress("http://localhost:9080/
ReliableWSClientProject/services/DemoWS");
call.setReturnType(new QName("http://www.w3.org/2001/XMLSchema","string"));
Object obj = call.invoke(new Object[] { "Jerry",new Integer(1234), "BIM" });
if (obj instanceof String) {
System.out.println((String) obj);
}
throw new RemoteException("my remote");
} catch (RemoteException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
try {
Thread.sleep(10000);
SOAPConnectionFactory fact;
fact = SOAPConnectionFactory.newInstance();
SOAPConnection con = fact.createConnection();
javax.xml.soap.SOAPFactory sf = SOAPFactory.newInstance();
MessageFactory mfact = MessageFactory.newInstance();
SOAPMessage smsg = mfact.createMessage();
SOAPPart prt = smsg.getSOAPPart();
SOAPEnvelope env = prt.getEnvelope();
env.addChildElement(ClientHandler.body_of_request);
//Set the WebService end point URL
URL endpoint = new URL(
"http://localhost:9080/ReliableWSClientProject/services/DemoWS");
//Send the message
SOAPMessage response = con.call(smsg, endpoint);
System.out.println(response.getSOAPBody().toString());
response.writeTo(System.out);
System.out.println();
//Close the connection
con.close();
} catch (InterruptedException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
} catch (UnsupportedOperationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SOAPException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
要在这种情况下配置消息处理程序,请通过按以下方式传入消息处理程序类名称来实例化 HandlerInfo:
new HandlerInfo(ClientHandler.class, null, null);
然后将此 HandlerInfo 类添加到数组列表中:
ArrayList handlerList = new ArrayList();
handlerList.add(new HandlerInfo(ClientHandler.class, null, null));
现在获取 HandlerRegistry:
HandlerRegistry handlerRegistry = service.getHandlerRegistry();
在 HandlerRegistry 注册处理程序:
handlerRegistry.setHandlerChain(
new QName("http://ws.reliablewsclient.ibm.com", "DemoWS"),handlerList);
这样就完成了消息处理程序的配置。 当将请求发送到 Web 服务时,此处理程序将读取 SOAP 主体,并将其分配给 body_of_request 静态字段。
清单 3 引发了一个 RemoteExpection,以说明使用了缓存的主体信息。当执行到 catch 块时,将使用缓存的主体准备 SOAP 请求,并随后调用 Web 服务。
结束语
在本文中,您了解了使用消息处理程序编写可靠的托管和非托管 Web 服务客户机的简单步骤。使用静态字段缓存请求主体的方法并不完善,还是一项有待发展的技术,但是您可以利用一些好的机制来进行缓存。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号

TechTarget
官方微博

TechTarget中国
相关推荐
-
SAP收购CallidusCloud 与Salesforce竞争
一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]
-
API设计如龙生九子 各不相同
IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。
-
API设计:如何正确开发应用程序接口
在交互组件化软件的世界里,没有比让组件之间以及组件与移动设备和浏览器之间进行连接的应用程序接口(API)更重要的东西了。
-
从头开始实现领域驱动设计
领域描述业务;它是驱动企业的概念和逻辑的集合。如果遵循领域驱动设计(DDD)这一本质,那么领域就是应用程序中最重要的组成部分。