`
左文武
  • 浏览: 2901 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

WebService开发的两种方式

阅读更多

     最近接触到了两种WebService开发的方式,想自己好好总结,以加深理解,自己接触也不是很久,也许有误,请大家指教。

      好,废话少说,直入正题。首先说明我不是讲xFire或者Axis等区别,而是WebService开发的两种方式:实时和非实时:

 

 

      一. 实时:实时也就是我们直接调用服务,即调用—>响应模式。什么时候调用由我们自己是否触发来决定,下面来说说具体实现的过程:

 

  以一个jsp前台页面为例,假设此页面有个按钮,点击此按钮即可调用我们的接口服务。按钮以一个Action(假设为testAction.jsp)响应,其中可以用以下方式包含一个jsp页面:  <%@ include file="/process/actionPage/gmcc/test.jsp"%>。在此页面中我们可以把需要传入的参数组装好,具体是组长成xml,map还是其他类型数据自己具体决定。好,关键时刻到了,我们在test.jsp页面就可以直接

引用一个我们调用接口的服务java类<%@ page import = "outersystem.service.impl.OutSystemClient"%>

在OutSystemClient.java代码中调用我们的接口服务类的关键步骤如下:

 用Axis: Call call = WebServiceClient.getCall(url, outSystemPackage, methodName);

 用xFire:Object client = WebServiceClient.getClient(url, outSystemPackage);

 

WebServiceClient类的具体实现:


public class WebServiceClient {

 /**
  * 掉用第三方数webService 统一接口, 适用于Axis方式调用
  *
  * */
 
 public static Call getCall(String url,String qName,String method) throws Exception{
  Call call = null;
  Service service1 = new Service();
  call = (Call) service1.createCall();
  call.setOperationName(new QName(qName, method));
  call.setTargetEndpointAddress(new java.net.URL(url));
  return  call;
 }
 
 /**
  * 掉用第三方数webService 统一接口,适用于XFire方式调用
  *
  * */
 public static Object getClient(String url,String classPath) throws Exception {
  Class serviceClass=Class.forName(classPath);
  org.codehaus.xfire.service.Service serviceModel=new ObjectServiceFactory().create(serviceClass);
  XFire xfire=XFireFactory.newInstance().getXFire();
  XFireProxyFactory factory=new XFireProxyFactory(xfire);
  Object client=factory.create(serviceModel,url);
  return client;
 }

}

 

  好了,实时调用基本完成,这只是一个思路,具体实现可以灵活。总结:我们通过响应jsp的Action可以直接调用我们的服务java类。这样就达到了实时。

 

 

 

 二. 非实时:非实时也就是我们不直接调用服务,由Servlet调用线程。线程周期性调用我们的服务(例如,我操作了表,使得表中有符合要求的数据,线程一扫描到就提取数据,组装数据,调用接口)。这是周期性的,不是你触发他就响应的。具体实现方法如下:

 

  在web.xml中加入我们开发的servlet类:

   <servlet>
    <servlet-name>appealcentersyncinitservlet</servlet-name>
    <servlet-class> 
        client.servlet.SyncInitServlet
    </servlet-class>
  <load-on-startup>99</load-on-startup>
  </servlet>

 

SyncInitServlet类实现:

public class SyncInitServlet extends HttpServlet {
 private static WebServiceLogger logger = WebServiceLogger.getLogger("gjkf");
 /**
  * serialVersionUID 序列化接口的版本号
  */
 private static final long serialVersionUID = 1L;

 public void init() throws javax.servlet.ServletException {
  
     NewWorkSheetThread.getInstance().start();  
  logger.info("1线程启动。。。");
  
  BranchSheetThread.getInstance().start();  
  logger.info("2线程启动。。。");
  
  UpgradeSheetThread.getInstance().start();  
  logger.info("3线程启动。。。");
  
  AddNoteSheetThread.getInstance().start();  
  logger.info("4线程启动。。。");
  
  SuspendWorkSheetThread.getInstance().start();
  logger.info("5线程启动。。。");

  DisSuspendThread.getInstance().start();
  logger.info("6线程启动。。。");


    //工单反馈线程初始化
  logger.info("webservice线程初始化...");
  new Thread(new HastenFeedBackThread()).start();
  
  //故障单销障操作
  
  logger.info("webservice线程初始化...");
  new Thread(new FaultCloseThread()).start();
    
 }
}

这样我们就启动了线程。以NewWorkSheetThread线程为例,实现如下:

 public class NewWorkSheetThread extends Thread
{
 private static WebServiceLogger logger = WebServiceLogger.getLogger("gjkfNewWork");

 private static NewWorkSheetThread thread = null;
 
 private NewWorkSheetThread()
 {
 }

 /**
  * 获取线程实例
  * @return
  */
 public static NewWorkSheetThread getInstance()
 {
  if (thread == null)
  {
   thread = new NewWorkSheetThread();
   // changes the default name of this thread to EOMSNewWorkSheetThread
   thread.setName("NewWorkSheetThread");
  }
  return thread;
 }

 public void run()
 {
  try
  {
   sleep(5000);
   // 判断是否启用

   boolean sys_startNewWorkSheetThread = "true".equalsIgnoreCase(SysParameter.getValue("sys_startNewWorkSheetThread"));
   while (sys_startNewWorkSheetThread)
   {
    try
    {
     // 调用
     String returnValue = GJKFClient.callNewWorkSheet(null,
         "client.GJKFCaller");

     if (returnValue.equals(KeyConstant.CLIENT_INVOKE_SUCCESS))
     {
      logger.info("调用WEBSERVICE 接口成功,并且接口返回正确结果");
     }
     else if (returnValue.equals(KeyConstant.PROCEDURE_EXECUTE_FAIL))
     {
      logger.info("调用存储过程失败或异常");
     }
     else if (returnValue.equals(KeyConstant.CLIENT_INVOKE_FAIL))
     {
      logger.info("调用WEBSERVICE接口失败");
     }
     else if (returnValue.equals(KeyConstant.OUT_SERVICE_NOT_EXISTS))
     {
      logger.info("数据库中已无需操作的数据");
     }
    }
    catch (Exception e)
    {
     logger.error("调用WEBSERVICE接口 GJKFNewWorkSheet 出现异常:"
         + e.toString());
     e.printStackTrace();
    }
    
    int sys_newWorkSheetInterval = Integer.valueOf(SysParameter.getValue("sys_newWorkSheetInterval")).intValue();
    logger.info("GJKFNewWorkSheet 延迟" + sys_newWorkSheetInterval + "秒");
    sleep(sys_newWorkSheetInterval * 1000);
   }
  }
  catch (NumberFormatException e1)
  {
   logger.error("线程间隔必须为数字");
   //e1.printStackTrace();
  }
  catch (InterruptedException ex)
  {
   ex.printStackTrace();
  }
 }
}

上面的关键是这段代码:String returnValue = GJKFClient.callNewWorkSheet(null,"client.GJKFCaller");GJKFClient类的callNewWorkSheet方法实现了数据(调用服务所需参数)的组装,调用
服务:

TransmitServiceHttpImplServiceSoapBindingStub binding = (TransmitServiceHttpImplServiceSoapBindingStub) new TransmitServiceHttpImplServiceLocator()
             .getTransmitServiceHttpImplPort();

interfaceResult = binding.transmit(transmitRequest);

transmitRequest这是我们传入的参数。

 

我们还可以直接在Thread类中run方法中直接组装数据调用服务:也就是上面的代码可以直接放在NewWorkSheetThread 类的run方法中。这样少写几个类,但是显得代码臃肿。

 

   时间有限,以后有时间再加深修改。

1
1
分享到:
评论

相关推荐

    WebService开发服务端的两种方式:jdk、cxf

    本文将详细介绍使用JDK和CXF两种方式来开发WebService服务端。 一、JDK原生实现WebService(JAX-WS) 1. **JAX-WS概述**:Java API for XML Web Services (JAX-WS) 是Java平台上用于构建Web服务和客户端的API。它...

    WebService的几种不同实现方式

    虽然WebService被广泛认为是SOA的一个实现方式,但它并不是SOA的全部。SOA的理想状态是实现传输协议的透明化,而SOAP作为一个特有协议,并未完全达到这一点。 在Java中,主要存在三种WebService实现规范: 1. JAX-...

    ASP链接webservice两种方式

    这两种方法在不同的场景下有不同的适用性,下面将详细解释这两种方式。 1. HTTP POST方式: 这种方式通常较为常见,适用于大多数情况。在ASP中,你可以通过创建一个XMLHttpRequest对象来发送POST请求到Web Service...

    Java开发WebService实例

    使用Axis开发WebService有两种主要方式:DII(Dynamic Invocation Interface)和Stubs。其中,DII方式更为灵活,适用于动态生成WebService接口的情况。 1. **编写Java类**:创建一个简单的Java类,例如`HelloWorld`...

    WebService的两种客户端调用方式

    本文将深入探讨WebService的两种客户端调用方式,并通过源码分析和实际工具的使用来帮助你理解这两种方法。 一、SOAP(Simple Object Access Protocol)调用 1. SOAP简介:SOAP是一种基于XML的协议,用于在Web上...

    Webservice笔记含使用cxf和jaxws两种方式开发webservice【源代码+笔记】

    使用jaxws开发webservice。 Webservice三要素 Wsdl(webservice使用说明书)重点掌握 Soap(jaxws开发webservice的传输协议)重点掌握 UDDI(了解) Webservice的使用场景分析(掌握) 学会jaxws基本开发方法...

    C#.NET_动态调用webservice的三种方式

    ### C#.NET 动态调用WebService的三种方式详解 #### 概述 在日常的.NET开发工作中,我们经常需要与远程服务器上的服务进行交互,其中WebService作为一种常见的服务交互方式被广泛采用。多数情况下,我们会选择通过...

    MyEclipse开发WebService教程

    通过这种方式,MyEclipse简化了Web Service的开发流程,使得开发者能够快速地构建、测试和部署Web Service应用。 总结来说,MyEclipse开发Web Service的过程包括创建Web Service工程、编写服务类、设置服务注解、...

    springboot+webservice搭建webservice服务端及使用java客户端两种方式进行调用webservice接口

    总结,本教程详细介绍了如何利用Spring Boot和Apache CXF搭建Web Service服务端,以及使用JAX-WS的`javax.xml.ws.Service`和Apache CXF的`JaxWsProxyFactoryBean`两种方式实现Java客户端调用。这些技能对于开发者来...

    NC57 webservice 开发插件

    通过这个插件,开发人员可以快速构建符合WS-I(Web Services Interoperability Organization)标准的webservcie,同时支持SOAP(Simple Object Access Protocol)和REST(Representational State Transfer)两种常见...

    WebService Axis 搭建开发

    总之,使用Apache Axis进行WebService开发是一种有效且灵活的方法,它简化了Java应用与Web服务的集成,使得开发者可以更加专注于业务逻辑的实现。通过理解上述步骤和概念,你可以快速搭建并部署自己的Web服务。

    WebService服务的三种调用方式

    除了上述两种手动编写代码的方式外,还可以利用工具来自动生成客户端代码,这种方式可以极大地提高开发效率。 1. **工具推荐**: - WsImport:Java SE自带的一个工具,用于从WSDL文件生成客户端代码。 - CXF:一...

    xFire版WebService开发

    有两种启动方式:正常启动和调试启动。调试启动适用于问题排查,而正常启动用于常规测试。测试过程涉及调用WebService Explorer工具,输入WSDL地址,执行服务方法并查看返回结果。 #### 六、创建WebService客户端 ...

    XFire与Spring集成WebService客户端的两种开发方式.pdf

    在本文档中,我们探讨了如何将XFire与Spring框架集成以实现WebService客户端的两种不同开发方式。这两种方法都是为了方便地创建和管理WebService客户端,同时利用Spring的强大功能进行依赖注入和配置管理。 ### ...

    webservice四种发布方式及客户端调用

    - AXIS1 的客户端调用支持字符串和实体类两种方式。当调用 AXIS2 发布的服务时,可能出现实体类属性为 null 的问题。 #### 六、小结 在选择 WebService 发布方式时,需要根据项目需求和技术背景来决定。CXF 以其...

    PB 调用webservice 几种方式

    这种方式需要手动构建和解析XML消息,虽然灵活性高,但相比前两种方法,开发工作量会增加。 4. **JDBC/ODBC Bridge to Web Services**: 对于已经具备数据库连接能力的应用,PB 11.5也提供了通过JDBC或ODBC桥接器...

    Android开发之WebService介绍

    在Android开发中,与远程服务器进行数据交互是常见的需求,而WebService就是实现这种交互的一种方式。WebService是一种基于网络的、分布式的模块化组件,旨在促进不同系统之间的互操作性。它允许不同的应用程序通过...

Global site tag (gtag.js) - Google Analytics