---
url: https://www.dreamlu.net/blog/2018-10-09-Jfinal-event-driver-plug-in.md
description: >-
  借鉴 Spring 的事件驱动模型，为 JFinal 打造轻量事件插件 JFinal-event，支持同步/异步、tag 分组、IOC 与 RMI
  远程事件。
---

## 简介

模仿的Spring中的消息事件：[详解Spring事件驱动模](http://jinnianshilongnian.iteye.com/blog/1902886)

源码连接：<http://git.oschina.net/596392912/JFinal-event>

手册WIKI地址：<http://git.oschina.net/596392912/JFinal-event/wikis/home>

## 使用

代码简单无任何第三方依赖，具体使用如下：

```java
// 初始化插件
EventPlugin plugin = new EventPlugin();
// 开启异步，默认同步。或者使用`threadPool(ExecutorService executorService)`自定义线程池。
plugin.async();

// 设置扫描jar包，默认不扫描
plugin.scanJar();
// 设置监听器默认包，默认全扫描
plugin.scanPackage("net.dreamlu");

// 启动插件,用于main方法启动，jfinal中不需要，添加插件即可。
plugin.start();

// 发送第一个消息
EventKit.post(new Test1Event("hello1"));
// 发送带tag的消息
EventKit.post("save", new Test2Event(123123));

Thread.sleep(1000);

// 停止插件,用于main方法测试。
plugin.stop();
```

### 注意：异步需要2个条件

```java
// 1. 开启异步plugin.async();
// 2. @Listener(order = 1, enableAsync = true, tag="save")注解中，enableAsync = true开启异步。
```

### 发送远程事件

```java
// 服务端：
plugin.setRmiServer(int port);

//客户端：
plugin.setRmiClient(String host, int port);

//发送消息：
EventKit.postRemote(final ApplicationEvent event);
// 或者
EventKit.postRemote(final String tag, final ApplicationEvent event);
// 建议：将服务端和客户端通用的event类文件打成maven模块。
```

## jar包下载：

<http://central.maven.org/maven2/net/dreamlu/JFinal-event/>

```xml
<dependency>
    <groupId>net.dreamlu</groupId>
    <artifactId>JFinal-event</artifactId>
    <version>1.5.1</version>
</dependency>
```

## 更新说明：

> ### 2018-10-09 v2.2.2
>
> 升级到jfinal 3.5 (不兼容老版本)支持新版本inject，升级到java 8优化部分代码。
> DefaultBeanFactory改为jfinal 3.5 aop 创建，删除 DuangBeanFactory。
> 优化 ObjenesisBeanFactory 支持jfinal 3.5 inject

> ### 2018-08-14 v2.2.1
>
> ApplicationEvent 添加泛型，方便类型转换。

> ### 2018-04-15 v2.2.0
>
> 插件添加手动注册监听类 `plugin.register(Class<?> clazz)`, 多个类，多次调用`register`方法即可。

> ### 2018-03-02 v2.1.0
>
> 添加`CtrlHolderEvent`处理同步、异步中request、session、attr、header参数传递。
> 使用：
> 需先在Config中添加`me.add(new CtrlHolderInterceptor());`拦截器。
> 然后继承`CtrlHolderEvent`编写自己的事件类

```java
CtrlHolder holder = event.getCtrlHolder();
holder.getPara("p");
holder.getAttr("x");
holder.getHeader("x");
holder.getSessionAttr("x");
```

> ### 2017-11-29 v2.0.4
>
> 添加`ObjenesisBeanFactory`处理不含有默认构造器的Bean
> 依赖`objenesis`jar包，下载地址：http://mvnrepository.com/artifact/org.objenesis/objenesis/2.6

> ### 2017-10-11 v2.0.3
>
> 用户反馈的问题 #IFX3Z
> 支持多包名，用`;`分割，如：`net.dreamlu.a;net.dreamlu.b`。
> 插件初始化时，没有扫描到监听时依然初始化成功。

> ### 2017-10-11 v2.0.2
>
> 2.x bug修复版

> ### 2017-10-11 v2.0.1
>
> 插件添加Bean工厂，方便IOC容器和自定义扩展。
> 默认为`DefaultBeanFactory`，可实现IBeanFactory自定义扩展。
> `plugin.beanFactory(new DuangBeanFactory());`

> ### 2017-10-10 v2.0.0
>
> 基于注解和方法的兼听，简化使用，不兼容1.x
> 支持JFinal 3.1和3.1以上版本

> ### 2017-04-28 `v1.5.1`
>
> 基于rmi的远程Event

> ### 2017-03-22 `v1.4.2`

> 更改默认线程池为SingleThreadExecutor，使异步执行有序化。

> 添加EventThreadFactory，处理异步时的异常避免影响服务请求。

> 建议：如果event需要发送大量的异步事件，建议使用自定义线程池。

> 如：eventPlugin.threadPool(Executors.newCachedThreadPool(new EventThreadFactory()));

> ### 2017-02-15 `v1.4.1`
>
> 添加自定义线程池EventPlugin.threadPool(ExecutorService executorService)方法

> ### 2016-08-19 `v1.4.0`
>
> 升级到JFinal2.2，JFinal低版本用户请使用v1.2.0。

> EventKit.postEvent(event)更改为EventKit.post(event)，postEvent不再建议使用。

> 添加EventKit.post(tag, event)方法，@Listener(order = 2, tag = "save")添加tag

## 开源推荐

* Spring boot 微服务高效开发 `mica` 工具集：<https://gitee.com/596392912/mica>
* `Avue` 一款基于vue可配置化的神奇框架：<https://gitee.com/smallweigit/avue>
* `pig` 宇宙最强微服务（架构师必备）：<https://gitee.com/log4j/pig>
* `SpringBlade` 完整的线上解决方案（企业开发必备）：<https://gitee.com/smallc/SpringBlade>
* `IJPay` 支付SDK让支付触手可及：<https://gitee.com/javen205/IJPay>
* 加入【如梦技术】Spring QQ群：479710041，了解更多。

## 微信公众号

![如梦技术](/img/dreamlu-weixin.jpg)

精彩内容每日推荐！！！
