Vert.x异步方法转同步

以前用Vert.x的时候就有这样的疑问,如果我提供的方法是基于Vert.x异步实现的。如何被一个同步的应用调用呢,比如Spring。当时我一度以为要自己开一个线程,然后不断轮询结果,之后再返回,通过这样,把一个异步的方法,包装成同步的方法。
后来在使用vertx-pac4j的时候,无意中看到它源码中,也有我上面说的场景使用。就在org.pac4j.vertx.context.session.VertxSessionStore类的这一段:

@Override
public Session getSession(String sessionId) {
final CompletableFuture<io.vertx.ext.web.Session> vertxSessionFuture = new CompletableFuture<>();
sessionStore.get(sessionId, asyncResult -> {
if (asyncResult.succeeded()) {
vertxSessionFuture.complete(asyncResult.result());
} else {
vertxSessionFuture.completeExceptionally(asyncResult.cause());
}
});
final CompletableFuture<Session> pac4jSessionFuture = vertxSessionFuture.thenApply(session -> {
if (session != null) {
return new VertxSession(session);
} else {
return null;
}
});
try {
return pac4jSessionFuture.get();
} catch (InterruptedException|ExecutionException e) {
throw new TechnicalException(e);
}
}

阅读全文

如何在cas登录成功页面显示用户名

CAS这种本来业务场景就很细分,再加上其上古时代存续至今的特质。估计还在用它的公司已经不多了。间接导致,其中文资料比较匮乏。
领导说,想再cas成功后的欢迎页,也就是casGenericSuccess.jsp页面,可以显示欢迎:xxx的字样。
不得不说,这个需求非常常规。然而不仅cas默认没有实现,甚至翻遍google,都很难找到满意的答案。比较有参考价值的可能就是google groups上的这篇。居然要借助额外的jar包(还是个已停止维护的)才能实现。不得已,只能自己想办法。
现在给出我的思路:

阅读全文

CentOS系统使用Shadowsocks搭建代理服务

  1. 确认pip是否安装,命令pip help,返回如图信息,说明已安装

    如果返回下图,说明未安装

    未安装需要执行以下子步骤:

    阅读全文

    用Gradle自动发布程序至Linux服务器

    你的重复劳动,一定能找“人”帮你做,聪明的程序员一定是拒绝重复的。由于公司条件限制,暂时用不上jenkins,先拿gradle救救急也是不错的。今天要实现的是,通过gradle发布静态站点到服务器。这样可以和上回的用Gradle打包Vue前端程序保持一定的连贯性。当然本帖拿来发布war包也是ok的。

    阅读全文

    用Gradle打包Vue前端程序

    我这边打包和发布程序,属于重度依赖Gradle的状态。所以纵容前端程序游离在这个体系外,不利于团队的整体协作。于是有了这篇文章。
    其实很简单,首先我们需要一个以Gradle为基石的项目,把前后端项目组织成这样

    myproject
    ├── build.gradle
    ├── frontend
    │   ├── build
    │   ├── index.html
    │   ├── node_modules
    │   ├── package.json
    │   └── src
    ├── javaweb
    │   ├── build
    │   ├── build.gradle
    │   ├── out
    │   └── src
    └── settings.gradle

    阅读全文

    linux挂载新磁盘(适用阿里云、华为云)

    公司项目用的是华为的云服务器,刚申请了新的硬盘资源,需要手动分区挂载。虽然华为没给啥资料,但是不是还有阿里云嘛。所以结合阿里云的资料。我们就可以在华为云实操一把了。附里云资料地址Linux 格式化和挂载数据盘

    阅读全文

    用了docker之后性能损耗多少?

    Docker的一大优势,就是拥有微乎其微的性能损耗,换来良好的硬件资源隔离效果。虽然各大厂商都在主要业务领域使用了Docker,已经从侧面表明Docker的性能损耗不是个什么问题。但是较真的同学,肯定还是想知道Docker到底有没有损耗呢,损耗多少。
    这里我用PostgreSQL数据库做个简单的对比测试。分别在同一台服务器的Docker内外个各装一个10.3版本的PostgreSQL。然后执行同一个SQL。SQL如下:

    with cte as ( select *
    FROM
    (
    VALUES (uuid_generate_v4(), 'xiaoming',10, '语文'),
    (uuid_generate_v4(), 'xiaohong',12, '数学'),
    (uuid_generate_v4(), 'xiaoli',11, '英语'),
    (uuid_generate_v4(), 'xiaozhi',11, '英语'),
    (uuid_generate_v4(), 'xiaoxin',11, '英语')
    )
    AS tmp (id, name,age, fav))

    select array_to_json(array_agg(row_to_json(cte)))
    from cte;

    阅读全文

    用JMH做简单的JVM性能测试

    写java也有年头了,有时候遇到对比某几种方法性能的情景,都是自己傻傻的打印new Date()计算时间差。现在想来,这种原始的方式,就跟不会用IDE Debug,只会System.out.println()打印调试没什么区别。
    这次被人安利JMH,说来惭愧,是我在Twitter上质疑Vert.x采用了效率不高的Json序列化库,影响了其在techempower的成绩。结果@julienviet神回复我说”you should make a JMH microbenchmark to find out”,所以才有了这篇,利用JMH做Json序列化速度对比的文章。
    这是测试结果:
    -w783
    可以看到Vert.x的Json序列化速度还是出类拔萃的,当然,其本质还是实用的jackson
    上代码:

    package com.aruistar.benchmark;

    import com.aruistar.benchmark.model.User;
    import com.jsoniter.output.JsonStream;
    import groovy.json.JsonBuilder;
    import groovy.json.JsonOutput;
    import org.openjdk.jmh.annotations.Benchmark;
    import org.openjdk.jmh.runner.Runner;
    import org.openjdk.jmh.runner.RunnerException;
    import org.openjdk.jmh.runner.options.Options;
    import org.openjdk.jmh.runner.options.OptionsBuilder;


    public class JsonToStringBenchmark {

    public static void main(String[] args) throws RunnerException {

    Options opt = new OptionsBuilder()
    .include(JsonToStringBenchmark.class.getSimpleName())
    .forks(1)
    .warmupIterations(2)
    .measurementIterations(3)
    .build();

    new Runner(opt).run();
    }


    // @Benchmark
    public void testJsonObjectToBuffer() {
    new User("Hello, World!", "tomcat", 10, "angular", true).toBuffer();
    }

    @Benchmark
    public void testJsonObjectToString() {
    new User("Hello, World!", "tomcat", 10, "angular", true).toString();
    }


    @Benchmark
    public void testJsonBuilder() {
    new JsonBuilder(new User("Hello, World!", "tomcat", 10, "angular", true).getMap()).toString();
    }

    @Benchmark
    public void testJsonOutput() {
    JsonOutput.toJson(new User("Hello, World!", "tomcat", 10, "angular", true).getMap());
    }

    @Benchmark
    public void testJsoniter() {
    JsonStream.serialize(new User("Hello, World!", "tomcat", 10, "angular", true).getMap());
    }


    }

    阅读全文

    PostgreSQL数组类型数据一条sql实现翻译

    PostgreSQL的ARRAY类型是个非常实用的类型。以往在设计“多选”这种业务场景的时候,要么需要设计子表,要么弄个varchar字段,存放1,3,5这种逗号隔开的数据。现在有了原生支持的ARRAY类型,终于可以大胆的把多选的数据id放在这个字段里了。
    接踵而至的问题是,如何一次性实现数组字段的数据翻译呢。比如实际数据是{1,3,5},关联查询后,希望看到{红,黄,蓝}
    话不多说,直接上sql

    select distinct app_message.id,app_message.ids_at_auth_user__to,
    array_agg(auth_user.v_username) over (partition by app_message.id) as av_username_at_auth_user
    from app_message
    join auth_user on auth_user.id = ANY (ids_at_auth_user__to)

    阅读全文