/* * Copyright 2014 Red Hat, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.example.web.jdbc; import io.vertx.core.AbstractVerticle; import io.vertx.core.Handler; import io.vertx.core.http.HttpServerResponse; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.example.util.Runner; import io.vertx.ext.jdbc.JDBCClient; import io.vertx.ext.sql.SQLConnection; import io.vertx.ext.web.Router; import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.handler.BodyHandler; /** * @author <a href="mailto:pmlopes@gmail.com">Paulo Lopes</a> */ public class Server extends AbstractVerticle { // Convenience method so you can run it in your IDE public static void main(String[] args) { Runner.runExample(Server.class); } private JDBCClient client; @Override public void start() { Server that = this; // Create a JDBC client with a test database client = JDBCClient.createShared(vertx, new JsonObject() .put("url", "jdbc:hsqldb:mem:test?shutdown=true") .put("driver_class", "org.hsqldb.jdbcDriver")); setUpInitialData(ready -> { Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); // in order to minimize the nesting of call backs we can put the JDBC connection on the context for all routes // that match /products // this should really be encapsulated in a reusable JDBC handler that uses can just add to their app router.route("/products*").handler(routingContext -> client.getConnection(res -> { if (res.failed()) { routingContext.fail(res.cause()); } else { SQLConnection conn = res.result(); // save the connection on the context routingContext.put("conn", conn); // we need to return the connection back to the jdbc pool. In order to do that we need to close it, to keep // the remaining code readable one can add a headers end handler to close the connection. The reason to // choose the headers end is that if the close of the connection or say for example end of transaction // results in an error, it is still possible to return back to the client an error code and message. routingContext.addHeadersEndHandler(done -> conn.close(close -> { if (close.failed()) { done.fail(close.cause()); } else { done.complete(); } })); routingContext.next(); } })).failureHandler(routingContext -> { SQLConnection conn = routingContext.get("conn"); if (conn != null) { conn.close(v -> { }); } }); router.get("/products/:productID").handler(that::handleGetProduct); router.post("/products").handler(that::handleAddProduct); router.get("/products").handler(that::handleListProducts); vertx.createHttpServer().requestHandler(router::accept).listen(8080); }); } private void handleGetProduct(RoutingContext routingContext) { String productID = routingContext.request().getParam("productID"); HttpServerResponse response = routingContext.response(); if (productID == null) { sendError(400, response); } else { SQLConnection conn = routingContext.get("conn"); conn.queryWithParams("SELECT id, name, price, weight FROM products where id = ?", new JsonArray().add(Integer.parseInt(productID)), query -> { if (query.failed()) { sendError(500, response); } else { if (query.result().getNumRows() == 0) { sendError(404, response); } else { response.putHeader("content-type", "application/json").end(query.result().getRows().get(0).encode()); } } }); } } private void handleAddProduct(RoutingContext routingContext) { HttpServerResponse response = routingContext.response(); SQLConnection conn = routingContext.get("conn"); JsonObject product = routingContext.getBodyAsJson(); conn.updateWithParams("INSERT INTO products (name, price, weight) VALUES (?, ?, ?)", new JsonArray().add(product.getString("name")).add(product.getFloat("price")).add(product.getInteger("weight")), query -> { if (query.failed()) { sendError(500, response); } else { response.end(); } }); } private void handleListProducts(RoutingContext routingContext) { HttpServerResponse response = routingContext.response(); SQLConnection conn = routingContext.get("conn"); conn.query("SELECT id, name, price, weight FROM products", query -> { if (query.failed()) { sendError(500, response); } else { JsonArray arr = new JsonArray(); query.result().getRows().forEach(arr::add); routingContext.response().putHeader("content-type", "application/json").end(arr.encode()); } }); } private void sendError(int statusCode, HttpServerResponse response) { response.setStatusCode(statusCode).end(); } private void setUpInitialData(Handler<Void> done) { client.getConnection(res -> { if (res.failed()) { throw new RuntimeException(res.cause()); } final SQLConnection conn = res.result(); conn.execute("CREATE TABLE IF NOT EXISTS products(id INT IDENTITY, name VARCHAR(255), price FLOAT, weight INT)", ddl -> { if (ddl.failed()) { throw new RuntimeException(ddl.cause()); } conn.execute("INSERT INTO products (name, price, weight) VALUES ('Egg Whisk', 3.99, 150), ('Tea Cosy', 5.99, 100), ('Spatula', 1.00, 80)", fixtures -> { if (fixtures.failed()) { throw new RuntimeException(fixtures.cause()); } done.handle(null); }); }); }); } }
相关推荐
vertx-service-demo
解压后的`vertx-demo`目录应该包含了这些组成部分,展示了如何组织和构建一个Vert.x项目。 6. **依赖管理**: 使用Gradle或Maven等构建工具,我们可以管理项目所依赖的库,包括Vert.x核心、Web模块和H2数据库驱动。...
Vertx JDBC 执行器 JDBC Executor 为通过 Vertx 3.0 事件总线访问任何符合 JDBC 的数据源提供了一种快速有效的方法。 与 Executor 的所有交互都应该是原子的,并且尽可能“简短而甜蜜”,以尽量减少对共享(JDBC ...
【标题解析】 "vertx-cluster-demo"是一...通过深入学习和实践`vertx-cluster-demo`,开发者可以掌握如何在Java环境中使用Vert.x和Hazelcast构建高可用、可伸缩的分布式系统,这对于开发现代云应用具有极大的实际价值。
标签:vertx、core、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
标签:vertx、web、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
Java API 版本的Vert.x Core 手册, Java API 版本的Vert.x Core 手册, Java API 版本的Vert.x Core 手册, Java API 版本的Vert.x Core 手册, Java API 版本的Vert.x Core 手册
- 数据库集成可能通过Vertx的JDBC客户端进行,实现异步的数据库操作。 - 可能包含配置文件、测试用例、部署脚本等辅助资源。 4. **开发环境与工具**: - 开发者通常会使用Java 8或更高版本,因为Vert.x 3支持...
基于 t-io 实现的低延迟、高性能的 mqtt 物联网组件 ... MQTT 客户端 阿里云 mqtt 连接 demo。 支持 GraalVM 编译成本机可执行程序。 支持 Spring boot 项目快速接入 基于 redis pub/sub 实现集群。
标签:vertx、web、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。...
标签:vertx、core、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用...
【描述】:“自己写的一个java+vertx+mybatis的网关、服务分发,用于app后台接口开发的基本框架,仅供参考,请不要用于商业用途。” 这个描述表明作者创建了一个基于Java、Vert.x和MyBatis的框架,该框架主要用于...
- HikariCP:被誉为“最快的Java JDBC连接池”,以其高效和低延迟而闻名。 - Druid:阿里巴巴开源的数据库连接池,提供了监控和扩展功能,广泛应用于各种Java Web项目。 ### 3. 配置数据源连接池 以HikariCP为例,...
【标题】"vertx-mod-jersey-2.4.0-final.zip" 是一个基于 Vert.x 框架的 Jersey 模块的发布版本。Vert.x 是一个轻量级、高性能且反应式的 Java 开发平台,它允许开发人员构建分布式系统,而Jersey 则是 Java 世界中...
1. **非阻塞I/O**:Vertx采用反应式编程模型,利用Java NIO库实现非阻塞I/O操作,极大地提高了系统的并发能力。通过事件循环(Event Loop)处理并发请求,避免了线程池的创建和管理,降低了资源消耗。 2. **模块化...
标签:vertx、bridge、common、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...
标签:vertx、auth、common、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心...
【标题】"用vertx构建最小的wiki"的项目是一个基于Java编程语言,利用Vert.x框架来搭建的轻量级维基系统。Vert.x是一个高度可扩展的、反应式的应用平台,适合构建现代的、非阻塞式的服务。在这个项目中,开发环境...
JavaScript Vertx开发教程 在现代Web开发中,Vert.x是一个重要的工具,它是一个轻量级、反应式的事件驱动框架,专为构建分布式系统而设计。本教程将深入探讨如何使用JavaScript来利用Vert.x的强大功能,以创建高效...
本资源为 Vert.x应用开发实例教程(吕海东,张坤 著)全高清完整版pdf 。 《Vert.x应用开发实例教程》全面采用案例驱动,主要知识的讲解都辅助以实际案例应用编程,便于读者的理解和自主学习和运用。 知识讲解通俗...