一、前言
最近公司项目中遇到要和某厂生产系统对接的需求,要求对接厂内的ESB总线。需要使用到WebService的方式进行推送数据。于是决定在此归纳整理一下WebService的简单使用方法(只谈快速使用)以及一些使用的坑点。
二、准备工作
idea 版本不限,我是用的是19.3(19.3永远的神),对接方提供的wsdl文件(如果是url的话直接下载)。
三、开始对接
1,从idea中生成WebService对接需要的文件
idea中可以根据(wsdl)直接生成用于调用WebService服务的文件,操作步骤如下
(1)选择需要生成的目录 右键->WebServices->Generate Java Code From Wsdl
(2)注意Web Service Platfrom 这一项需要选择跟图片中的一样,点击ok
(3)生成对应代码,生成后的样子。可以根据个人喜好删除.class文件(编译后的文件没啥用),我们只需要关注继承了 [javax.xml.ws.Service] 的这个类就可以了
(4)编写测试方法,写一个main方法调用WebService服务
至此一个对接流程完成数据发送完毕。
四、使用中的麻烦
1,部署问题,直接把生成的服务继承进系统并随系统一同打包部署后发现直接报错,找不到文件。这个问题需要修改继承了Service类中的静态方法
把wsdl文件放到服务器上后修改至对应路径。启动项目测试发送数据,完美解决问题
2,使用定时任务驱动发送数据,跟厂里对接数据都是定时发送的,刚开始启动定时任务没有问题,但是每当运行一段时间后就停止运行。为此跑了好几趟厂里也没有解决问题。最后在互联网冲浪的时候发现了一个帖子,内容是介绍WebService的实现原理,【Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP】稍加思考.jpg,擦有http。众所周知java中的http请求如果不设置超时时间他会一直在哪挂着定时任务处于一个假死的状态(死了但是没有完全死),这样导致了后面的所有都停了。现在要做的就是给WebServcie 的http请求设置一个超时时间。只需要对我们调用的getHelloWorld中添加
BindingProvider bindingProvider = (BindingProvider) helloWorld;
Map<String, Object> requestContext = bindingProvider.getRequestContext();
requestContext.put("com.sun.xml.internal.ws.connection.timeout",20*1000);
requestContext.put("com.sun.xml.internal.ws.request.timeout",20*1000);
大家都是CV工程师我懂,文字版⬆。
再对我们调用的方法进行一个异常捕获处理,保存运行日志、重新发送数据等。
新人一枚,文中若有错误或者不足希望大佬指正。