java请求并行方案_让 Yar Java Client 支持执行并行请求,ExecutorService 的使用

官方 php 客户端文档如下Yar_Concurrent_Client {

/* 属性 */

static $_callstack ;

static $_callback ;

static $_error_callback ;

/* 方法 */

public static int call ( string $uri , string $method , array $parameters [, callable $callback ] )

public static boolean loop ([ callable $callback [, callable $error_callback ]] )

public static boolean reset ( void )

}

也就是说call方法实际实在注册并行的服务调用,loop是统一发送,reset是清空调用任务集。下面我也需要实现上面类似的功能。

首先学习下ExecutorService 的使用import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.*;

/**

* Created by zhoumengkang on 16/12/15.

*/

public class YarConcurrentClient {

private static ExecutorService executorService;

static{

poolInit();

}

private static void poolInit(){

executorService = Executors.newCachedThreadPool();

}

public void call() throws ExecutionException, InterruptedException {

List> result =new ArrayList>();

for (int i = 0; i 

Future future = executorService.submit(new YarClientCallable(i));

result.add(future);

}

for(Future future:result){

System.out.println("返回值:"+ future.get());

}

}

public class YarClientCallable implements Callable {

private int seq;

public YarClientCallable(int seq) {

this.seq = seq;

}

public String call() throws Exception {

System.out.println(Thread.currentThread().getName());

Thread.sleep(3000);

System.out.println("Weak up" + seq);

return "完成" + seq;

}

}

}

测试下call方法import junit.framework.TestCase;

/**

* Created by zhoumengkang on 16/12/15.

*/

public class YarConcurrentClientTest extends TestCase {

public void testName() throws Exception {

new YarConcurrentClient().call();

new YarConcurrentClient().call();

new YarConcurrentClient().call();

}

}

测试结果为pool-1-thread-1

pool-1-thread-2

pool-1-thread-3

pool-1-thread-4

Weak up1

Weak up3

Weak up2

Weak up0

返回值:完成0

返回值:完成1

返回值:完成2

返回值:完成3

pool-1-thread-1

pool-1-thread-2

pool-1-thread-3

pool-1-thread-4

Weak up1

Weak up2

Weak up3

Weak up0

返回值:完成0

返回值:完成1

返回值:完成2

返回值:完成3

pool-1-thread-1

pool-1-thread-4

pool-1-thread-3

pool-1-thread-2

Weak up0

返回值:完成0

Weak up3

Weak up2

Weak up1

返回值:完成1

返回值:完成2

返回值:完成3

从Thread.currentThread().getName()可知,只生成了一个线程池,并且该池里的4个线程也被被重复利用了。

YarConcurrentClient 雏形package yar.concurrent.client;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import yar.YarConfig;

import yar.protocol.YarRequest;

import yar.protocol.YarResponse;

import yar.transport.YarTransport;

import yar.transport.YarTransportFactory;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.*;

/**

* Created by zhoumengkang on 2/12/15.

*/

public class YarConcurrentClient {

protected final static Logger logger = LoggerFactory.getLogger(YarConcurrentClient.class);

private static ExecutorService executorService;

private static List yarConcurrentTasks;

static{

init();

}

private static void init(){

yarConcurrentTasks = new ArrayList();

executorService = Executors.newCachedThreadPool();

}

public static void call(YarConcurrentTask yarConcurrentTask) {

yarConcurrentTasks.add(yarConcurrentTask);

}

public static void loop() {

List> result =new ArrayList>();

try{

for (YarConcurrentTask task : yarConcurrentTasks){

Future future = executorService.submit(new YarClientCallable(task));

result.add(future);

}

}catch(Exception e){

}

for(Future future:result){

try {

logger.info("返回值"+future.get().toString());

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

}

public static void reset(){

yarConcurrentTasks = null;

yarConcurrentTasks = new ArrayList();

}

public static class YarClientCallable implements Callable {

private YarConcurrentTask yarConcurrentTask;

public YarClientCallable(YarConcurrentTask yarConcurrentTask) {

this.yarConcurrentTask = yarConcurrentTask;

}

public Object call() throws Exception {

logger.debug("开始处理任务" + yarConcurrentTask.getId());

YarResponse yarResponse = null;

YarRequest yarRequest = new YarRequest();

yarRequest.setId(yarConcurrentTask.getId());

yarRequest.setMethod(yarConcurrentTask.getMethod());

yarRequest.setParameters(yarConcurrentTask.getParams());

yarRequest.setPackagerName(YarConfig.getString("yar.packager"));

YarTransport yarTransport = YarTransportFactory.get(YarConfig.getString("yar.transport"));

yarTransport.open("http://10.211.55.4/yar/server/RewardScoreService.class.php");

try {

yarResponse = yarTransport.exec(yarRequest);

} catch (IOException e) {

e.printStackTrace();

}

assert yarResponse != null;

return yarResponse.getRetVal();

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaone_JavaOne 2016后续活动

javaone我很高兴今年参加了JavaOne,我可以用一个词概括一下这一经验:辉煌。 对我来说,今年与往年相比有很大不同,因为我在周日有一个演讲要共同主持,而我剩下的一周时间都可以参加会议。 因此,我了解到在Ja…

c# redis 如何设置过期时间_Redis 过期时间与内存管理

http://www.redis.cn/commands/expire.htmlhttp://www.redis.cn/topics/lru-cache.html内存管理 当 Redis 作为缓存使用时(此时缓存仅作为热点数据提高服务的访问性能),需要考虑内存的限制,以及如何随着业务的增长,仅保…

Oracle 数据库的子查询(关联子查询)

文章目录一、子查询结果返回一个值(单列单行)二、子查询结果返回多行(单列多行)三、子查询结果返回多列多行四、关联子查询(一)子查询执行顺序(二)exists 关键字五、子查询总结六、关…

大端字节序码流中取出2字节_产生字节码

大端字节序码流中取出2字节在这篇文章中,我们将看到如何为我们的语言生成字节码。 到目前为止,我们已经看到了如何构建一种语言来表达我们想要的东西,如何验证该语言,如何为该语言构建编辑器,但实际上我们还不能运行代…

python编写程序时必须遵守的规则被称为_Python程序设计方案习题与答案

《 Python 程序设计》习题与参考答案 第 1 章 基础知识 简单说明如何选择正确的 Python 版本。 答: 在选择 Python 的时候,一定要先考虑清楚自己学习 Python 的目的是什么,打算做哪 方面的开发,有哪些扩展库可用,这些扩…

python写520_用Python做一个520表白神器,值得收藏

本文最后给出了打包好的软件,无需安装Python环境和各种依赖,直接下载软件,解压后,双击exe文件即可使用。先来看一下具体的效果。运行程序。用Python做一个520表白神器,值得收藏点击「选择图片」 选择JPG/JPGE/PNG三种中…

Oracle/MySQL数据库查询结果集的集合操作(合集/交集/差集)

文章目录集合操作的前提条件集合操作合集 union合集 union 和 union all 的比较交集 intersect差集 minus集合操作的前提条件 1.两个结果集必须结构相同。 当列的个数、列的顺序、列的数据类型一致时 , 我们称这两个结果集结构相同 2.只有结构相同的结果集才能做集合操作 集…

python有道自动翻译_利用python写一个有道翻译的脚本

废话不多说,直接上代码import urllib.request import urllib.parse import json content input("请输入要翻译的内容:") url http://fanyi.youdao.com/translate?smartresultdict&smartresultrule&smartresultugc&sessionFromn…

为什么java抗并发_用最通熟易懂的话说明,为什么要使用java并发编程

老早之前的计算机只有一个处理器,而 一个处理器在同一时刻只能处理一条指令 ,换句话说,我们的代码需要一行一行的按顺序被计算机执行,计算机只能把一个程序完整的执行完,然后再执行第二个程序。所以计算机专业的同学们…

java ee的小程序_Java EE调度程序

java ee的小程序Java EE应用程序服务器具有本机调度支持,并且在大多数应用程序中,不需要包括外部依赖项,例如著名的Quartz调度程序库。 Java EE 6和7完整配置文件上提供的Java EE 6计时器服务为我们提供了许多选项来定义调度间隔&#xff0c…

MyEclipse for Mac快捷键

文章目录编辑查询/替换导航调试重构其他编辑 快捷键功能说明Command1快速修复,比如与Syso配合,与main配合可快速构造方法签名(最经典的快捷键,就不用多说了,可以解决很多问题,比如import类、try catch包围等&#xff…

不同坐标系下角速度_最伟大的数学发明,坐标系的诞生,是人类史上的方向盘...

【想要了解更多精彩文章、视频,欢迎关注创鹏科学堂】人生最大的意义,莫过于过得更方便;数学最大的意义,莫过于帮助人类过得更方便。几千年来,自从数学出现之后,它就一直以人类生活为导向,以宇宙…

c++ double 截取_c选择double小数点后自动截取3位,不...

2016-09-01 01:05辛培兵 客户经理printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,在打印整数是使用%d符号,在打印字符是用%c 符号.这些符号被称为转换说明&#…

dynamodb分页查询_使用DynamoDBMapper查询DynamoDB项目

dynamodb分页查询在上一篇文章中,我们使用底层Java api在DynamoDB数据库上发出了查询。 使用DynamoDBMapper进行查询非常简单。 使用哈希键发出查询非常简单。 这样的查询的最佳候选者是通过使用电子邮件哈希键进行搜索的Users表。 public User getUser(String e…

python字典编码_python中包含UTF-8编码中文的列表或字典的输出

>>> dict {"asdf": "我们的python学习"} >>> print dict {asdf: \xe6\x88\x91\xe4\xbb\xac\xe7\x9a\x84python\xe5\xad\xa6\xe4\xb9\xa0} 在输出处理好的数据结构的时候很不方便,需要使用以下方法进行输出: >…

php中的ol标签,html5中ol标签的用法详解

这篇文章主要介绍了详解HTML5中ol标签的用法,是HTML5入门学习中的基础知识,需要的朋友可以参考下定义和用法标签定义有序列表。HTML 4.01 与 HTML 5 之间的差异在 HTML 4.01 中,不赞成使用 "start" 属性,在 HTML 5 中是允许的。在 HTML 4.01 中…

portlet_平台策略:从Portlet到OpenSocial小工具再到渐进式Web应用程序:最新技术

portlet介绍 由于世界仍在Java的掌控之中,因此我们经常定义所谓的基于组件的平台 。 我在2000年拥有OpenUSS(开放大学支持系统)的经验。 当时我有一个想法,就是开发一个可以使用组件体系结构和J2EE技术​​( OpenUSS C…

MySQL JDBC URL各参数详解

通常MySQL连接URL可以设置为: jdbc:mysql://localhost:3306/test?userroot&password123456&useUnicodetrue&characterEncodinggbk &autoReconnecttrue&failOverReadOnlyfalse&serverTimezoneUTC&drivercom.mysql.cj.jdbc.Driver注&am…

keil5函数 默认返回值_C++ 函数的定义

“ C对于函数的基本用法”01—函数的定义//函数声明:[返回值类型] [函数名称] (参数列表)int Function(int a, int b);//函数定义int Function(int a, int b){ //函数体 return a b;}02—函数的默认参数定义函数时可以在参数列表中为形参指定默认值int Function2…