首页 > 编程语言 >一文弄懂Java线程池 + Runnable多线程 + 调用WebService接口

一文弄懂Java线程池 + Runnable多线程 + 调用WebService接口

时间:2023-09-24 17:33:48浏览次数:40  
标签:Runnable Java axis2 import 线程 org new 多线程 public

大家好,我是哪吒。

一、需求很简单

根据接口文档,调用第三方webservice接口,拼接入参,处理回参。

RPC调用Webservice接口是一种远程调用的方式,通过指定Webservice接口的调用地址、命名空间、调用的方法名调用远程接口获取结果。

二、解决方案

  1. 通过 ExecutorService 新建线程池;
  2. 定义thread类,请求webservice接口;

三、线程池简介

1、创建方式

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

2、核心参数

  1. corePoolSize : 核心线程数,一旦创建将不会再释放。如果创建的线程数还没有达到指定的核心线程数量,将会继续创建新的核心线程,直到达到最大核心线程数后,核心线程数将不在增加;如果没有空闲的核心线程,同时又未达到最大线程数,则将继续创建非核心线程;如果核心线程数等于最大线程数,则当核心线程都处于激活状态时,任务将被挂起,等待空闲线程来执行。
  2. maximumPoolSize : 最大线程数,允许创建的最大线程数量。如果最大线程数等于核心线程数,则无法创建非核心线程;如果非核心线程处于空闲时,超过设置的空闲时间,则将被回收,释放占用的资源。
  3. keepAliveTime : 也就是当线程空闲时,所允许保存的最大时间,超过这个时间,线程将被释放销毁,但只针对于非核心线程。
  4. unit : 时间单位,TimeUnit.SECONDS等。
  5. workQueue : 任务队列,存储暂时无法执行的任务,等待空闲线程来执行任务。
  6. threadFactory : 线程工程,用于创建线程。
  7. handler : 当线程边界和队列容量已经达到最大时,用于处理阻塞时的程序

3、线程池的类型

(1)单线程池

只有一个核心线程的线程池,保证任务按FIFO顺序一个个执行。

ExecutorService singlePool = Executors.newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
(2)固定线程数线程池

固定数量的可复用的线程数,来执行任务。当线程数达到最大核心线程数,则加入队列等待有空闲线程时再执行。

我觉得是最常用的线程池。

Executors.newFixedThreadPool(10);
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
(3)可缓存线程池

创建的都是非核心线程,而且最大线程数为Interge的最大值,空闲线程存活时间是1分钟。 如果有大量耗时的任务,则不适该创建方式,它只适用于生命周期短的任务。

ExecutorService cachePool = Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
(4)固定线程数,支持定时和周期性任务
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);

四、webservice

1、webservice简介

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发送。

2、WebService的三要素

(1)SOAP

SOAP也叫做简单对象访问协议,是一种简单的基于xml的协议,它使应用程序通过HTTP来交换数据,可以简单的理解为SOAP= http+xml。

SOAP协议格式:

  1. 必须有Envelope元素,此元素将整个xml文档表示为一条SOAP消息。
  2. 可选Header元素,包含头部信息。
  3. 必须有Body元素,包含所有的调用和响应信息。
  4. 可选的Fault元素,提供有关在处理此消息所发生的错误信息。

(2)WSDL

WSDL是基于XML的用于描述Web Service 及其函数(方法)、参数和返回值。也就是说wsdl是对发布出来的服务中的方法和返回值以及参数的描述(可以成为是WebService的使用说明书)。

WSDL文档结构,WSDL文档主要包括5个标签:

  1. :服务视图,WebService的服务结点,它包括服务端点。
  2. :为每个服务端点定义消息格式和协议细节。
  3. :服务端点,描述WebService可执行的操作方法,以及相关的消息,通过binding指向portType。
  4. :定义一个操作(方法)的数据参数(可有多个参数)
  5. :定义WebService使用的全部数据类型。

(3)UDDI

UDDI是一种目录服务,通过它,企业可注册并搜集Web Service。企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册Web Service服务,从而达到资源共享。UDDI旨在将全球的Web Service资源进行共享。


四、代码实例


1、封装接口调用工具类 WebServiceUtil

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);
        }
    }
}

2、线程类,请求webservice接口

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);
        }
    }
}

3、实体类

package com.guor.rpc;

import lombok.Data;

@Data
public class RequestInfo {

    private int id;
    private String name;
    private String msg;
}

4、所需Jar包

<dependency>
    <groupId>org.apache.axis2</groupId>
    <artifactId>axis2</artifactId>
    <version>1.6.3</version>
    <type>pom</type>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.apache.axis2</groupId>
    <artifactId>axis2-adb</artifactId>
    <version>1.6.3</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.apache.axis2</groupId>
    <artifactId>axis2-kernel</artifactId>
    <version>1.6.3</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.apache.axis2</groupId>
    <artifactId>axis2-transport-http</artifactId>
    <version>1.6.3</version>
</dependency>
<dependency>
    <groupId>org.apache.axis2</groupId>
    <artifactId>axis2-transport-local</artifactId>
    <version>1.6.3</version>
</dependency>

标签:Runnable,Java,axis2,import,线程,org,new,多线程,public
From: https://blog.51cto.com/u_15559285/7586698

相关文章

  • java基础-集合-day14
    目录1.数据结构算法2.本章的重点集合3.collections4.list5.泛型6.泛型通配符7.linkedList8.模拟linkedList源码--面试重点8.Iterrable9.HashSet9.LinkedHashSet10.TreeSet12map1.数据结构算法算法:解决问题的步骤例如1+2+3+...+10050*(1+100)=5050算法优劣的......
  • Java复习
    Java重要特点java语言是面向对象的java语言是健壮的。Java的强类机制,异常处理,垃圾的自动收集等是java程序健壮性的重要保证。java语言是跨平台性的。【即一个编译好的.class文件可以在多个系统下运行,这种特性称为跨平台】java语言是解释型的。【解释性语言,编译后的代码不能直接被......
  • 1.多线程(实现方式,常用方法,生命周期)
    多线程(实现方式,常用方法,生命周期)概述:可以让程序同时做多件事情;可以提高效率;只要你想让多个事情同时运行就需要用到多线程;如: 软件中的耗时操作、所有的聊天软件、所有的服务器‘并发和并行:并发:在同一时刻,有多个指令在单个CPU上交替执行;并行:在同一时刻,有多......
  • JavaWeb中对于 request对象和response对象的理解
    1.request对象和response对象的原理1.request和response对象是由服务器创建的。我们来使用它们2.request对象是来获取请求消息,response对象是来设置响应消息2.request对象继承体系结构:ServletRequest--接口|继承HttpServletRequest--接口|实现org.apache.catali......
  • Java语言中几个常用的包
    第一个包:java.lang包。该包提供了Java语言进行程序设计的基础类,它是默认导入的包。该包里面的Runnable接口和Object、Math、String、StringBuffer、System、Thread以及Throwable类需要重点掌握,因为它们应用很广。第二个包:java.util包。该包提供了包含集合框架、遗留的集合类、......
  • java.mapperUtils
    packagecom.yh.util;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importjava.io.IOException;importja......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • java实验代码
    一、这段代码展示了方法的重载(MethodOverloading)的概念。方法的重载是指在同一个类中可以定义多个具有相同名称但参数列表不同的方法。在这段代码中,有两个名为`square`的方法,一个接受整数参数,另一个接受双精度浮点数参数,它们的参数类型不同,这就是方法重载的体现。以下是代码的......
  • Java 的基本介绍
    认识Java  Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程Java......
  • 从0到1,实现Java控制台版本的ATM管理系统
    从0到1,实现Java控制台版本的ATM管理系统​ 其实作为一名Java的程序猿,无论你是初学也好,大神也罢,管理系统一直都是一个非常好的例子,初学者主要是用数组、List等等来写出一个简易的管理系统.牛逼一点的大神则用数据库+swing来做一个有界面的管理系统,其实都并不会太难。​ 今天我......