51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2483|回复: 0

[讨论] 第一次开发经历-webservice

[复制链接]

该用户从未签到

发表于 2018-6-20 15:24:02 | 显示全部楼层 |阅读模式
2018年5月24日接到人生第一个开发任务:利用webservice将本地客户端数据定时上传给服务端。

一、首先补充webservice的基础知识,弄清楚流程如下:

1.客户端把调用方法参数转换成符合WSDL格式定义的XML文档片段(包含SOAP消息,input消息);

2.通过网络将XML文档片段发送给服务器;

3.服务器接收XML文档;

4.服务器解析XML文档,提取其中的数据,并把数据转换成webservice所需的参数值;

5.服务器执行方法,把执行方法得到的返回值再次转换为XML文档片段(包含SOAP消息,output消息);

6.通过网络将XML文档片段发送给客户端;

7.客户端接收XML文档片段,解析并提取其中的数据,数据转换成webservice的返回值。

即唯一的要求就是编写webservice的语言要能够支持XML文档生成和解析、网络传输。

二、接下来解析WSDL文档:




三、接下来说明理论开发过程(使用CXF开发框架):

1.使用CXF开发webservice服务器端(包括接口和实现类):开发业务接口(该接口用@webservice
修饰);开发实现类(也需要用@webservice修饰);发布webservice(使用endpoint类的静态pub
lish方法暴露webservice即可)

2.使用CXF开发webservice客户端:调用cxf提供的wsdl2java工具,根据wsdl文档生成java代码;找
到生成的类中,继承了service的类(该类的实例可以当工厂来使用);调用service子类的实例的g
etXXXPort方法,返回远程webservice的代理。

四、接下来说明我的操作步骤,源码附在最后。

1.服务端已将wsdl文件暴露,因此根据服务端提供的wsdl地址生成客户端类(dos下,打开到相应
目录下,执行wsimport -keep XXXX.wsdl,即可在目录中生成客户端类),再编写一个类进行调用。




以上将三个测试定值以xml文本格式上送服务端,执行得到如下反馈说明正确:


2.现在加入15分钟定时器代码


执行得到如下反馈说明正确:


3.现在要去数据库取相应的值替代第一步中的固定测试值即可,首先在数据库中建立一个视图,将
所需的数据放在一起(一个虚拟表里),java程序直接访问视图,取出对应时间的数值即可。CRE
ATE or replace VIEW senddata AS

SELECT c.OCCUR_TIME,a.cur_083,b.cur_035 ,c.plus

FROM YC_HS_000011 a,YC_HS_640002 b ,

(select ych.cur_035-nvl(lead(cur_035) over(ORDER BY OCCUR_TIME desc),0)plus ,cur_035 , OC
CUR_TIME from YC_HS_640002 ych order by OCCUR_TIME desc) c

WHERE a.OCCUR_TIME = b.OCCUR_TIME and a.OCCUR_TIME = c.OCCUR_TIME ORDERBY c.O
CCUR_TIME

检查生成的视图,无误即可。这一部中要学会怎么在数据库客户端测试sql语法。

4.java代码中访问视图,按照对应的时间取出三个字段的值作为一个结果集,首先需要一个提供jd
bc服务的标准类,这里从老员工处拷贝SqlBean.java文件(注意修改其中数据库的地址、端口、用
户名、密码等数据)。结果集中的数据依次赋值给变量,将变量替换xml文本中的固定测试数值。

5.附上源代码
  1. <p>
  2. </p><p>package ttt;</p><p>
  3. </p><p>import ToSqlBean.SqlBean;</p><p>
  4. </p><p>import org.apache.axis.client.Call;</p><p>
  5. </p><p>import org.apache.axis.client.Service;</p><p>
  6. </p><p>import javax.servlet.ServletContext;</p><p>
  7. </p><p>import javax.xml.namespace.QName;</p><p>
  8. </p><p>import java.sql.ResultSet;</p><p>
  9. </p><p>import java.sql.SQLException;</p><p>
  10. </p><p>import java.text.ParseException;</p><p>
  11. </p><p>import java.text.SimpleDateFormat;</p><p>
  12. </p><p>import java.util.Calendar;</p><p>
  13. </p><p>import java.util.Date;</p><p>
  14. </p><p>import java.util.Timer;</p><p>
  15. </p><p>import java.util.TimerTask;</p><p>
  16. </p><p>/**</p><p>
  17. </p><p>* Created by hht on 2018/6/5.</p><p>
  18. </p><p>*/</p><p>
  19. </p><p>public class ToTimer  {</p><p>
  20. </p><p>public static void main(String[] args){</p><p>
  21. </p><p>final SimpleDateFormat dateFormatter =new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");</p><p>
  22. </p><p>final Calendar calendar = Calendar.getInstance();</p><p>
  23. </p><p>Date startDate =null;</p><p>
  24. </p><p>try {</p><p>
  25. </p><p>startDate = dateFormatter.parse("2018/06/07 15:40:00");</p><p>
  26. </p><p>}catch (ParseException e) {</p><p>
  27. </p><p>e.printStackTrace();</p><p>
  28. </p><p>}</p><p>
  29. </p><p>Timer timer =new Timer();</p><p>
  30. </p><p>//以下每15分钟定时执行</p><p>
  31. </p><p>        timer.scheduleAtFixedRate(new TimerTask(){</p><p>
  32. </p><p>@Override</p><p>
  33. </p><p>            public void run() {</p><p>
  34. </p><p>//System.out.println("execute task!" + this.scheduledExecutionTime());</p><p>
  35. </p><p>// System.out.println("execute task!" +dateFormatter.format(calendar.getTime()));</p><p>
  36. </p><p>//确认目前的时间</p><p>
  37. </p><p>                System.out.println("execute task!" +dateFormatter.format(new Date()));</p><p>
  38. </p><p>//连接数据库,去读数据</p><p>
  39. </p><p>                ServletContext application=null;</p><p>
  40. </p><p>SqlBeansqlbean=new SqlBean(application);</p><p>
  41. </p><p>sqlbean.GetConn();</p><p>
  42. </p><p>ResultSet rs=sqlbean.executeSqlQuery("select CUR_083,CUR_035,PLUS from SENDDATA where OCCU</p><p>R_TIME=(select * from  (SELECT OCCUR_TIME FROM SENDDATA order by OCCUR_TIME DESC )  wher</p><p>e ROWNUM = 1)");</p><p>
  43. </p><p>try {</p><p>
  44. </p><p>while(rs!=null && rs.next()) {</p><p>
  45. </p><p>int id1=rs.getInt(1);</p><p>
  46. </p><p>int id2=rs.getInt(2);</p><p>
  47. </p><p>int id3=rs.getInt(3);</p><p>
  48. </p><p>// int id4=rs.getInt("4");</p><p>
  49. </p><p>// int id5=rs.getInt("5");</p><p>
  50. </p><p>// int id6=rs.getInt("6");</p><p>
  51. </p><p>System.out.println(id1);</p><p>
  52. </p><p>System.out.println(id2);</p><p>
  53. </p><p>System.out.println(id3);</p><p>
  54. </p><p>}</p><p>
  55. </p><p>}catch (SQLException e) {</p><p>
  56. </p><p>// TODO Auto-generated catch block</p><p>
  57. </p><p>                    e.printStackTrace();</p><p>
  58. </p><p>}</p><p>
  59. </p><p>sqlbean.CloseDataBase();</p><p>
  60. </p><p>//开始将读到的数据上传</p><p>
  61. </p><p>                try {</p><p>
  62. </p><p>String wsdlUrl ="http://114.215.157.224:8086/mds/services/DataService";//提交数据服务地址</p><p>
  63. </p><p>String nameSpaceUri ="http://ws.outnet.metl.suypower.com.cn/";//接口方法所在地址</p><p>
  64. </p><p>//创建service实例,通过service实例创建call实例,提供发出soap请求。</p><p>
  65. </p><p> Service service =new Service();</p><p>
  66. </p><p>Call call = (Call) service.createCall();//实例化调用对象</p><p>
  67. </p><p> call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));//调用对象中添加webservice地址</p><p>
  68. </p><p>//在调用对象中添加webservice对应的命名空间,以及将要调用的函数名</p><p>
  69. </p><p>  call.setOperationName(new QName(nameSpaceUri,"uploadAllData"));</p><p>
  70. </p><p>//设置入参:参数名,参数类型,参数模式</p><p>
  71. </p><p>call.addParameter(new QName(nameSpaceUri,"value"), org.apache.axis.encoding.XMLType.XSD_STRING,</p><p> javax.xml.rpc.ParameterMode.IN);</p><p>
  72. </p><p>call.setUseSOAPAction(true);//说明这是soapaction格式</p><p>
  73. </p><p> call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING);//设置返回格式</p><p>
  74. </p><p> call.setSOAPActionURI(nameSpaceUri +"uploadAllData");</p><p>
  75. </p><p>//call.setUsername("sapuser");</p><p>
  76. </p><p>//call.setPassword("sappass");</p>
复制代码


  1. <p>//调用call实例的invoke方法,invoke方法负责向soap服务器发出客户端指定的soap请求,</p><p>
  2. </p><p>// 服务器在接收到soap请求后,会在服务端执行相应的服务方法,然后把返回值传给客户。</p><p>
  3. </p><p>String ret = (String) call.invoke(new Object[]{postdata});</p><p>
  4. </p><p>System.out.println("Successful = " + ret);</p><p>
  5. </p><p>}catch (Exception e) {</p><p>
  6. </p><p>// TODO Auto-generated catch block</p><p>
  7. </p><p>                    e.printStackTrace();</p><p>
  8. </p><p>}</p><p>
  9. </p><p>}</p><p>
  10. </p><p>},startDate,15*60*1000);//15分钟定时</p><p>
  11. </p><p>    }</p><p>
  12. </p><p>}</p><p></p>
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-17 01:37 , Processed in 0.066052 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表