最近接触到了两种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方法中。这样少写几个类,但是显得代码臃肿。
时间有限,以后有时间再加深修改。
分享到:
相关推荐
WebService开发服务端的两种方式:jdk、cxf。内含所需最新jar包。
XFire与Spring集成WebService客户端的两种开发方式.pdfXFire与Spring集成WebService客户端的两种开发方式.pdfXFire与Spring集成WebService客户端的两种开发方式.pdfXFire与Spring集成WebService客户端的两种开发方式...
使用jaxws开发webservice。 Webservice三要素 Wsdl(webservice使用说明书)重点掌握 Soap(jaxws开发webservice的传输协议)重点掌握 UDDI(了解) Webservice的使用场景分析(掌握) 学会jaxws基本开发方法...
我也没闹明白,两种不同的注释,用wsimport工具生成的代码为什么不同,固执认为j2se(不依赖第3方jar包 xfire cfx a..)可以开发和调用webService 最后终于闹好了,看来还是自己还是对的,应为这个东西搞了两天 ...
最简单的webservice的例子,包括服务端与客户端,有axis、xfire的两种方式的实现
上次发布的部分只是包含了dotnet部分,现在将缺少的部分补上,我机器的delphi出了问题,用BCB抓的屏,这两种编译环境基本都是一样的,所以对着这份文档用delphi没有一点问题,如果有问题,欢迎给我留言,我会及时...
AXIS提供了两种发布方式,一种是即时发布(Instant Deployment),另外一种是定制发布(Custom Deployment)。即时发布提供了一种非常简单的webservice的发布方式,但是其中限制太多,因此在实际的开发中定制发布才...
WebService 一般分为两种:REST 式 WebService,基于 HTTP 协议;RPC 式 WebService,基于 SOAP 协议,不过 SOAP 也是基于 HTTP 传输的。狭义上的 WebService 是指第二种 RPC 式的 WebService,也就是我们常说的那种...
使用myeclipse开发java的webservice的两种方式 方式一: (此方式只能作为调试,有以下bug:jdk1.6u17?以下编译器不支持以Endpoint.publish方式发布document方式的soap,必须在service接口和实现类添加“@...
C++应用QT开发请求访问webService。内部Get和Post两种请求全有。
"Java WebService 编程基础" 在本文中,我们将详细介绍如何使用 Java 编写简单的 WebService ...通过本文,我们可以了解到 WebService 的基本概念和实现方式,以及如何使用 Java 和 Axis 来开发和部署 WebService。
AXIS提供了两种发布方式,一种是即时发布(Instant Deployment),另外一种是定制发布(Custom Deployment)。即时发布提供了一种非常简单的webservice的发布方式,但是其中限制太多,因此在实际的开发中定制发布才...
启动后访问http://localhost:8080/cxf-ws-restful-spring-server/ws63
最近有个需求,要在现有的WEB服务器上提供一个WebService服务,找资料后确定有两种方法可行,一种是用axis,另一种是利用xfire,由于之前有同事用axis做过,并且比较简单,所以确定用axis进行开发.
用Ejb3开发的webservice。数据库连接用的是dbutils。介绍了两种webservice的调用或测试方法:客户端调用和soapui工具测试。
一个简单的webservice 提供数据接口的例子,这个例子里面有两种读取数据的方式,一种是读取access的MDB文件格式,一种是读取数据库的方式。这里提供了MDB文件进行测试。 例子中数据接口提供出来的数据有两种格式,一...
WebService当服务端两种生成wsdl协议方式,Axis和XFire(CXF)前者搞过WebService的人应该都知道扩展性比较好但是不支持Spring,后者基本逻辑全都封装在了底层API中,模式比较固定,开发比Axis简单,但是没有Axis灵活。...
自己开发的webservice项目。采用了自顶向下和自底向上两种方式
在第二个项目中同时使用了这两种方式来实现。这两种调用方式分别封装在两组Model类中。可以通过配置 struts.xml文件来提定使用哪组模型类(调用方式)。第三个项目使用了C#来实现PIM。这个项目的目的是为了演示如何...