为SOAP/HTTP Web服务编写可靠客户机(二)

日期: 2007-12-10 作者:Shailesh K. Mishra 来源:TechTarget中国

  使用 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

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐