Microsoft Word - 朱晔和你聊Spring系列S1E5:Spring WebFlux小探.docx

Size: px
Start display at page:

Download "Microsoft Word - 朱晔和你聊Spring系列S1E5:Spring WebFlux小探.docx"

Transcription

1 朱晔和你聊 Spring 系列 S1E5:Spring WebFlux 小探 本文会来做一些应用对比 Spring MVC 和 Spring WebFlux, 观察线程模型的区别, 然后做 一下简单的压力测试 创建一个传统的 Spring MVC 应用 先来创建一个新的 webflux-mvc 的模块 : <?xml version="1.0" encoding="utf-8"?> <project xmlns=" xmlns:xsi=" xsi:schemalocation=" <modelversion>4.0.0</modelversion> <groupid>me.josephzhu</groupid> <artifactid>spring101-webflux-mvc</artifactid> <version>0.0.1-snapshot</version> <packaging>jar</packaging> <name>spring101-webflux-mvc</name> <description></description> <parent> <groupid>me.josephzhu</groupid> <artifactid>spring101</artifactid> <version>0.0.1-snapshot</version> </parent> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-mongodb</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> </dependencies>

2 <build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> </plugin> </plugins> </build> </project> 然后在项目里定义一个我们会使用到的 POJO: package me.josephzhu.spring101webfluxmvc; import lombok.allargsconstructor; import lombok.data; import lombok.noargsconstructor; import org.springframework.data.annotation.id; = "mydata") public class MyData private String id; private String payload; private long time; 是为 Mongodb 服务的, 我们定义了 MyData 将会以 mydata 作为 Collection 的名字, 然后 id 字段是 Document 的 Id 列 然后我们来创建 Controller, 在这个 Controller 里面我们尝试三种不同的操作 : 1. Sleep 100ms 的纯获取数据的方法 从请求中获得 length 参数作为 payload 字符串的长度, 从请求中获得 size 参数作为 MyData 的个数 我们在之后的测试过程中可以随意调节这两个参数来调整我们的数据量 2. 从 Mongodb 获取数据的方法, 获取到数据后直接返回 3. 复合逻辑 先走 HTTP 请求从 data 方法获取数据, 然后把数据保存进入 Mongodb, 最后返回这些数据 package me.josephzhu.spring101webfluxmvc;

3 import org.springframework.beans.factory.annotation.autowired; import org.springframework.core.parameterizedtypereference; import org.springframework.http.httpmethod; import org.springframework.http.responseentity; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.requestparam; import org.springframework.web.bind.annotation.restcontroller; import org.springframework.web.client.resttemplate; import org.springframework.web.util.uricomponentsbuilder; import java.util.list; import java.util.uuid; import java.util.stream.collectors; import public class MyController private RestTemplate private MyRepository public List<MyData> getdata(@requestparam(value = "size", defaultvalue = "10") int size,@requestparam(value = "length", defaultvalue = "100") int length) { try { Thread.sleep(100); catch (InterruptedException e) { String payload = IntStream.rangeClosed(1,length).mapToObj(i->"a").collect(Collectors.joining()); return IntStream.rangeClosed(1, size).maptoobj(i->new MyData(UUID.randomUUID().toString(), payload, public List<MyData> getdbdata() { return

4 public List<MyData> = "size", defaultvalue = "10") int size,@requestparam(value = "length", defaultvalue = "100") int length){ UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(" size).queryparam("length", length); ResponseEntity<List<MyData>> responseentity = resttemplate.exchange(builder.touristring(), HttpMethod.GET, null, new ParameterizedTypeReference<List<MyData>>() {); return responseentity.getbody().stream().map(myrepository::save).collect(collectors.tolist()) ; 注意, 在这里我们使用了 Java 8 的 Steam 来做一些操作避免使用 for 循环 : 1. 通过 length 参数构建 payload(payload 由 length 个字符 a 构成 ) 2. 通过 size 参数构建 MyData 的 List 3. 在 RestTemplate 获取到 MyData 的 List 后, 把每一个对象交由 myrepository 的 save 方法来处理, 然后统一收集返回结果 这些 Stream 的代码都是同步处理, 也不涉及外部 IO, 和非阻塞没有任何关系, 只是方便代码编写 为了让代码可以运行, 我们还需要继续来配置下 Mongodb 的 Repository: package me.josephzhu.spring101webfluxmvc; import org.springframework.data.mongodb.repository.mongorepository; import public interface MyRepository extends MongoRepository<MyData, String> { 因为我们没有用到复杂的查询, 在代码里只是用到了 findall 方法, 所以这里我们无需定义额外的方法, 只是声明接口即可 最后, 我们创建主应用程序, 顺便配置一下 Mongodb 和 RestTemplate: package me.josephzhu.spring101webfluxmvc; import com.mongodb.mongoclientoptions; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.boot.web.client.resttemplatebuilder; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.web.client.resttemplate;

5 public class Spring101WebfluxMvcApplication MongoClientOptions mongoclientoptions(){ return public RestTemplate resttemplate(resttemplatebuilder builder) { return builder.build(); public static void main(string[] args) { SpringApplication.run(Spring101WebfluxMvcApplication.class, args); 这里我们配置了 Mongodb 客户端使得之后在进行压力测试的时候能有超过 100 个连接连接到 Mongodb, 否则会出现无法获取连接的问题 创建 WebFlux 版本的应用 现在我们再来新建一个 webflux 模块 : <?xml version="1.0" encoding="utf-8"?> <project xmlns=" xmlns:xsi=" xsi:schemalocation=" <modelversion>4.0.0</modelversion> <groupid>me.josephzhu</groupid> <artifactid>spring101-webflux</artifactid> <version>0.0.1-snapshot</version> <packaging>jar</packaging> <name>spring101-webflux</name> <description></description> <parent> <groupid>me.josephzhu</groupid>

6 <artifactid>spring101</artifactid> <version>0.0.1-snapshot</version> </parent> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-mongodb-reactive</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-webflux</artifactid> </dependency> <dependency> <groupid>io.projectreactor</groupid> <artifactid>reactor-test</artifactid> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> </plugin> </plugins> </build> </project> 这里可以注意到, 我们引入了 webflux 这个 starter 以及 data-mongodb-reactive 这个 starter 在之前的 Spring MVC 项目中, 我们引入的是 mvc 和 data-mongodb 两个 starter 然后, 我们同样需要创建一下 MyData 类 ( 代码和之前一模一样, 这里省略 ) 最关键的一步, 我们来创建三个 Controller 方法的定义 : package me.josephzhu.spring101webflux; import org.springframework.beans.factory.annotation.autowired; import org.springframework.http.mediatype; import org.springframework.stereotype.component; import org.springframework.web.reactive.function.client.webclient;

7 import org.springframework.web.reactive.function.server.serverrequest; import org.springframework.web.reactive.function.server.serverresponse; import reactor.core.publisher.flux; import reactor.core.publisher.mono; import java.time.duration; import java.util.uuid; import java.util.stream.collectors; import java.util.stream.intstream; import static public class MyHandler private MyReactiveRepository myreactiverepository; public Mono<ServerResponse> getdata(serverrequest serverrequest) { int size = Integer.parseInt(serverRequest.queryParam("size").orElse("10")); int length = Integer.parseInt(serverRequest.queryParam("length").orElse("100")); String payload = IntStream.rangeClosed(1,length).mapToObj(i->"a").collect(Collectors.joining()); Flux<MyData> data = Flux.fromStream(IntStream.rangeClosed(1, size).maptoobj(i->new MyData(UUID.randomUUID().toString(), payload, System.currentTimeMillis()))).delaySequence(Duration.ofMillis(100)); return ok().contenttype(mediatype.application_json).body(data, MyData.class); public Mono<ServerResponse> getdbdata(serverrequest serverrequest) { Flux<MyData> data = myreactiverepository.findall(); return ok().contenttype(mediatype.application_json).body(data, MyData.class); public Mono<ServerResponse> savedata(serverrequest serverrequest) { int size = Integer.parseInt(serverRequest.queryParam("size").orElse("10")); int length = Integer.parseInt(serverRequest.queryParam("length").orElse("100"));

8 Flux<MyData> data = WebClient.create().get().uri(builder -> builder.scheme("http").host("localhost").port(8080).path("data").queryparam("size", size).queryparam("length", length).build()).accept(mediatype.application_json).retrieve().bodytoflux(mydata.class).flatmap(myreactiverepository::save); return ok().contenttype(mediatype.application_json).body(data, MyData.class); 这里要说明几点 : 1. 在 WebFlux 中, 方式来定义 Controller, 也可以采用函数式方式来声明对外的 Endpoint, 也就是声明 Handler+Router 我们这里采用的是更有特色的后者来演示 2. 请你比较一下三个方法的实现对于两个版本的区别 最主要的区别, 我们返回的实际数据是 Mono<> 和 Flux<>, 分别代表 0~1 个对象和 0~N 对象的响应式流 3. 在 savedata 方法中, 对于 Spring MVC 我们使用的是阻塞的 RestTemplate 来从远端获取数据, 对于 Spring WebFlux 我们使用的是非阻塞的 WebClient 来获取数据 获取数据后, 我们直接使用 flatmap 获取到了所有的 MyData 转给我们的响应式的 Mongodb Repository 来处理数据 4. 对于 savedata 方法中插入 Mongodb 的操作, 这里和 MVC 的例子有很大的不同需要注意 在 MVC 中, 我们把远程服务返回的结果转为 Stream 数据流, 同步依次调用 save 方法, 整个过程只会有占用一个 Mongodb 的连接 而在这里, 直接对 Flux 流进行了 Map, 整个过程相当于并发进行了 Mongodb 的调用 在之后做压测的时候, 我们会再次提到这点 刚才有提到, 采用函数式声明对外的 Endpoint 的话除了定义 Handler, 还需要配置 Router 来和 Handler 关联, 配置如下 : package me.josephzhu.spring101webflux; import org.springframework.beans.factory.annotation.autowired; import org.springframework.context.annotation.bean;

9 import org.springframework.context.annotation.configuration; import org.springframework.web.reactive.function.server.routerfunction; import org.springframework.web.reactive.function.server.serverresponse; import static org.springframework.web.reactive.function.server.requestpredicates.get; import static public class RouterConfig private MyHandler public RouterFunction<ServerResponse> config() { return route(get("/data"), myhandler::getdata).androute(get("/dbdata"), myhandler::getdbdata).androute(get("/savedata"), myhandler::savedata); 这段代码没有太多需要说明, 这里我们定义了三个 GET 请求 ( 相当于 MVC 然后对应到注入的 myhandler 的三个方法上 然后我们还需要创建 Mongodb 的 Repository: package me.josephzhu.spring101webflux; import org.springframework.data.mongodb.repository.reactivemongorepository; import public interface MyReactiveRepository extends ReactiveMongoRepository<MyData, String> { 以及配置和启动类 : package me.josephzhu.spring101webflux; import com.mongodb.connectionstring; import com.mongodb.async.client.mongoclientsettings; import com.mongodb.connection.clustersettings; import com.mongodb.connection.connectionpoolsettings; import com.mongodb.reactivestreams.client.mongoclient; import com.mongodb.reactivestreams.client.mongoclients; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.context.annotation.bean;

10 public class Spring101WebfluxApplication MongoClient mongoclient(){ return MongoClientSettings mongoclientsettings(){ return MongoClientSettings.builder().clusterSettings(ClusterSettings.builder().applyConnectionString(new ConnectionString("mongodb://localhost")).build()).connectionPoolSettings(ConnectionPoolSettings.builder().minSize(200).ma xsize(1000).maxwaitqueuesize( ).build()).build(); public static void main(string[] args) { SpringApplication.run(Spring101WebfluxApplication.class, args); 这里对 Mongodb 做了一些配置, 主要也是希望放大连接池这块的默认限制, 为今后的压测服务 注意, 在这里配置的 Bean 是 com.mongodb.reactivestream.client 下的 MongoClient, 如下图所示, 还有其它两个 MongoClient, 如果修改了不匹配的 MongoClient 的话是不会有作用的, 我在这个坑里躺了两小时 完成后可以打开浏览器测试一下接口 :

11 Spring MVC 还是 WebFlux? 下图是官网的一个图说明了两者的关系, 然后官网也给出了一些建议 : 1. 如果你现在的 Spring MVC 运行的没啥问题的话就别改了, 有大量的类库可以使用, 实现简单易于理解 2. 如果你希望实现轻量级的, 函数式 Web 框架, 那么可以考虑 WebFlux 的函数 Web 端点 3. 如果你依赖阻塞的持久化 API 比如 JPA 和 JDBC 那么也就只能选择 Spring MVC 了 目前对于非阻塞的 JDBC 实现有一些早期的项目在探索, 但是没有到可以上生产的成熟度 4. 在 Spring MVC 应用程序中进行远程调用也是可以使用响应式的 WebClient 的 Spring MVC 也可以使用其它的响应式组件 每次调用延迟越厉害受益越大 5. 对于大型应用程序要考虑到非阻塞方式实现的学习曲线 最简单的起步方式就是使用 WebClient, 完全切换到非阻塞需要花时间熟悉函数式声明式的编程 API

12 官方的意思也是可以在一些小引用上尝试 WebFlux, 对于大型应用不建议冒然转到 WebFlux 观察线程模型 我们知道对于阻塞的实现方式, 我们采用线程池来服务请求 ( 线程池中的会维护一组普通的线程, 线程池只是节省线程创建的时间 ), 对于每一个请求的处理, 至始至终都是在一个线程中进行, 如果处理的过程中我们需要访问外部的网络或数据库, 那么线程就处于阻塞状态, 这个线程无法服务其它请求, 如果当时还有更多的并发的话, 就需要创建更多的线程来服务其它请求 这种实现方式是非常简单的, 应对压力的增长扩容方式也是粗暴的, 那就是增加更多线程 对于非阻塞的方式, 采用的是 EventLoop 的方式,IO 操作的时候是不占用工作线程的, 因此只会创建一组和 CPU 核数相当的工作线程用于工作处理 (NodeJS 甚至是单线程的, 这种就更危险了, 就那么一个工作线程, 一旦被长时间占用其它请求都无法处理 ) 由于整个处理过程中 IO 请求不占用线程时间, 线程不会阻塞等待, 再增加超过 CPU 核数的工作线程也是没有意义的 ( 只会白白增加线程切换的开销 ) 对于这种方式在压力增长后, 因为我们不需要增加额外的线程, 也就没有了绝对的瓶颈 试想一下在阻塞模型下, 对于 5000 的并发, 而且每一个并发阻塞的时间非常长, 那么我们其实需要 5000 个线程来服务 ( 这么多线程 99% 其实都是在等待, 属于空耗系统资源 ), 创建 5000 的线程不谈其它的, 如果线程栈大小是 1M 的话就需要 5GB 的内存 对于非阻塞的线程模型在 8 核机器上还是 8 个工作线程, 内存占用还是这么小, 可以以最小的开销应对大并发, 系统的损耗很少 非阻塞的 Reactive 模式是内耗非常小的模式, 但是这是有代价的, 在实现上我们需要确保处理过程中没有阻塞产生, 否则就会浪费宝贵的数目固定的工作线程, 也就是说我们需要依赖配套的非阻塞 IO 类库来使用

13 在默认情况下 tomcat 的工作线程池初始化为 10, 最大 200, 我们通过启动本文创建的 Spring101WebfluxMvcApplication 程序, 用 jvisualvm 工具来看下初始的情况 (35 个线 程 ): 在项目的 application.properties 文件中我们配置 tomcat 的最大线程数 : server.tomcat.max-threads=250 在压力的情况下, 我们再来观察一下线程的情况 (272 个线程 ):

14 的确是创建多达 250 个工作线程 这里看到大部分线程都在休眠, 因为我们这里运行的是 刚才的 data() 方法, 在方法内我们休眠了 100 毫秒 对于同样的压力, 我们再来看一下 Spring101WebfluxApplication 程序的线程情况 (44 个线程 ):

15 可以看到用于处理 HTTP 的 Reactor 线程只有 8 个, 和本机 CPU 核数量一致 ( 下面有十个 Thread 打头的线程是处理和 Mongodb 交互的, 忽略 ), 只需要这 8 个线程处理 HTTP 请 求足以, 因为 HTTP 请求的 IO 处理不会占用线程 使用 Gatling 进行压力测试 我们可以使用 Gatling 类库进行压力测试, 我个人感觉比 Jmeter 方便 配置很简单, 首先 我们要安装 Scala 的 SDK, 然后我们新建一个模块 : <?xml version="1.0" encoding="utf-8"?> <project xmlns:xsi=" xmlns=" xsi:schemalocation=" <modelversion>4.0.0</modelversion> <groupid>me.josephzhu</groupid> <artifactid>spring101-webstresstest</artifactid> <version>0.0.1-snapshot</version> <packaging>jar</packaging> <name>spring101-webstresstest</name> <description></description>

16 <dependencies> <dependency> <groupid>io.gatling.highcharts</groupid> <artifactid>gatling-charts-highcharts</artifactid> <version>2.3.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupid>io.gatling</groupid> <artifactid>gatling-maven-plugin</artifactid> <version>2.2.4</version> <configuration> <simulationclass>me.josephzhu.spring101.webstresstest.stresstest</simulationclass> <resultsfolder>/users/zyhome/gatling</resultsfolder> </configuration> </plugin> </plugins> </build> </project> 引入了 garling 的 maven 插件, 在这里配置了测试结果输出路径以及压测的类 接下去创建一下这个 Scala 测试类 : package me.josephzhu.spring101.webstresstest import io.gatling.core.predef._ import io.gatling.core.scenario.simulation import io.gatling.http.predef._ class StressTest extends Simulation { val scn = scenario("data").repeat(1000) { exec( http("data").get(" "application/json").check(status.is(200)).check(substring("payload"))) setup(scn.inject(atonceusers(200)))

17 这段代码定义了如下的测试行为 : 1. 声明一个 data 测试场景, 重复进行 1000 次测试, 发起一个远程调用, 验证调用结果的响应状态码是 200 并且返回的结果包含字符串 payload 2. 测试启动的时候直接压上去 200 个用户, 每一个用户运行完这 1000 次测试后结束了, 所以这种方式一开始会是 200 用户到测试最后阶段用户数会慢慢减少 当然还有其它一些测试方式 ( 比如慢慢递增用户的方式 ), 详见官网 : nothingfor(4 seconds), // 1 atonceusers(10), // 2 rampusers(10) over (5 seconds), // 3 constantuserspersec(20) during (15 seconds), // 4 constantuserspersec(20) during (15 seconds) randomized, // 5 rampuserspersec(10) to 20 during (10 minutes), // 6 rampuserspersec(10) to 20 during (10 minutes) randomized, // 7 splitusers(1000) into (rampusers(10) over (10 seconds)) separatedby (10 seconds), // 8 splitusers(1000) into (rampusers(10) over (10 seconds)) separatedby atonceusers(30), // 9 heavisideusers(1000) over (20 seconds) // 10 压力测试一 先来进行第一个测试,1000 并发对 data 接口进行 100 次循环 ( 还记得吗, 接口有 100ms 休眠 or 延迟的 ): class StressTest extends Simulation { val scn = scenario("data").repeat(100) { exec( http("mvc data").get(" "application/json").check(status.is(200)).check(substring("payload"))) setup(scn.inject(atonceusers(1000)))

18 下面两个图分别是 MVC 和 WebFlux 的测试结果 ( 因为都是 8080 端口, 所以测试的时候记 得切换重启两个应用哦 ):

19 可以看到 WebFlux 的吞吐几乎是 MVC 的翻倍, 平均响应时间少了两倍不止, 很明显, 在等待的时候,2000 个并发用户大大超过了我们配置的 250 个线程池的线程数量, 这个时候只能排队, 对于非阻塞的方式, 延迟是不会占用处理线程的, 在延迟结束后才会去占用处理线程的资源进行处理, 不会收到并发用户数受限于线程池线程数的情况 我们把 Sleep 相关代码注释再进行一次测试看看情况, 分别是 MVC 和 WebFlux:

20

21 这个时候 WebFlux 优势没有那么明显了 性能测试二 现在我们来访问一下 接口往 Mongodb 来初始化 100 条数据, 然后修改一下测试脚本压测 dbdata 接口 : class StressTest extends Simulation { val scn = scenario("data").repeat(100) { exec( http("data").get(" "application/json").check(status.is(200)).check(substring("payload")))

22 setup(scn.inject(atonceusers(1000))) 下面看下这次的测试结果, 分别是 MVC 和 WebFlux:

23 吞吐量没有太多提高, 平均响应时间快不少 性能测试三 再来试一下第三个 savedata 接口的情况 修改测试代码 : class StressTest extends Simulation { val scn = scenario("data").repeat(100) { exec( http("data").get(" "application/json").check(status.is(200)).check(substring("payload"))) setup(scn.inject(atonceusers(200)))

24 这里我们修改并发用户为 200, 每个用户进行 100 次测试, 每次测试存入 Mongodb 5 条 100KB 的数据, 一次测试后总数据量在 10 万条 这次测试我们并没有使用 1000 并发用户, 原因是这个测试我们会先从远端获取数据然后再存入 Mongodb, 远端的服务也是来自于当前应用程序, 我们的 Tomcat 最多只有 250 个线程, 在启动 1000 个用户后, 一些线程服务于 savedata 接口, 一些线程服务于 data 接口 (savedata 接口用到的 ), 这样相当于造成了循环依赖问题, 请求在等待更多的可用线程执行服务 data 接口的响应, 而这个时候线程又都被占了导致无法分配更多的请求, 测试几乎全部超时 下面看下这次的测试结果, 分别是 MVC 和 WebFlux:

25 WebFlux 也是并发略高, 性能略好的优势 对于响应时间的分布我们再来细看下下面的 图 :

26 第一个图是 MVC 版本的响应时间分布, 可以看到抖动比第二个图的 WebFlux 的大不少 最后来看看测试过程中 MVC 的 JVM 情况 (263 个线程 ): 以及 WebFlux 的 (41 线程 ):

27 性能测试四 我们来测试一下下面两种情况下对于 WebFlux 版本 Mongodb 侧的情况 : class StressTest extends Simulation { val scn = scenario("data").repeat(1000) { exec( http("data").get(" "application/json").check(status.is(200)).check(substring("payload"))) setup(scn.inject(atonceusers(200))) 以及 class StressTest extends Simulation { val scn = scenario("data").repeat(1000) { exec( http("data")

28 .get(" "application/json").check(status.is(200)).check(substring("payload"))) setup(scn.inject(atonceusers(200))) 区别就在远程服务返回的 Flux<MyData> 是 1 个还是 5 个 在 1 个的时候运行测试可以看到我们 Mongodb 有 64 个连接 ( 需要把之前连接池的配置最小设置为小一点, 比如 50): > db.serverstatus().connections { "current" : 64, "available" : 3212, "totalcreated" : 8899 在 size 为 5 的时候,Flux<Data> 返回的是 5 个对象, 使用这个请求压测的时候 Mongodb 的连接数如下 : > db.serverstatus().connections { "current" : 583, "available" : 2693, "totalcreated" : 这是因为 Flux 拿到的数据直接以响应式进入 Mongodb, 并没有等到所有数据拿到之后串行调用方法 总结一下这几次的测试, 我们发现 WebFlux 方式对于 MVC 方式能有略微的性能提升, 对于请求阻塞的时候性能优势明显 我本金的测试并没有看到现象中的几倍甚至几十倍的性能提升, 我猜原因如下 : 1. 本机有性能瓶颈了, 压测客户端 Mongodb 服务器 服务端都在本机运行, 干扰因素太多,CPU 的使用你争我夺, 测试不公平 2. 测试的时候 CPU 永远是 100% 还死机好几次, 我根本无法测试更高的并发, 无法完全把非阻塞的性能压出来 3. 我本机测试的时候走的是 localhost 而不是内网, 不经过物理网卡, 可能无法体现非阻塞的性能如果有条件可以使用三台独立服务器在内网进行 1 万以上并发用户的性能测试或许可以得到更科学的结果 总结 本文我们创建了 WebFlux 和 MVC 两套应用对比演示了简单返回数据 发出远程请求 使 用 Mongodb 等一些简单的应用场景, 然后来看了一下 ThreadPerRequest 和 EventLoop 方

29 式线程模型的区别, 最后使用 Gatling 进行了几个 Case 的压力测试并且观察结果 我觉得 : 1. 非阻塞模型肯定是好东西, 在 IO 压力和 IO 延迟很大的情况下, 非阻塞模型因为不需要更多的线程, 内耗小, 性能略好, 而且也稳定, 所以更利于高并发 2. WebFlux 的函数式和声明方式实现需要有很高的 API 熟悉使用门槛, 对于复杂的逻辑这种方式的实现比回调地狱更容易绕晕, 而且容易产生 Bug( 或许以后有可能响应式的编程在 API 上有可能和传统方式进行统一 ) 3. 目前和 WebFlux 配套的其它一些 Reactive 的库还不是很全面成熟, 要对复杂的业务逻辑全面启用响应式编程有点难, 阻塞调用不是不能在 WebFlux 中混用, 但是这种方式还是采用了线程池来处理, 现在容器也是 NIO 的了, 有又多大区别 4. 采用阻塞方式实现, 由阻塞的线程进行天然背压进行流控, 非阻塞方式很直接一竿子到底, 从外部请求直接到最底层存储, 需要做好流控, 这是非常容易产生问题的一个点, 当请求的处理无需通过线程来承载的时候, 前端压力会直通最底层数据源, 不收任何扩容方面的限制, 直接击溃底层 5. 对于阻塞的方式, 多线程的调度天然就是一个任务的负载均衡, 并不会出现太严重的卡死工作线程的问题, 非阻塞应用编程我们要有意识代码在哪个线程上运行, 如果是 reactor 线程的话千万不能长时间阻塞综上所述, 使用 WebFlux 进行响应式编程我个人认为目前只适合做类 IO 转发的高并发的又看中资源使用效率的应用场景 ( 比如 Gateway 网关服务 ), 对于复杂的业务逻辑不太适合, 在 90% 的情况下响应式的编程模型和线程模型不会享受大幅性能优势, 更不建议盲目把现有的应用使用 WebFlux 来重写 当然, 这肯定是一个会持续发展的方向, 可以先接触研究起来

Microsoft Word - 朱晔和你聊Spring系列S1E7:简单好用的Spring Boot Actuator.docx

Microsoft Word - 朱晔和你聊Spring系列S1E7:简单好用的Spring Boot Actuator.docx 朱晔和你聊 Spring 系列 S1E7: 简单好用的 Spring Boot Actuator 本文会来看一下 Spring Boot Actuator 提供给我们的监控端点 Endpoint 健康检查 Health 和打点指标 Metrics 等所谓的 Production-ready( 生产环境必要的一些 ) 功能 监控端点 我们先来新建一个模块 :

More information

将 MD5 的工具类拷贝到项目中 二 微服务模块的搭建 我们将权限的查询放到一个单独的模块中, 这个模块提供接口供给消费者远程调用 (RPC), 这次范例是微服开发的雏形, 在以后你使用 springcloud 的时候会使用到今天的概念 1 使用 maven 创建新的模块 (microboot-sh

将 MD5 的工具类拷贝到项目中 二 微服务模块的搭建 我们将权限的查询放到一个单独的模块中, 这个模块提供接口供给消费者远程调用 (RPC), 这次范例是微服开发的雏形, 在以后你使用 springcloud 的时候会使用到今天的概念 1 使用 maven 创建新的模块 (microboot-sh Shiro 的环境搭建 一 公共模块的搭建 在实际的开发中, 一个项目可能会分多个模块进行实际的开发, 但是这些模块需要使用一些公 共的操作, 那么这些公共的操作不应该在每个模块中重新定义, 而是将这些公共的操作专门定 义在一个公共的模块之后哦在模块中的 pom 文件里面引入这个公共的模块, 比如说 vo 类就是 一个公共的模块, 所以定义到公共类中 1. 定义公共模块 (microboot-shiro-api)maven

More information

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

在Spring中使用Kafka:Producer篇

在Spring中使用Kafka:Producer篇 在某些情况下, 我们可能会在 Spring 中将一些 WEB 上的信息发送到 Kafka 中, 这时候我们就需要在 Spring 中编写 Producer 相关的代码了 ; 不过高兴的是,Spring 本身提供了操作 Kafka 的相关类库, 我们可以直接通过 xml 文件配置然后直接在后端的代码中使用 Kafka, 非常地方便 本文将介绍如果在 Spring 中将消息发送到 Kafka 在这之前,

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

IoC容器和Dependency Injection模式.doc

IoC容器和Dependency Injection模式.doc IoC Dependency Injection /Martin Fowler / Java Inversion of Control IoC Dependency Injection Service Locator Java J2EE open source J2EE J2EE web PicoContainer Spring Java Java OO.NET service component

More information

Microsoft Word - 朱晔和你聊Spring系列S1E6:容易犯错的Spring AOP.docx

Microsoft Word - 朱晔和你聊Spring系列S1E6:容易犯错的Spring AOP.docx 朱晔和你聊 Spring 系列 S1E6: 容易犯错的 Spring AOP 标题有点标题党了, 这里说的容易犯错不是 Spring AOP 的错, 是指使用的时候容易犯错 本文会以一些例子来展开讨论 AOP 的使用以及使用过程中容易出错的点 几句话说清楚 AOP 有关必要术语 : 1. 切面 :Aspect, 有的地方也叫做方面 切面 = 切点 + 增强, 表示我们在什么点切入蛋糕, 切入蛋糕后我们以什么方式来增强这个点

More information

Microsoft Word - 朱晔和你聊Spring系列S1E4:灵活但不算好用的SpringMVC.docx

Microsoft Word - 朱晔和你聊Spring系列S1E4:灵活但不算好用的SpringMVC.docx 朱晔和你聊 Spring 系列 S1E3: 灵活但不算好用的 Spring MVC 本文会以一些例子来展现 Spring MVC 的常见功能和一些扩展点, 然后我们来讨论一下 Spring MVC 好用不好用 使用 SpringBoot 快速开始 基于之前的 parent 模块, 我们来创建一个新的模块 :

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Java application Java main applet Web applet Runnable Thread CPU Thread 1 Thread 2 Thread 3 CUP Thread 1 Thread 2 Thread 3 ,,. (new) Thread (runnable) start( ) CPU (running) run ( ) blocked CPU sleep(

More information

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information

正文(新).indd

正文(新).indd 第 1 章 第一个 Spring Boot 项目 本章主要介绍学习 Spring Boot 之前的环境准备, 包括如何一分钟快速搭建 Spring Boot Spring Boot 文件目录的简单介绍以及 Maven Helper 插件的安装和使用等 1.1 Spring Boot 简单介绍 Spring Boot 是目前流行的微服务框架, 倡导 约定优先于配置, 其设计目的是用来简化新 Spring

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

使用Cassandra和Spark 2.0实现Rest API服务

使用Cassandra和Spark 2.0实现Rest API服务 使用 Cassandra 和 Spark 2.0 实现 Rest API 服务 在这篇文章中, 我将介绍如何在 Spark 中使用 Akkahttp 并结合 Cassandra 实现 REST 服务, 在这个系统中 Cassandra 用于数据的存储 我们已经见识到 Spark 的威力, 如果和 Cassandra 正确地结合可以实现更强大的系统 我们先创建一个 build.sbt 文件, 内容如下

More information

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

More information

Mac Java import com.apple.mrj.*;... public class MyFirstApp extends JFrame implements ActionListener, MRJAboutHandler, MRJQuitHandler {... public MyFirstApp() {... MRJApplicationUtils.registerAboutHandler(this);

More information

JavaIO.PDF

JavaIO.PDF O u t p u t S t ream j a v a. i o. O u t p u t S t r e a m w r i t e () f l u s h () c l o s e () public abstract void write(int b) throws IOException public void write(byte[] data) throws IOException

More information

MASQUERADE # iptables -t nat -A POSTROUTING -s / o eth0 -j # sysctl net.ipv4.ip_forward=1 # iptables -P FORWARD DROP #

MASQUERADE # iptables -t nat -A POSTROUTING -s / o eth0 -j # sysctl net.ipv4.ip_forward=1 # iptables -P FORWARD DROP # iptables 默认安全规则脚本 一 #nat 路由器 ( 一 ) 允许路由 # iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT ( 二 ) DNAT 与端口转发 1 启用 DNAT 转发 # iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 dprot 422 -j DNAT to-destination

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

《大话设计模式》第一章

《大话设计模式》第一章 第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 1.1 面 试 受 挫 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-065Big5 Title : Sun Certified Programmer for the Java 2 Platform, SE 6.0 Version : Demo 1 / 14 1. 35. String #name = "Jane Doe"; 36. int

More information

输入 project name 选择完成

输入 project name 选择完成 JAVA 程序访问 HighGo DB 的环境准备 山东瀚高科技有限公司版权所有仅允许不作任何修改的转载和转发 Hibernate 的配置 MyEclipse 中创建新项目 : 选择菜单栏 file---new---project 选择 web project 进行下一步 输入 project name 选择完成 4. 单击 " 添加 JAR/ 文件夹 ", 会如下图出现 JDBC 下载 Hibernate

More information

Hive:用Java代码通过JDBC连接Hiveserver

Hive:用Java代码通过JDBC连接Hiveserver Hive: 用 Java 代码通过 JDBC 连接 Hiveserver 我们可以通过 CLI Client Web UI 等 Hive 提供的用户接口来和 Hive 通信, 但这三种方式最常用的是 CLI;Client 是 Hive 的客户端, 用户连接至 Hive Server 在启动 Client 模式的时候, 需要指出 Hive Server 所在节点, 并且在该节点启动 Hive Server

More information

untitled

untitled 4.1AOP AOP Aspect-oriented programming AOP 來說 AOP 令 理 Cross-cutting concerns Aspect Weave 理 Spring AOP 來 AOP 念 4.1.1 理 AOP AOP 見 例 來 例 錄 Logging 錄 便 來 例 行 留 錄 import java.util.logging.*; public class HelloSpeaker

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6 www.brainysoft.net 1.JasperReport ireport...4 1.1 JasperReport...4 1.2 ireport...4 2....4 2.1 JDK...4 2.1.1 JDK...4 2.1.2 JDK...5 2.1.3 JDK...5 2.2 ant...6 2.2.1 ant...6 2.2.2 ant...6 2.3 JasperReport...7

More information

untitled

untitled . Version 1.0 2015 7 1. IT 1.. IBM IBM IBM WBI IBM WBI Jasdaq 3G 9 Java Hitachi Suntory Panansonic 2. IT . 10 Java Software AG (Dachieve) (Angel Engineers Inc.) 360,, Software AG XML,.,,,,.. CRM TOLO 3G

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 JAVA 程 序 设 计 ( 肆 ) 徐 东 / 数 学 系 使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 使 用 Java class 代 表 保 险 箱 public class SaveBox 类 名 类 类 体 实 现 封 装 性 使 用 class SaveBox 代 表 保

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

untitled

untitled Work Managers 什 Work Managers? WebLogic Server 9.x 行 (thread) 理 thread pool 數量 立 execute queues 來 量 理 thread count, thread priority 參數 理 thread pool 數量? WebLogic Server 9.x 理 行 (thread) (self-tuning) 句

More information

untitled

untitled -JAVA 1. Java IDC 20 20% 5 2005 42.5 JAVA IDC JAVA 60% 70% JAVA 3 5 10 JAVA JAVA JAVA J2EE J2SE J2ME 70% JAVA JAVA 20 1 51 2. JAVA SUN JAVA J2EE J2EE 3. 1. CSTP CSTP 2 51 2. 3. CSTP IT CSTP IT IT CSTP

More information

使用MapReduce读取XML文件

使用MapReduce读取XML文件 使用 MapReduce 读取 XML 文件 XML( 可扩展标记语言, 英语 :extensible Markup Language, 简称 : XML) 是一种标记语言, 也是行业标准数据交换交换格式, 它很适合在系统之间进行数据存储和交换 ( 话说 Hadoop H ive 等的配置文件就是 XML 格式的 ) 本文将介绍如何使用 MapReduce 来读取 XML 文件 但是 Had oop

More information

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat 本章学习目标 小风 Java 实战系列教程 AOP 思想概述 AOP 底层技术实现 AOP 术语介绍 SpringAOP 的 XML 方式 HelloWorld SpringAOP 的 XML 方式配置细节 SpringAOP 的注解方式 SpringAOP 的零配置方式 1. AOP 思想概述 1.1. AOP 思想简介 1.2. AOP 的作用 2. AOP 底层技术实现 小风 Java 实战系列教程

More information

國家圖書館典藏電子全文

國家圖書館典藏電子全文 EAI EAI Middleware EAI 3.1 EAI EAI Client/Server Internet,www,Jav a 3.1 EAI Message Brokers -Data Transformation Business Rule XML XML 37 3.1 XML XML XML EAI XML 1. XML XML Java Script VB Script Active

More information

Spark读取Hbase中的数据

Spark读取Hbase中的数据 Spark 读取 Hbase 中的数据 Spark 和 Flume-ng 整合, 可以参见本博客 : Spark 和 Flume-ng 整合 使用 Spark 读取 HBase 中的数据 如果想及时了解 Spark Hadoop 或者 Hbase 相关的文章, 欢迎关注微信公共帐号 :iteblog_hadoop 大家可能都知道很熟悉 Spark 的两种常见的数据读取方式 ( 存放到 RDD 中 ):(1)

More information

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌 语 言 程 序 设 计 郑 莉 胡 家 威 编 著 清 华 大 学 逸 夫 图 书 馆 北 京 内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌 握 语

More information

水晶分析师

水晶分析师 大数据时代的挑战 产品定位 体系架构 功能特点 大数据处理平台 行业大数据应用 IT 基础设施 数据源 Hadoop Yarn 终端 统一管理和监控中心(Deploy,Configure,monitor,Manage) Master Servers TRS CRYSTAL MPP Flat Files Applications&DBs ETL&DI Products 技术指标 1 TRS

More information

mvc

mvc Build an application Tutor : Michael Pan Application Source codes - - Frameworks Xib files - - Resources - ( ) info.plist - UIKit Framework UIApplication Event status bar, icon... delegation [UIApplication

More information

优迈科技教学大纲2009版本

优迈科技教学大纲2009版本 java 软 件 工 程 师 培 训 教 学 大 纲 1 JAVA 软 件 工 程 师 培 训 教 学 大 纲 深 圳 软 件 园 人 才 实 训 基 地 2009 年 3 月 目 录 java 软 件 工 程 师 培 训 教 学 大 纲 2 教 学 阶 段...3 第 一 章 JAVA 起 步...3 第 二 章 面 向 对 象 的 编 程...4 第 三 章 数 据 结 构 IO 线 程 网 络...5

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

untitled

untitled 1 行 行 行 行.NET 行 行 類 來 行 行 Thread 類 行 System.Threading 來 類 Thread 類 (1) public Thread(ThreadStart start ); Name 行 IsAlive 行 行狀 Start 行 行 Suspend 行 Resume 行 行 Thread 類 (2) Sleep 行 CurrentThread 行 ThreadStart

More information

<!-- import outer proper

<!-- import outer proper 概述 基于 Spring 支持的客户端编程, 包括发送方客户端 接收方客户端 发送方客户端代码 :jms-producer 接收方客户端代码 :jms-consumer 发送方客户端 这里基于 demo 进行说明 这个 demo 将往 example.queue 和 example.topic 各发一条信息 文件目录结构 1. src/main/resources/ 2. ---- jndi.properties

More information

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, http://debut.cis.nctu.edu.tw/~chi Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, : POSITIVE_INFINITY NEGATIVE_INFINITY

More information

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new ListView 自訂排版 主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new int[]{r.drawable.dog1, R.drawable.dog2,

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

提纲 1 2 OS Examples for 3

提纲 1 2 OS Examples for 3 第 4 章 Threads2( 线程 2) 中国科学技术大学计算机学院 October 28, 2009 提纲 1 2 OS Examples for 3 Outline 1 2 OS Examples for 3 Windows XP Threads I An Windows XP application runs as a seperate process, and each process may

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

新美大酒店开放平台SDK(.NET版)使用说明.pages

新美大酒店开放平台SDK(.NET版)使用说明.pages SDK(.NET 版 ) 使 用说明 1 SDK 包说明 1.1 获取 SDK SDK 可以在数据平台下载, 也可直接通过下载地址获得 下载地址 : http://s3.meituan.net/v1/mss_de81c933e113413ea913a772b707b9c9/open-platform-sdk/mthotelopenplatform-sdk-1.0-net.zip 下载成功后, 解压后可获得

More information

Java 1 Java String Date

Java 1 Java String Date JAVA SCJP Java 1 Java String Date 1Java 01 Java Java 1995 Java Java 21 Java Java 5 1-1 Java Java 1990 12 Patrick Naughton C++ C (Application Programming Interface API Library) Patrick Naughton NeXT Stealth

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

基于ECO的UML模型驱动的数据库应用开发1.doc

基于ECO的UML模型驱动的数据库应用开发1.doc ECO UML () Object RDBMS Mapping.Net Framework Java C# RAD DataSetOleDbConnection DataGrod RAD Client/Server RAD RAD DataReader["Spell"].ToString() AObj.XXX bug sql UML OR Mapping RAD Lazy load round trip

More information

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题 2009 年 3 月 全 国 计 算 机 等 级 考 试 笔 试 试 卷 二 级 Java 语 言 程 序 设 计 ( 考 试 时 间 90 分 钟, 满 分 100 分 ) 一 选 择 题 ( 每 题 2 分, 共 70 分 ) 下 列 各 题 A) B) C) D) 四 个 选 项 中, 只 有 一 个 选 项 是 正 确 的 请 将 正 确 选 项 填 涂 在 答 题 卡 相 应 位 置 上,

More information

FileMaker 16 ODBC 和 JDBC 指南

FileMaker 16 ODBC 和 JDBC 指南 FileMaker 16 ODBC JDBC 2004-2017 FileMaker, Inc. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc. FileMaker WebDirect FileMaker Cloud FileMaker,

More information

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO Linux muduo C++ (giantchen@gmail.com) 2012-09-30 C++ TCP C++ x86-64 Linux TCP one loop per thread Linux native muduo C++ IT 5 C++ muduo 2 C++ C++ Primer 4 W. Richard Stevens UNIX Sockets API echo Sockets

More information

Microsoft Word - Learn Objective-C.doc

Microsoft Word - Learn Objective-C.doc Learn Objective C http://cocoadevcentral.com/d/learn_objectivec/ Objective C Objective C Mac C Objective CC C Scott Stevenson [object method]; [object methodwithinput:input]; output = [object methodwithoutput];

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

untitled

untitled ArcGIS Server Web services Web services Application Web services Web Catalog ArcGIS Server Web services 6-2 Web services? Internet (SOAP) :, : Credit card authentication, shopping carts GIS:, locator services,

More information

Microsoft Word - Broker.doc

Microsoft Word - Broker.doc Broker 模式 采用 broker 模式对分布式计算进行简单模拟 系统在一个进程内模拟分布式环境, 因此不涉及网络编程和进程间通信,Broker 通过本地函数调用的方式实现 request 和 response 的转发 采用 broker 模式对分布式计算进行简单的模拟, 要求如下 : 设计四个 server, 一个 server 接收两个整数, 求和并返回结果, 一个 server 接收两个整数,

More information

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii 前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii C# 7 More Effective C# C# C# C# C# C# Common Language Runtime CLR just-in-time

More information

FileMaker 15 ODBC 和 JDBC 指南

FileMaker 15 ODBC 和 JDBC 指南 FileMaker 15 ODBC JDBC 2004-2016 FileMaker, Inc. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc. / FileMaker WebDirect FileMaker, Inc. FileMaker

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Fortran Algol Pascal Modula-2 BCPL C Simula SmallTalk C++ Ada Java C# C Fortran 5.1 message A B 5.2 1 class Vehicle subclass Car object mycar public class Vehicle extends Object{ public int WheelNum

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

Microsoft PowerPoint - ch6 [相容模式]

Microsoft PowerPoint - ch6 [相容模式] UiBinder wzyang@asia.edu.tw UiBinder Java GWT UiBinder XML UI i18n (widget) 1 2 UiBinder HelloWidget.ui.xml: UI HelloWidgetBinder HelloWidget.java XML UI Owner class ( Composite ) UI XML UiBinder: Owner

More information

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074> 程 序 设 计 实 习 INFO130048 3-2.C++ 面 向 对 象 程 序 设 计 重 载 继 承 多 态 和 聚 合 复 旦 大 学 计 算 机 科 学 与 工 程 系 彭 鑫 pengxin@fudan.edu.cn 内 容 摘 要 方 法 重 载 类 的 继 承 对 象 引 用 和 拷 贝 构 造 函 数 虚 函 数 和 多 态 性 类 的 聚 集 复 旦 大 学 计 算 机 科 学

More information

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 專題進度 老師 : 趙啟時老師 學生 : 陳建廷 2013/10/13 用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 程式碼 : package com.example.phone; import java.util.arraylist;

More information

D C 93 2

D C 93 2 D9223468 3C 93 2 Java Java -- Java UML Java API UML MVC Eclipse API JavadocUML Omendo PSPPersonal Software Programming [6] 56 8 2587 56% Java 1 epaper(2005 ) Java C C (function) C (reusability) eat(chess1,

More information

序号:001

序号:001 第 一 组 选 题 简 介 序 号 :001 题 目 : 基 于 BPEL 的 网 上 订 餐 系 统 的 设 计 与 实 现 网 上 订 餐 系 统 是 在 互 联 网 上 进 行 菜 单 信 息 发 布 网 上 订 餐 以 及 维 护 客 户 关 系 的 电 子 商 务 系 统, 餐 饮 企 业 可 以 通 过 这 个 电 子 商 务 系 统 发 布 自 己 的 菜 单 信 息 以 供 客 户

More information

目次 

目次  軟 體 工 程 期 末 報 告 網 路 麻 將 91703014 資 科 三 黃 偉 嘉 91703024 資 科 三 丘 祐 瑋 91703030 資 科 三 江 致 廣 1 目 次 壹 前 言 (Preface) P.4 貳 計 畫 簡 述 及 預 期 效 益 (Project Description and Expected Results) P.4 參 系 統 開 發 需 求 (System

More information

2 Java 语 言 程 序 设 计 教 程 1.2.1 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

2 Java 语 言 程 序 设 计 教 程 1.2.1 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难 第 1 章 Java 概 述 Java 的 诞 生 Java 的 特 点 Java 开 发 环 境 安 装 与 配 置 创 建 并 运 行 一 个 简 单 的 Java 程 序 Java 语 言 是 当 今 计 算 机 软 件 行 业 中 最 热 门 的 网 络 编 程 语 言, 以 Java 为 核 心 的 芯 片 技 术 编 译 技 术 数 据 库 连 接 技 术, 以 及 基 于 企 业 级

More information

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) 09 (File Processes) 9-1 9-2 (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) Java Servlet 9-1 Servlet (File Processes) Client Servlet Servlet Java Java (Stream)

More information

基于CDIO一体化理念的课程教学大纲设计

基于CDIO一体化理念的课程教学大纲设计 Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授

More information

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO CHAPTER 使用 Hadoop 打造自己的雲 8 8.3 測試 Hadoop 雲端系統 4 Nodes Hadoop Map Reduce Hadoop WordCount 4 Nodes Hadoop Map/Reduce $HADOOP_HOME /home/ hadoop/hadoop-0.20.2 wordcount echo $ mkdir wordcount $ cd wordcount

More information

(Microsoft Word - \272\364\263q\245|\244A_49636107_\304\254\253\330\336\263__\272\353\302\262\263\370\247i.doc)

(Microsoft Word - \272\364\263q\245|\244A_49636107_\304\254\253\330\336\263__\272\353\302\262\263\370\247i.doc) SCJP (Oracle Certified Professional, Java SE5/6 Programmer) 學 制 / 班 級 : 四 年 制 / 網 通 四 乙 指 導 老 師 : 方 信 普 老 師 學 生 學 號 / 姓 名 : 49636107 蘇 建 瑋 繳 交 年 份 : 100 年 6 月 一 SCJP 介 紹 SCJP 是 Sun Certified Java Programmer

More information

建模与图形思考

建模与图形思考 C03_c 基 於 軟 硬 整 合 觀 點 JNI: 从 C 调 用 Java 函 数 ( c) By 高 煥 堂 3 How-to: 基 於 軟 硬 整 合 觀 點 从 C 调 用 Java 函 数 如 果 控 制 点 摆 在 本 地 C 层, 就 会 常 常 1. 从 本 地 C 函 数 去 调 用 Java 函 数 ; 2. 从 本 地 C 函 数 去 存 取 Java 层 对 象 的 属 性

More information

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466> packages 3-31 PART 3-31 03-03 ASP.NET ASP.N MVC ASP.NET ASP.N MVC 4 ASP.NET ASP.NE MVC Entity Entity Framework Code First 2 TIPS Visual Studio 20NuGetEntity NuGetEntity Framework5.0 CHAPTER 03 59 3-3-1

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class - Table.class

More information

三种方法实现Hadoop(MapReduce)全局排序(1)

三种方法实现Hadoop(MapReduce)全局排序(1) 三种方法实现 Hadoop(MapReduce) 全局排序 () 三种方法实现 Hadoop(MapReduce) 全局排序 () 我们可能会有些需求要求 MapReduce 的输出全局有序, 这里说的有序是指 Key 全局有序 但是我们知道,MapReduce 默认只是保证同一个分区内的 Key 是有序的, 但是不保证全局有序 基于此, 本文提供三种方法来对 MapReduce 的输出进行全局排序

More information

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指 内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指 导 你 搭 建 Linux 平 台 下 的 JAVA 开 发 环 境, 包 括 JDK 以 及 集

More information

提问袁小兵:

提问袁小兵: C++ 面 试 试 题 汇 总 柯 贤 富 管 理 软 件 需 求 分 析 篇 1. STL 类 模 板 标 准 库 中 容 器 和 算 法 这 部 分 一 般 称 为 标 准 模 板 库 2. 为 什 么 定 义 虚 的 析 构 函 数? 避 免 内 存 问 题, 当 你 可 能 通 过 基 类 指 针 删 除 派 生 类 对 象 时 必 须 保 证 基 类 析 构 函 数 为 虚 函 数 3.

More information

BPS6.0 Web服务集成和短流程功能使用手册

BPS6.0 Web服务集成和短流程功能使用手册 PRIMETON TECHNOLOGIES, LTD. 上 海 普 元 信 息 技 术 有 限 责 任 公 司 BPS6.0 Web 服 务 集 成 和 短 流 程 使 用 手 册 2009-9-1 第 1 页 共 16 页 目 录 1 Web 服 务 集 成... 3 1.1 Web 服 务 简 述... 3 1.2 在 BPS 中 使 用 Web 服 务 功 能... 3 1.2.1 使 用 Web

More information

开放数据处理服务 ODPS 批量数据通道

开放数据处理服务 ODPS 批量数据通道 开放数据处理服务 ODPS 批量数据通道 批量数据通道 SDK 介绍 概要 ODPS Tunnel 是 ODPS 的数据通道, 用户可以通过 Tunnel 向 ODPS 中上传或者下载数据 目前 Tunnel 仅支持表 ( 不包括视图 View) 数据的上传下载 ODPS 提供的数据上传下载工具即是基于 Tunnel SDK 编写的 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk-core"

More information

1. 2. Flex Adobe 3.

1. 2. Flex Adobe 3. 1. 2. Flex Adobe 3. Flex Adobe Flex Flex Web Flex Flex Flex Adobe Flash Player 9 /rich Internet applications/ria Flex 1. 2. 3. 4. 5. 6. SWF Flash Player Flex 1. Flex framework Adobe Flex 2 framework RIA

More information

Apache CarbonData集群模式使用指南

Apache CarbonData集群模式使用指南 我们在 Apache CarbonData 快速入门编程指南 文章中介绍了如何快速使用 Apache CarbonData, 为了简单起见, 我们展示了如何在单机模式下使用 Apache CarbonData 但是生产环境下一般都是使用集群模式, 本文主要介绍如何在集群模式下使用 Apache CarbonData 启动 Spark shell 这里以 Spark shell 模式进行介绍,master

More information

Java ¿ª·¢ 2.0: Óà Hadoop MapReduce ½øÐдóÊý¾Ý·ÖÎö

Java ¿ª·¢ 2.0: Óà Hadoop MapReduce ½øÐдóÊý¾Ý·ÖÎö 中 文 登 录 ( 或 注 册 ) 技 术 主 题 软 件 下 载 社 区 技 术 讲 座 搜 索 developerworks developerworks 技 术 主 题 Java technology 文 档 库 Java 开 发 2.0: 用 Hadoop MapReduce 进 行 大 数 据 分 析 成 堆 的 数 据 如 何 变 成 信 息 金 矿 Andrew Glover, 作 家

More information

Android Android Android SDK iv

Android Android Android SDK iv Android Market Google Android SDK Apple Google Microsoft b2c b 2010 Internet Android how why iii Android 240... Android Android SDK iv Android Market Google Android SDK Visual C++ Java N-tier J2EE Unix/Linux

More information