java异步模型框架
**
概要
**
java的框架有很多种,开源的也有很多,经常用到的有struts.x、spring、hibernate、spring mvc、struts mvc等等。struts和spring应该是最常用了。异步的编程框架中vert.x应该是很牛逼的了。java一直以来性能方面一直有争议,希望vert.x能给我们java程序员带来福音。
Web框架排行榜 Netty、Servlet和Vert.x位列前三。据说比node.js还要快几倍的。csdn的数据地址:
http://www.csdn.net/article/2013-03-29/2814701-Web-Framework-Netty-Servlet-Vertx
开发环境部署:
1.下载vert.x的release的最新版本。地址:http://vertx.io/
2.设置vert.x的环境变量,在环境变量的path中加上vert.x的bin目录
3.如果需要源码编译请安装maven(maven安装就不介绍了网上资料一大堆)。maven下载地址https://maven.apache.org/
4.需要开发的IDE Eclipse,jdk1.7或者1.7以上(注意不支持1.7以下的版本,jdk请到oracle的官方网站下载)
5.maven设置依赖jar包
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>${vertx.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-platform</artifactId>
<version>${vertx.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
6.eclipse部署debug开发环境:
设置mainclass为org.vertx.java.platform.impl.cli.Starter
设置artuments为run com.cg.entrance.StartServer -cp ${project_loc:sandbox-release}/target/classes(编译目录)
然后设置Other为vert.x的安装目录
然后在User Entries添加vert.x的conf目录
最后在Source中添加自己的项目
好了eclipse的debug模式就成功了。
代码测试。
vert.x用到Netty的一些核心,所以效率上也是杠杠的,vert.x来说可以启动http协议的服务,也就是HttpServer服务,也可以提供TCP/IP的服务也就是SocketServer.
HttpServer例子
WebServer.java
package com.cg.entrance;
import org.vertx.java.core.http.RouteMatcher;
import org.vertx.java.platform.Verticle;
import com.cg.core.init.InitMatcher;
import com.cg.handler.BusinessHandler;
/**
* 功能:总入口 ,处理各种请求
*/
public class WebServer extends Verticle {
// 监听的端口号
private static final int port = 8080;
private static final RouteMatcher matcher = new RouteMatcher();
static {
InitMatcher.init(matcher);
}
public void start() {
//匹配/business的请求
matcher.get("/business", new BussinessHandler());
vertx.createHttpServer().requestHandler(matcher).listen(port);
container.logger().info("web服务启动,监听端口: " + port);
}
}
BussinessHandler.java
package com.cg.handler;
import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpServerRequest;
/**
* 功能描述:BussinessHandler
* @version 2.0.0
*/
public class BussinessHandler implements Handler<HttpServerRequest> {
@Override
public void handle(HttpServerRequest request) {
/**
* 需要对request和response的操作
*/
request.response().end("User: " + request.params().get("user"));
}
}
接下来贴上SocketServer的代码
vert.x在SocKet的服务中,也可以基于消息的开发(pub和sub)
SocKetServer.java
package com.cg.entrance;
import org.vertx.java.core.Handler;
import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.eventbus.EventBus;
import org.vertx.java.core.net.NetServer;
import org.vertx.java.core.net.NetSocket;
import org.vertx.java.platform.Verticle;
import com.cg.IConstants;
import com.cg.verticle.PubVerticle;
/**
* 功能描述:socket 接受数据并发送给订阅者 异步模型编程
* @version 2.0.0
*/
public class SocketServer extends Verticle implements IConstants {
public void start() {
container.deployVerticle(PubVerticle.class.getName());
NetServer server = vertx.createNetServer();
Handler<NetSocket> handler = new Handler<NetSocket>() {
public void handle(final NetSocket sock) {
sock.dataHandler(new Handler<Buffer>() {
//buffer就是socket接受的数据
public void handle(final Buffer buffer) {
//eventbus是重要的组件
EventBus eb = vertx.eventBus();
//ecentbus把socket的数据传给订阅者来处理
eb.publish(PubVerticle.class.getName(), buffer);
}
});
}
};
server.connectHandler(handler).listen(SOCKETPORT, HOST);
}
}
PubVerticle.java
package com.cg.verticle;
import org.vertx.java.core.Handler;
import org.vertx.java.core.eventbus.EventBus;
import org.vertx.java.core.eventbus.Message;
import org.vertx.java.core.json.JsonObject;
import org.vertx.java.core.logging.Logger;
import org.vertx.java.platform.Verticle;
/**
* 功能描述:订阅者Verticle
* @version 2.0.0
*/
public class PubVerticle extends Verticle {
@Override
public void start() {
EventBus eb = vertx.eventBus();
Handler<Message<JsonObject>> handler = new Handler<Message<JsonObject>>() {
@Override
public void handle(Message<JsonObject> message) {
Logger logger = container.logger();
logger.info(message.body());
}
};
eb.registerHandler(PubVerticle.class.getName(), handler);
}
}
完毕。