多线程端点服务发布程序(摘)
多线程端点服务发布程序
摘自:JAVA WEB服务:构建与运行
《Java Web服务:构建与运行》以示例驱动的方式详尽地介绍了XML Web服务和RESTful Web服务所涵盖的Java相关API,以清晰、务实的方法讲述Web服务相关技术,第1章讲述Java Web服务快速入门。本节说的是多线程端点服务发布程序。
AD: 2014WOT全球软件技术峰会北京站 课程视频发布
1.10 多线程端点服务发布程序
Multithreading the Endpoint Publisher
以往的例子中,端点发布程序都是单线程的,也就是说在同一时刻只能并发处理一个客户端请求。在处理下一个请求之前,必须要等发布的服务完成当前正在处理的过程。如果当前正在处理的服务请求被挂起,在这个被挂起的请求处理完毕之前,其他后续的服务请求都无法进行。
在正式的产品环境中,Endpoint发布程序需要并发处理多个客户端请求,这样多个不可预期的客户端请求就可以在同一时间被处理。针对底层的计算机系统而言,比如对称多处理器(SMP,symmetric multiprocessor)系统,每一个独立的CPU可以并发地处理不同客户端请求。而在一个单处理器计算机环境中,可以通过时间共享机制来完成同一时间内客户端请求的并发处理。Java语言支持多线程并发处理机制。因此,需要我们解决的就是如何使端点发布程序也支持多线程处理机制。JWS框架支持端点多线程模式,程序人员无须面对复杂而又难以控制的同步块(Synchronized Block)、wait和notify方法调用等。
Endpoint对象有一个定义了标准get/set方法的Executor属性。Excutor用来执行可运行的(Runnable)任务;比如一个Java Thread实例。(Java中Runnable接口只定义了一个无返回值的公共接口方法:run()。)Executor对象对多线程处理来说是一个不错的选择,因为Executor针对被执行任务的提交和管理提供了高度封装。使端点发布程序支持多线程的第一步就是创建一个Executor类,代码如下:
- package ch01.ts;
- import java.util.concurrent.ThreadPoolExecutor;
- import java.util.concurrent.LinkedBlockingQueue;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.locks.ReentrantLock;
- import java.util.concurrent.locks.Condition;
- public class MyThreadPool extends ThreadPoolExecutor {
- private static final int pool_size = 10;
- private boolean is_paused;
- private ReentrantLock pause_lock = new ReentrantLock();
- private Condition unpaused = pause_lock.newCondition();
- public MyThreadPool(){
- super(pool_size, // core pool size
- pool_size, // maximum pool size
- 0L, // keep-alive time for idle thread
- TimeUnit.SECONDS, // time unit for keep-alive setting
- new LinkedBlockingQueue<Runnable>(pool_size)); // work queue
- }
- // some overrides
- protected void beforeExecute(Thread t, Runnable r) {
- super.beforeExecute(t, r);
- pause_lock.lock();
- try {
- while (is_paused) unpaused.await();
- }
- catch (InterruptedException e) { t.interrupt(); }
- finally { pause_lock.unlock(); }
- }
- public void pause() {
- pause_lock.lock();
- try {
- is_paused = true;
- }
- finally { pause_lock.unlock(); }
- }
- public void resume() {
- pause_lock.lock();
- try {
- is_paused = false;
- unpaused.signalAll();
- }
- finally { pause_lock.unlock(); }
- }
- }
MyThreadPool创建了一个线程数为10的线程池,线程使用固定大小的队列来存储。当使用线程池时,在线程池中有空闲线程被释放出来之前,排队中的下一个任务必须等待。而这些管理的细节都由线程池来自动处理。MyThreadPool重写了ThreadPoolExecutor中的几个方法。
使用MyThreadPool对象,端点发布程序可以支持多线程处理。下面是在前发布程序的基础上修改后的代码,通过不同方法将发布任务分解:
- package ch01.ts;
- import javax.xml.ws.Endpoint;
- class TimePublisherMT { // MT for multithreaded
- private Endpoint endpoint;
- public static void main(String[ ] args) {
- TimePublisherMT self = new TimePublisherMT();
- self.create_endpoint();
- self.configure_endpoint();
- self.publish();
- }
- private void create_endpoint() {
- endpoint = Endpoint.create(new TimeServerImpl());
- }
- private void configure_endpoint() {
- endpoint.setExecutor(new MyThreadPool());
- }
- private void publish() {
- int port = 8888;
- String url = "http://localhost:" + port + "/ts";
- endpoint.publish(url);
- System.out.println("Publishing TimeServer on port " + port);
- }
- }
ThreadPoolWorker编写完后,剩余的工作就是设置本例中Endpoint实例的executor属性,而发布程序并不会涉及线程管理的任何细节。
多线程端点发布程序比较适合一些轻量级别的产品,但是在真正的应用场景中,上面这个发布程序并不是一个服务容器;服务容器可以在同一个端口发布多个Web服务。一些Web容器,比如Tomcat,提供了这些功能实现,比较适合于在发布多个Web服务时使用。后面例子中的Web服务将会介绍如何通过Tomcat发布。
转载于:https://www.cnblogs.com/GarfieldTom/p/3954521.html
多线程端点服务发布程序(摘)相关推荐
- jax-ws和jax-rs_带有JAX-WS和Spring的Web服务应用程序
jax-ws和jax-rs 1.简介 这是一个漫长的等待,但是我最终要发布有关使用Spring创建第一个基于SOAP的Web服务应用程序的教程. JAX-WS (用于XML Web服务的Java AP ...
- 带有JAX-WS和Spring的Web服务应用程序
1.简介 这是一个漫长的等待,但是我终于发布了一个关于使用Spring创建第一个基于SOAP的Web服务应用程序的教程. JAX-WS (用于XML Web服务的Java API)是用于以XML格式创 ...
- ArcGIS之GP服务发布
模型构建器官方解释: 链接 什么是模型构建器? 1.模型构建器是一个用来创建.编辑和管理模型的应用程序.模型是将一系列地理处理工具串联在一起的工作流,它将其中一个工具的输出作为另一个工具的输入.也可以 ...
- Sharepoin学习笔记—架构系列—06 Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1
Sharepoint服务是Sharepoint的重要组成,可以说Sharepoint的许多网站功能都是基于这些服务构架起来的.这里把Sharepoint服务的相关要点总结一下. 1.什么是 Share ...
- Sharepoin学习笔记—架构系列—Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1
Sharepoin学习笔记-架构系列-Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1 Sharepoint服务是Sha ...
- 小程序 timestamp_通过构建Timestamp微服务应用程序来学习Node.js
小程序 timestamp by Ayo Isaiah 通过Ayo Isaiah 通过构建Timestamp微服务应用程序来学习Node.js (Learn Node.js by building a ...
- 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。...
反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹. 假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常 ...
- iis布置asp.net网站——服务应用程序不可用
本例环境:Windows XP SP3,iis 5.1,Visual Studio 2008,.NET 1.x,.NET 2.x,.NET 3.x,.NET 4.x 有时我们在做一个asp.net网站 ...
- Dubbo服务发布调用实现
服务发布调用实现 系统需求 根据商品id,查询商品信息 Dao 单表查询,不需要写代码 使用Mybatis逆向工程生成的代码 Interface 在taotao-manager-interface工程 ...
最新文章
- 原创 | 斯坦福Machine Learning with Graphs 学习笔记(第二讲)
- 怎么git 自己建的服务器_如何搭建自己的git服务器
- js一些通用方法的封装
- isp 图像算法(四)之white balance gain control 就是对 r,gr,gb,b 进行加权
- php 提取登录QQ,php QQ登录
- 某人想在h小时内钓到_为某人命名以重新连接到您的服务器
- 计算机系统计算机,计算机系统与计算机化系统的区别
- PHP 将Base64图片保存到 Sae storage
- 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
- OpenCV 离散傅里叶变换
- Kindeditor在线HTML富文本编辑器使用入门
- 安卓客户端使用矢量图
- 本草纲目pdf彩图版下载_本草纲目彩色插图完整版(本草纲目pdf) PDF
- mysql多表关联查询慢_mysql数据库多表关联查询的慢SQL优化
- 西湖论剑2021中国杭州网络安全技能大赛部分Writeup
- 50个漂亮的页面导航设计
- 清华姚班教授:​我见过太多博士生精神崩溃,身体垮掉,一事无成
- 移动游戏开打平台争夺战
- Win10下媲美apt的包管理工具 Scoop 的安装以及常用软件清单
- MetaQ安装部署文档