JFinal-event 3.0.0 发布,类扫描提到编译期提升十倍的启动速度

前言

距 gitee issues #IR96V 6个月,终于把【3.0优化】有生之年闲下来了弄吧的第二点优化进行了完善,鼓掌!!!

更新记录

2019-07-19 v3.0.0

  • 升级到jfinal 4.3。

  • 完成【3.0优化 有生之年闲下来了弄吧】#IR96V 之2 将类扫描,改到编译期。

  • 删除 ClassUtil,但愿大伙没用这个类。

更新说明

此次更新主要是采用 Annotation Processor 技术,将运行期的事件类扫描改到了编译期,加快服务的启动时间,减少各种容器差异导致的类扫描问题。

使用

maven

<dependency>
    <groupId>net.dreamlu</groupId>
    <artifactId>JFinal-event</artifactId>
    <version>3.0.0</version>
</dependency>

gradle >= 5.x

api("net.dreamlu:JFinal-event:3.0.0")
annotationProcessor("net.dreamlu:JFinal-event:3.0.0")

gradle < 5.x

compile("net.dreamlu:JFinal-event:3.0.0")

注意

  1. 3.0.0 由于使用了 Annotation Processor 技术,Idea 需要开启注解处理器。

  2. 对于手动导入 jar(非 maven、gradle)依赖管理的,您需要手动注入事件类或者在 classes 目录下新建 META-INF/dream.events 文件,格式如下:

net.dreamlu.event.test.Test1Listener
net.dreamlu.event.test.Test2Listener

启动插件(v3.0.0 去掉了类扫描跟加简单)

// 初始化插件
EventPlugin plugin = new EventPlugin();
// 设置为异步,默认同步,或者使用`threadPool(ExecutorService executorService)`自定义线程池。
plugin.async();
// 手动启动插件,用于main方法启动,jfinal中不需要,添加插件即可。
plugin.start();
// 停止插件,用于main方法测试,jfinal中不需要,添加插件即可。
plugin.stop();

新建事件类

public class AccountEvent {  
    private Integer id;  
    private String name;  
    private Integer age;  
    // 省略 get set
}

编写监听方法

public class Test1Listener { 
 
  @EventListener
  public void listenTest1Event(AccountEvent event) {      
      System.out.println("AccountEvent:" + event);
  }

}

发送事件

AccountEvent event = new AccountEvent();
event.setId(1);
event.setName("张三");
event.setAge(18);
EventKit.post(event);

回顾

或许这是最后的一个版本了,由于精力问题,笔者已经停止更新其他的几个 JFinal 插件,下面随我一起回顾下 JFinal-event 的这4年多。

  1. 2015-04-27 22:19:33 初始化项目 网名(孤独的√3)

  2. 2015-05-06 23:40:53 v0.1 版本发布推送到 maven 中央库

  3. 2015-06-25 21:01:13 v0.3 支持异步,去掉了 guava 包,因为只用了一个 Multimap 集合。

  4. 2015-07-04 17:43:23 v0.4.2 添加事件排序

  5. 2016-08-19 10:46:58 v1.4.0 添加事件 tag

  6. 2017-04-22 00:10:41 v1.5.1 添加了基于 rmi 的远程 Event(2.x弃用)

  7. 2017-10-10 11:23:34 v2.0.0 基于注解和方法的兼听,不再需要单独编写 Listener 类。

  8. 2018-03-02 17:05:33 v2.1.0 添加CtrlHolderEvent处理同步、异步中request、session、header等参数传递。网名(如梦技术)

  9. 2018-10-09 21:37:18 v2.2.2 升级到 jfinal 3.5 支持JFinal新版本的 bean inject。

  10. 2019-04-08 20:55:52 v2.3.0 支持普通类作为 event 事件源,不再需要继承 ApplicationEvent

感谢码云提供了这么好的一个平台作为码云提供了这么一个优秀的平台,也感谢 JFinal 从 JFinal 中学习到了不少极简设计。

最后

笔者近2年将更多的精力放到的我的新开源——Spring Cloud 微服务开发核心包

 mica:https://gitee.com/596392912/mica 欢迎 star ,各种骚操作等你来发现。

评论区

prelove

2019-07-20 09:59

2.3.0直接上到了3.0.0了,NB

Dreamlu

2019-07-20 10:04

@prelove 因为有技术变革,本来2.3.0 也是 3.0 的计划,拆分了2步^_^

prelove

2019-07-20 10:15

2019-7月-20 10:14:40 WARN net.dreamlu.event.EventPlugin.create(EventPlugin.java:122) - @EventListener is empty! Please check it!
2019-7月-20 10:14:40 WARN net.dreamlu.event.EventPlugin.create(EventPlugin.java:132) - EventListener List is empty! Please check @EventListener is right?

Dreamlu

2019-07-20 11:33

@prelove 1. 看看idea 里面是否开启注解处理器,2. maven package 的时候看看 编译的 target/classes/META-INF/dream.events 文件有没有生成

Dreamlu

2019-07-20 11:46

如果不是采用 maven、gradle 作为包管理建议还是使用 2.3.0,要不然要手写配置。

l745230

2019-07-20 12:04

春哥牛逼~~~手动撒花~~~

要输就输给追求

2019-07-20 12:38

阿里云的maven库还下载不下来,能下载了再更新

lyh061619

2019-07-20 16:36

很实用的插件,顶个

JFinal

2019-07-21 17:00

春梦大神很早就参与到了 jfinal 生态,为 jfinal 做出了很大贡献

尤其是对 jfinal weixin 项目的贡献十分巨大,因此 jfinal weixin 上一次被评为开源中国最受欢迎开源项目奖的时候,我建议 oschina 将评选归于 @卢春梦 , 并将所有奖品寄送到了春梦那里

jfinal event 简洁、方便,完全符合 jfinal 极简设计思维。春梦大神这些年对 jfinal 社区的贡献不会白费,起码收获了 jfinal 极简设计思维,这个思维将会无时不刻影响着后续的设计、开发,不断创造出价值

JFinal

2019-07-21 17:01

jfinal event 这次类扫描提到编译期提升十倍的启动速度,用到了什么黑科技,能否一并分享一下

Dreamlu

2019-07-22 09:05

@JFinal Annotation Processor,maven,gradle 编译的时候会执行,把所以的事件类找到然后写到了 dream.events 文件打入jar包,运行期间读这个文件就好。

JFinal

2019-07-22 09:23

@Dreamlu 思路独特、巧妙,将代码提前写好,等待打包后生成的文件,从未见过在编译有人这么用过,赞

要输就输给追求

2019-07-22 11:42

@prelove 你解决这个问题了吗?我也有这个问题

Dreamlu

2019-07-22 13:00

@要输就输给追求 1. 看看idea 里面是否开启注解处理器,2. maven package 的时候看看 编译的 target/classes/META-INF/dream.events 文件有没有生成

要输就输给追求

2019-07-22 13:52

@Dreamlu 谢谢大佬,我已经知道怎么解决了。我直接删除了target目录,然后运行mvn test就可以了。只是我个人觉得在class目录创建一个配置文件比编译的时候生成一个dream.events更方便

prelove

2019-07-22 15:12

@要输就输给追求 没有解决。回退至2.3.0了。 用maven打包出来运行没问题,开发环境undertow运行时有问题。2019-7月-22 15:08:54 ERROR net.dreamlu.event.EventKit.getListener(EventKit.java:42) - EventListener is empty!

prelove

2019-07-22 15:13

@Dreamlu @prelove 1.用的myeclipse 2.maven打包出来跑是没问题的,但开发时在ide运行undertow的情况下报以下错误:2019-7月-22 15:08:54 ERROR net.dreamlu.event.EventKit.getListener(EventKit.java:42) - EventListener is empty!

要输就输给追求

2019-07-22 15:43

@prelove 额,我也退回2.3算了。这个问题开发的时候确实不方便

lyh061619

2019-07-22 16:19

@要输就输给追求 @prelove 这个问题其实就是配置不对,主要是开启编译,你参考下JFinal官方文档的:https://www.jfinal.com/doc/3-3 配置即可。注意:配置完把target文件删除并重新生成下项目代码。

prelove

2019-07-22 16:37

@lyh061619 忘记这碴了,ok了,谢谢指教

要输就输给追求

2019-07-22 17:21

@lyh061619 改完了还是一样,没有生成dream.events 。target目录也删了好多次。

lyh061619

2019-07-22 17:47

@要输就输给追求 仔细检查下,这个肯定是某个步骤出错了。我记得undertow有一个地方可能过虑排除掉dream.events的也就是不能与热重载。

Dreamlu

2019-07-22 21:40

maven demo 中 package.xml 加入

<fileSet>
<directory>${basedir}/target/classes/META-INF/</directory>
<outputDirectory>webapp/META-INF/</outputDirectory>
</fileSet>

则可以生成到 jfinal_demo_for_maven-release.zip 中,这次升级比较激进。

开发时可以 maven package 之后将 target/classes/META-INF/dream.events copy 到 webapp/META-INF

要输就输给追求

2019-07-22 21:55

@lyh061619 那就不知道了。我现在是在插件启动的时候判断了一下,如果是开发者模式,我就自己扫描类,自己一个一个的注册进去

Dreamlu

2019-07-22 22:00

@要输就输给追求 @prelove @lyh061619 我周末再发个版本,本地开发用类扫描,

正好我想让 EventKit.post(event); 支持多参数,这样就支持
EventKit.post(event, Crud.C);
EventKit.post(event, Crud.U);
EventKit.post(event, Crud.D);
这种。