@TransactionalEventListener的使用

一、使用

1.1 创建EventObject(事件状态对象)

用于 listener 的相应的方法之中,作为参数,一般存在于listerner 的方法之中
创建一个类,继承 org.springframework.context.ApplicationEvent
例如:创建一个项目初始化的事件对象

package cn.xxx.xxxx.service.event;

import org.springframework.context.ApplicationEvent;
public class ProjectInitEvent extends ApplicationEvent {
    /**
    * x项目编码
    */
    private String projectCode;

    public ProjectInitEvent(String projectCode,Object source) {
        super(source);
        this.projectCode = projectCode;
    }

    public String getProjectCode() {
        return projectCode;
    }

    public void setProjectCode(String projectCode) {
        this.projectCode = projectCode;
    }
}

1.2 使用@TransactionalEventListener处理监听到的事件

例如:当把所有的事务事件的监听都放在一起处理,可以创建一个TransactionalListener.class类

package cn.xxx.xxxx.service.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionalEventListener;
import cn.xxx.xxxx.service.ProjectService;

@Component
@Slf4j
public class TransactionalListener {

	@Autowired
    private ProjectService projectService;

    @TransactionalEventListener
    public void projectInit(ProjectInitEvent event) throws GcpPlatformException {
        //处理对应的事件逻辑,比如这里是 项目初始化的监听,处理项目初始化的逻辑即可
        projectService.init(event.getProjectCode());
    }
}

1.3 在对应的业务逻辑中发送事件

在一个事物的方法中,使用ApplicationEventPublisher的publishEvent方法,即可发送事件对象
例如:

...
import org.springframework.context.ApplicationEventPublisher;
import cn.xxx.xxxx.service.event.ProjectInitEvent;
import org.springframework.transaction.annotation.Transactional;

....

//某个事物方法
@Transactional(rollbackFor = Exception.class)
public void initProject(XXXX req){
	...
	String projectCode =  ...
	....
	//发送事件
	publisher.publishEvent(new ProjectInitEvent(projectCode, this));
	...
}

你可能感兴趣的:(java,spring,开发语言)