大家好,我是哪吒。
根据接口文档,调用第三方webservice接口,拼接入参,处理回参。
RPC调用Webservice接口是一种远程调用的方式,通过指定Webservice接口的调用地址、命名空间、调用的方法名调用远程接口获取结果。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
只有一个核心线程的线程池,保证任务按FIFO顺序一个个执行。
ExecutorService singlePool = Executors.newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
固定数量的可复用的线程数,来执行任务。当线程数达到最大核心线程数,则加入队列等待有空闲线程时再执行。
我觉得是最常用的线程池。
Executors.newFixedThreadPool(10);
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
创建的都是非核心线程,而且最大线程数为Interge的最大值,空闲线程存活时间是1分钟。
如果有大量耗时的任务,则不适该创建方式,它只适用于生命周期短的任务。
ExecutorService cachePool = Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
ExecutorService scheduledPool = Executors.newScheduledThreadPool(10);
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
}
① scheduleAtFixedRate:
创建并执行一个在给定初始延迟后的定期操作,也就是将在 initialDelay 后开始执行,然后在initialDelay+period 后下一个任务执行,接着在 initialDelay + 2 * period 后执行,依此类推 ,也就是只在第一次任务执行时有延时。
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
② scheduleWithFixedDelay:
创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟,即总时间是(initialDelay + period)*n。
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
Web Service也称为web服务,它是一种跨编程语言和操作系统平台的远程调用技术。
Web Service采用标准的SOAP协议传输(SOAP:Simple Object Access Protocol简单对象访问协议,soap属于w3c标准。并且soap协议是基于http的应用层协议传输xml数据)。
Web Service采用WSDL作为描述语言,也就是Web Service 的使用说明书。
W3C为Web Service制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何语言写的web Service 接口在发送数据的时候都要转换成WebService标准的XSD发送。
(1)SOAP
SOAP也叫做简单对象访问协议,是一种简单的基于xml的协议,它使应用程序通过HTTP来交换数据,可以简单的理解为SOAP= http+xml。
SOAP协议格式:
WSDL是基于XML的用于描述Web Service 及其函数(方法)、参数和返回值。也就是说wsdl是对发布出来的服务中的方法和返回值以及参数的描述(可以成为是WebService的使用说明书)。
WSDL文档结构,WSDL文档主要包括5个标签:
(3)UDDI
UDDI是一种目录服务,通过它,企业可注册并搜集Web Service。企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册Web Service服务,从而达到资源共享。UDDI旨在将全球的Web Service资源进行共享。
package com.guor.rpc;
import com.neusoft.basic.threadPool.ThreadPoolFactoryUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ExecutorService;
public class WebServiceUtil {
// 日志
private static final Logger logger = LoggerFactory.getLogger(WebServiceUtil.class);
public static void sendRequest(RequestInfo requestInfo) {
ExecutorService executorService = ThreadPoolFactoryUtil.getInstance();
try {
WebServiceThread webServiceThread = new WebServiceThread(requestInfo);
executorService.execute(webServiceThread);
} catch (Exception e) {
logger.error("|#WebServiceUtil|#异常: ", e);
}
}
}
package com.guor.rpc;
import com.alibaba.fastjson.JSON;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import javax.xml.namespace.QName;
public class WebServiceThread implements Runnable {
// 日志
private static final Logger logger = LoggerFactory.getLogger(WebServiceThread.class);
private RequestInfo requestInfo;
@Value("${webservice.url}")
private String url;
@Value("${webservice.nameSpace}")
private String nameSpace;
@Value("${webservice.method}")
private String method;
public WebServiceThread(RequestInfo requestInfo) {
this.requestInfo = requestInfo;
}
@Override
public void run() {
try {
String request = JSON.toJSONString(this.requestInfo);
// 创建远程调用接口的RPC(RPCServiceClient)对象
RPCServiceClient serviceClient = new RPCServiceClient();
// 指定webservice接口地址
EndpointReference endpointReference = new EndpointReference(url);
serviceClient.setTargetEPR(endpointReference);
Options options = serviceClient.getOptions();
// 超时时间30s
options.setTimeOutInMilliSeconds(30 * 1000);
// 设置接口的调用地址
options.setTo(endpointReference);
// 设置命名空间和调用的方法名
QName opName = new QName(nameSpace, method);
//设置请求的报文
Object[] param = new Object[]{request};
// 返值值类型
Class<?>[] types = new Class[]{String.class};
Object[] ret = serviceClient.invokeBlocking(opName, param, types);
// 返回值逻辑处理
} catch (Exception e) {
logger.error("|#WebServiceUtil|#异常: ", e);
}
}
}
package com.guor.rpc;
import lombok.Data;
@Data
public class RequestInfo {
private int id;
private String name;
private String msg;
}
<dependency>
<groupId>org.apache.axis2groupId>
<artifactId>axis2artifactId>
<version>1.6.3version>
<type>pomtype>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.apache.axis2groupId>
<artifactId>axis2-adbartifactId>
<version>1.6.3version>
<type>jartype>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.apache.axis2groupId>
<artifactId>axis2-kernelartifactId>
<version>1.6.3version>
<type>jartype>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.apache.axis2groupId>
<artifactId>axis2-transport-httpartifactId>
<version>1.6.3version>
dependency>
<dependency>
<groupId>org.apache.axis2groupId>
<artifactId>axis2-transport-localartifactId>
<version>1.6.3version>
dependency>
本专栏收录于《49天精通Java从入门到就业》,本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0开始,不断进阶深入
哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。