第一次开发经历-webservice

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类的静态publish方法暴露webservice即可)

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

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

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

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

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

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

3.现在要去数据库取相应的值替代第一步中的固定测试值即可,首先在数据库中建立一个视图,将所需的数据放在一起(一个虚拟表里),java程序直接访问视图,取出对应时间的数值即可。CREATE 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 , OCCUR_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.OCCUR_TIME

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

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

5.附上源代码

package ttt;

import ToSqlBean.SqlBean;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import javax.servlet.ServletContext;

import javax.xml.namespace.QName;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.Timer;

import java.util.TimerTask;

/**

* Created by hht on 2018/6/5.

*/

public class ToTimer  {

public static void main(String[] args){

final SimpleDateFormat dateFormatter =new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

final Calendar calendar = Calendar.getInstance();

Date startDate =null;

try {

startDate = dateFormatter.parse("2018/06/07 15:40:00");

}catch (ParseException e) {

e.printStackTrace();

}

Timer timer =new Timer();

//以下每15分钟定时执行

        timer.scheduleAtFixedRate(new TimerTask(){

@Override

            public void run() {

//System.out.println("execute task!" + this.scheduledExecutionTime());

// System.out.println("execute task!" +dateFormatter.format(calendar.getTime()));

//确认目前的时间

                System.out.println("execute task!" +dateFormatter.format(new Date()));

//连接数据库,去读数据

                ServletContext application=null;

SqlBeansqlbean=new SqlBean(application);

sqlbean.GetConn();

ResultSet rs=sqlbean.executeSqlQuery("select CUR_083,CUR_035,PLUS from SENDDATA where OCCUR_TIME=(select * from  (SELECT OCCUR_TIME FROM SENDDATA order by OCCUR_TIME DESC )  where ROWNUM = 1)");

try {

while(rs!=null && rs.next()) {

int id1=rs.getInt(1);

int id2=rs.getInt(2);

int id3=rs.getInt(3);

// int id4=rs.getInt("4");

// int id5=rs.getInt("5");

// int id6=rs.getInt("6");

System.out.println(id1);

System.out.println(id2);

System.out.println(id3);

}

}catch (SQLException e) {

// TODO Auto-generated catch block

                    e.printStackTrace();

}

sqlbean.CloseDataBase();

//开始将读到的数据上传

                try {

String wsdlUrl ="http://114.215.157.224:8086/mds/services/DataService";//提交数据服务地址

String nameSpaceUri ="http://ws.outnet.metl.suypower.com.cn/";//接口方法所在地址

//创建service实例,通过service实例创建call实例,提供发出soap请求。

 Service service =new Service();

Call call = (Call) service.createCall();//实例化调用对象

 call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));//调用对象中添加webservice地址

//在调用对象中添加webservice对应的命名空间,以及将要调用的函数名

  call.setOperationName(new QName(nameSpaceUri,"uploadAllData"));

//设置入参:参数名,参数类型,参数模式

call.addParameter(new QName(nameSpaceUri,"value"), org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);

call.setUseSOAPAction(true);//说明这是soapaction格式

 call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING);//设置返回格式

 call.setSOAPActionURI(nameSpaceUri +"uploadAllData");

//call.setUsername("sapuser");

//call.setPassword("sappass");

//调用call实例的invoke方法,invoke方法负责向soap服务器发出客户端指定的soap请求,

// 服务器在接收到soap请求后,会在服务端执行相应的服务方法,然后把返回值传给客户。

String ret = (String) call.invoke(new Object[]{postdata});

System.out.println("Successful = " + ret);

}catch (Exception e) {

// TODO Auto-generated catch block

                    e.printStackTrace();

}

}

},startDate,15*60*1000);//15分钟定时

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,556评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,784评论 0 11
  • WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧.... 问题一 如果...
    Java3y阅读 9,549评论 5 139
  • 绘画是一场你与读者之间的演讲 在绘画中你很卖力气的经营你的作品,但到最后有时候事与愿违,特别是考试的时候感觉自己画...
    美术视觉阅读 507评论 0 1
  • 人生就是个长长的旅途 父母手里握着我们的车票 也许我们所乘坐的列车不同 致使我们遇到的乘客也不会相同 虽然我们目的...
    浏小煚拓阅读 717评论 0 1