Jfinal-Event使用疑问

今天测试一下event。

目的:在Controller中执行一段代码同时返回页面,场景类似于注册用户成功后去后台给用户生成初始的用户信息。做到在页面渲染和后台的代码异步进行,而不是所有后台代码按照代码顺序执行完才渲染页面。

测试代码:

前置操作:

image.png

image.png


新建Event:

public class testEvent {
	private Integer id;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

}

新增监听类

import net.dreamlu.event.core.EventListener;

public class testEventListener {
	@EventListener
	public void listentTestEvent(testEvent te) {
		for (int i=0; i<te.getId();i++) {
			System.out.println("listentTestEvent打印i:" + i );
		}
		
	}

在Controller中发送事件

		testEvent te = new testEvent(); 
		te.setId(10);
		EventKit.post(te);
		for (int j=0; j<te.getId();j++) {
			System.out.println("Controller打印j:" + j  +"Controller打印");
		}
		
		render("test.html");

测试结果:

image.png

问题:所有的代码似乎依次执行了,并没有异步,尝试用sleep延迟listentTestEvent,结果Controller中的代码并没有执行,render也没有执行,页面在等待响应。。

是我理解或者是用法不对吗?

评论区

JFinal

2020-11-20 14:03

这个项目我还没有用过,是 @卢春梦 大神的作品, 去他的群里面问问

此外,建议单步调试一下源码,源码很少,一会就弄明白了

lyh061619

2020-11-20 23:46

插件这个位置new EventPlugin().async()要配合@EventListener(async = true)开启异步。

Dreamlu

2020-11-21 15:21

@lorre 确实是需要@EventListener(async = true)上也开启,另外还可以自定义线程池,目前默认的是一个 Executors.newSingleThreadExecutor(new EventThreadFactory()); 一个单线程的线程池。listentTestEvent打印i:也会是顺序的。你可以把线程名打出来。

Dreamlu

2020-11-21 15:23

当然@EventListener(async = true)上开启了,跟你控制器的线程就不是一个了

lorre

2020-11-21 19:10

@Dreamlu @lyh061619问题顺利解决,非常感谢。