多线程端点服务发布程序

摘自: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类,代码如下:

  1. package ch01.ts;
  2. import java.util.concurrent.ThreadPoolExecutor;
  3. import java.util.concurrent.LinkedBlockingQueue;
  4. import java.util.concurrent.TimeUnit;
  5. import java.util.concurrent.locks.ReentrantLock;
  6. import java.util.concurrent.locks.Condition;
  7. public class MyThreadPool extends ThreadPoolExecutor {
  8. private static final int pool_size = 10;
  9. private boolean is_paused;
  10. private ReentrantLock pause_lock = new ReentrantLock();
  11. private Condition unpaused = pause_lock.newCondition();
  12. public MyThreadPool(){
  13. super(pool_size,         // core pool size
  14. pool_size,          // maximum pool size
  15. 0L,     // keep-alive time for idle thread
  16. TimeUnit.SECONDS,   // time unit for keep-alive setting
  17. new LinkedBlockingQueue<Runnable>(pool_size)); // work queue
  18. }
  19. // some overrides
  20. protected void beforeExecute(Thread t, Runnable r) {
  21. super.beforeExecute(t, r);
  22. pause_lock.lock();
  23. try {
  24. while (is_paused) unpaused.await();
  25. }
  26. catch (InterruptedException e) { t.interrupt(); }
  27. finally { pause_lock.unlock(); }
  28. }
  29. public void pause() {
  30. pause_lock.lock();
  31. try {
  32. is_paused = true;
  33. }
  34. finally { pause_lock.unlock(); }
  35. }
  36. public void resume() {
  37. pause_lock.lock();
  38. try {
  39. is_paused = false;
  40. unpaused.signalAll();
  41. }
  42. finally { pause_lock.unlock(); }
  43. }
  44. }

MyThreadPool创建了一个线程数为10的线程池,线程使用固定大小的队列来存储。当使用线程池时,在线程池中有空闲线程被释放出来之前,排队中的下一个任务必须等待。而这些管理的细节都由线程池来自动处理。MyThreadPool重写了ThreadPoolExecutor中的几个方法。

使用MyThreadPool对象,端点发布程序可以支持多线程处理。下面是在前发布程序的基础上修改后的代码,通过不同方法将发布任务分解:

  1. package ch01.ts;
  2. import javax.xml.ws.Endpoint;
  3. class TimePublisherMT { // MT for multithreaded
  4. private Endpoint endpoint;
  5. public static void main(String[ ] args) {
  6. TimePublisherMT self = new TimePublisherMT();
  7. self.create_endpoint();
  8. self.configure_endpoint();
  9. self.publish();
  10. }
  11. private void create_endpoint() {
  12. endpoint = Endpoint.create(new TimeServerImpl());
  13. }
  14. private void configure_endpoint() {
  15. endpoint.setExecutor(new MyThreadPool());
  16. }
  17. private void publish() {
  18. int port = 8888;
  19. String url = "http://localhost:" + port + "/ts";
  20. endpoint.publish(url);
  21. System.out.println("Publishing TimeServer on port " + port);
  22. }
  23. }

ThreadPoolWorker编写完后,剩余的工作就是设置本例中Endpoint实例的executor属性,而发布程序并不会涉及线程管理的任何细节。

多线程端点发布程序比较适合一些轻量级别的产品,但是在真正的应用场景中,上面这个发布程序并不是一个服务容器;服务容器可以在同一个端口发布多个Web服务。一些Web容器,比如Tomcat,提供了这些功能实现,比较适合于在发布多个Web服务时使用。后面例子中的Web服务将会介绍如何通过Tomcat发布。

转载于:https://www.cnblogs.com/GarfieldTom/p/3954521.html

多线程端点服务发布程序(摘)相关推荐

  1. jax-ws和jax-rs_带有JAX-WS和Spring的Web服务应用程序

    jax-ws和jax-rs 1.简介 这是一个漫长的等待,但是我最终要发布有关使用Spring创建第一个基于SOAP的Web服务应用程序的教程. JAX-WS (用于XML Web服务的Java AP ...

  2. 带有JAX-WS和Spring的Web服务应用程序

    1.简介 这是一个漫长的等待,但是我终于发布了一个关于使用Spring创建第一个基于SOAP的Web服务应用程序的教程. JAX-WS (用于XML Web服务的Java API)是用于以XML格式创 ...

  3. ArcGIS之GP服务发布

    模型构建器官方解释: 链接 什么是模型构建器? 1.模型构建器是一个用来创建.编辑和管理模型的应用程序.模型是将一系列地理处理工具串联在一起的工作流,它将其中一个工具的输出作为另一个工具的输入.也可以 ...

  4. Sharepoin学习笔记—架构系列—06 Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1

    Sharepoint服务是Sharepoint的重要组成,可以说Sharepoint的许多网站功能都是基于这些服务构架起来的.这里把Sharepoint服务的相关要点总结一下. 1.什么是 Share ...

  5. Sharepoin学习笔记—架构系列—Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1

    Sharepoin学习笔记-架构系列-Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1 Sharepoint服务是Sha ...

  6. 小程序 timestamp_通过构建Timestamp微服务应用程序来学习Node.js

    小程序 timestamp by Ayo Isaiah 通过Ayo Isaiah 通过构建Timestamp微服务应用程序来学习Node.js (Learn Node.js by building a ...

  7. 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。...

    反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹. 假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常 ...

  8. 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网站 ...

  9. Dubbo服务发布调用实现

    服务发布调用实现 系统需求 根据商品id,查询商品信息 Dao 单表查询,不需要写代码 使用Mybatis逆向工程生成的代码 Interface 在taotao-manager-interface工程 ...

最新文章

  1. 原创 | 斯坦福Machine Learning with Graphs 学习笔记(第二讲)
  2. 怎么git 自己建的服务器_如何搭建自己的git服务器
  3. js一些通用方法的封装
  4. isp 图像算法(四)之white balance gain control 就是对 r,gr,gb,b 进行加权
  5. php 提取登录QQ,php QQ登录
  6. 某人想在h小时内钓到_为某人命名以重新连接到您的服务器
  7. 计算机系统计算机,计算机系统与计算机化系统的区别
  8. PHP 将Base64图片保存到 Sae storage
  9. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
  10. OpenCV 离散傅里叶变换
  11. Kindeditor在线HTML富文本编辑器使用入门
  12. 安卓客户端使用矢量图
  13. 本草纲目pdf彩图版下载_本草纲目彩色插图完整版(本草纲目pdf) PDF
  14. mysql多表关联查询慢_mysql数据库多表关联查询的慢SQL优化
  15. 西湖论剑2021中国杭州网络安全技能大赛部分Writeup
  16. 50个漂亮的页面导航设计
  17. 清华姚班教授:​我见过太多博士生精神崩溃,身体垮掉,一事无成
  18. 移动游戏开打平台争夺战
  19. Win10下媲美apt的包管理工具 Scoop 的安装以及常用软件清单
  20. MetaQ安装部署文档

热门文章

  1. 经验共享:由备份和负载均衡
  2. 编程珠玑第三章习题答案
  3. 用Excel画五线谱!
  4. 云上人最终产品简易代码
  5. 利用Python实现推流直播详解
  6. 编写驱动的makefile使要
  7. iPhoneX快速适配,简单到你想哭。
  8. 深入理解SpringCloud之配置刷新
  9. Universal-Image-Loader 示例 工具
  10. 5款没有专利纠葛的Linux发行版