1. 介绍

业务事件允许你进行一些逻辑处理,在一个对象进行保存,修改或者删除的时候。就像数据库里面的触发器一样,但是它的优点是,你可以通过java代码来实现你想要的功能,方便调试与实现。比如你想在生成销售订单的时候自动生成一个单据号,可以利用业务事件来处理。具体参考如下这个类:SetDocumentNoHandler

2. 简单示例

我们先来一个简单示例,如下代码所示:

public class GreetingEventHandler extends EntityPersistenceEventObserver {private static Entity[] entities = { ModelProvider.getInstance().getEntity(Greeting.ENTITY_NAME) };protected Logger logger = Logger.getLogger(this.getClass());@Overrideprotected Entity[] getObservedEntities() {return entities;}public void onUpdate(@Observes EntityUpdateEvent event) {if (!isValidEvent(event)) {return;}logger.info("Greeting " + event.getTargetInstance().getId() + " is being updated");}public void onSave(@Observes EntityNewEvent event) {if (!isValidEvent(event)) {return;}logger.info("Greeting " + ((Greeting) event.getTargetInstance()).getName()+ " is being created");}public void onDelete(@Observes EntityDeleteEvent event) {if (!isValidEvent(event)) {return;}logger.info("Greeting " + event.getTargetInstance().getId() + " is being deleted");}
}

需要注意如下几点:

1. 继承于EntityPersistenceEventObserver 类,帮助过滤出正确的事件(因为所有的保存,修改,删除事件都会发送过来,我们需要刷新出自己感兴趣的事件)

2. 方法名不重要,比如里面的onDelete方法,主要的是那个参数的声明@Observes EntityDeleteEvent event, Weld框架利用这个参数声明来判定哪些事件应该发送给这个方法。

3. 任何一个实体更新,保存,修改都会发送事件到这个eventHandler的对应方法,每一个方法头部,都需要通过方法isValidEvent事件来判断这个事件是否为自己感兴趣的。

4. 我们通过org.apache.log4j.Logger类来记录日志。

3. 简单展示

当你将这个类加入你的模块,重启tomcat的时候,进入称呼这个窗口:http://localhost:8080/openbravo/?tabId=282你将在控制台看到你记录的日志。

4. 更复杂一点示例

假如我们要在更新的时候判断title字段是否有一点,如果没有,在末尾加上一点。在保存的时候,增加一个子表翻译。如下代码所示:

public void onUpdate(@Observes
EntityUpdateEvent event) {
if (!isValidEvent(event)) {
return;
}
final Greeting greeting = (Greeting) event.getTargetInstance();
final String title = greeting.getTitle();
if (title != null && !title.endsWith(".")) {
final Entity greetingEntity = ModelProvider.getInstance().getEntity(Greeting.ENTITY_NAME);
final Property greetingTitleProperty = greetingEntity.getProperty(Greeting.PROPERTY_TITLE);
// note use setCurrentState and not setters on the Greeting object directly
event.setCurrentState(greetingTitleProperty, title + ".");
}
System.err.println("Greeting " + event.getTargetInstance().getId() + " is being updated");
}
public void onSave(@Observes
EntityNewEvent event) {
if (!isValidEvent(event)) {
return;
}
final Entity greetingEntity = ModelProvider.getInstance().getEntity(Greeting.ENTITY_NAME);
final Greeting greeting = (Greeting) event.getTargetInstance();
// now also add the dot to the title
final String title = greeting.getTitle();
if (title != null && !title.endsWith(".")) {
final Property greetingTitleProperty = greetingEntity.getProperty(Greeting.PROPERTY_TITLE);
// note use setCurrentState and not setters on the Greeting object directly
event.setCurrentState(greetingTitleProperty, title + ".");
}
final GreetingTrl greetingTrl = OBProvider.getInstance().get(GreetingTrl.class);
// set relevant translation properties
greetingTrl.setGreeting(greeting);
// 171 is dutch, choose any other language..
greetingTrl.setLanguage(OBDal.getInstance().get(Language.class, "171"));
// note we can call getters on the targetInstance, but not setters!
greetingTrl.setName(greeting.getName());
greetingTrl.setTitle(greeting.getTitle());
greetingTrl.setTranslation(false);
// and add the greetingTrl to the greeting
// we don't use event.setCurrentState as we get the list and add to it
// get the trl property for the greeting entity
final Property greetingTrlProperty = greetingEntity
.getProperty(Greeting.PROPERTY_GREETINGTRLLIST);
@SuppressWarnings("unchecked")
final List<Object> greetingTrls = (List<Object>) event.getCurrentState(greetingTrlProperty);
greetingTrls.add(greetingTrl);
// don't need to save the greetingTrl, it is saved as the child of the greeting
// OBDal.getInstance().save(greetingTrl);
System.err.println("Greeting " + ((Greeting) event.getTargetInstance()).getName()
+ " is being created");
}

这里需要注意几点:

1. 获取字段名通过新建一个空实体,如下代码所示

 final Entity greetingEntity = ModelProvider.getInstance().getEntity(Greeting.ENTITY_NAME);final Property greetingTitleProperty = greetingEntity.getProperty(Greeting.PROPERTY_TITLE);

2. 修改一个保存前实体某一个字段的值,不能用set方法,必须如下所示:

 event.setCurrentState(greetingTitleProperty, title + ".");

3. 新建一个需要持久化的实体,不能用new关键字,必须如下所示:

 final GreetingTrl greetingTrl = OBProvider.getInstance().get(GreetingTrl.class);

4. 新建的子实体不需要自己调用代码进行持久化,会随着主实体持久化而持久化。

5. 中断处理

假如我们想在保存前,判断一些条件,如果不满足,中断保存过程,我们可以抛出异常,如下代码所示:

 public void onUpdate(@ObservesEntityUpdateEvent event) {if (!isValidEvent(event)) {return;}final OBSA_Orderline_Assign olineAssign = (OBSA_Orderline_Assign) event.getTargetInstance();if (olineAssign.getProductWithStorage().getProduct() != olineAssign.getSalesOrderLine().getProduct()) {String language = OBContext.getOBContext().getLanguage().getLanguage();ConnectionProvider conn = new DalConnectionProvider(false);throw new OBException(Utility.messageBD(conn, "OBSA_ErrorProduct", language));}}

(后台)Openbravo如何实现业务事件监听处理相关推荐

  1. 如何实现业务解耦?spring中事件监听了解一下

    一.前言 二.业务解耦之事件监听实战         1.事件监听三大组件          2.事件发布以及监听实战案例          3.事件发布以及监听原理 一.前言 耦合这个词在平常的开发 ...

  2. 13、Java Swing事件监听:事件处理模型和事件监听器

    事件表示程序和用户之间的交互,例如在文本框中输入,在列表框或组合框中选择,选中复选框和单选框,单击按钮等.事件处理表示程序对事件的响应,对用户的交互或者说对事件的处理是事件处理程序完成的. 当事件发生 ...

  3. Spring Boot————ApplicationListener实现逃课事件监听

    引言 上一篇文章转了一篇关于ApplicationListener用于在Web项目启动时做一些初始化的用法. 但是,在实际生产过程中,当一个事件产生,又是如何被onApplicationEvent() ...

  4. 框架源码专题:Spring的事件监听、发布机制 ApplicationListener

    文章目录 1.Spring内置事件 2.自定义事件 3.事件监听器 4.事件发布 publishEvent 4.Spring事件原理 5. 面试题:怎么样可以在所有Bean创建完后做扩展代码? 6. ...

  5. RN性能优化以及事件监听

    自从React Native出世,虽然官方一直尽可能的优化其性能,为了能让其媲美原生App的速度,但是现实感觉有点不尽人意.接下来介绍下实践中遇到的一些性能问题以及优化方案. 一.StackNavig ...

  6. 监听返回app_基于 Redis 消息队列实现 Laravel 事件监听及底层源码探究

    在 Laravel 中,除了使用 dispatch 辅助函数通过 Illuminate\Bus\Dispatcher 显式推送队列任务外,还可以通过事件监听的方式隐式进行队列任务推送,在这个场景下,事 ...

  7. 编写一个IDEA插件之:事件监听

    事件监听,我们最熟悉不过的就是开发APP时,监听按钮点击事件.手指触摸及移动事件.网络状态事件等等.事件监听大多通过观察者模式实现,首先API调用者不需要知道后台是如何检测出网络状态不可用的,而只需要 ...

  8. Springboot事件监听机制:工作原理

    目录 前言 1.观察者模式 1.1观察者模式的核心元素 1.2观察者模式的工作流程 2.springboot事件监听机制的基本工作原理 2.1事件发布器是什么时候在哪里产生的呢? 2.2事件监听器是什 ...

  9. Java 创建事件Event、事件监听EventListener、事件发布publishEvent

    一.概述 个人认为,事件机制一般可由:事件源source,事件对象Event,事件监听EventListener,事件发布publishEvent组成 事件源:引起事件发生的源: User用户信息, ...

  10. Java语言学习--Swing中Button事件监听

    1 前言 今天在使用Java Swing中的JButton的事件触发机制时遇到了许多问题,简单的了解了一下. 2 事件监听机制 事件监听的机制如下图所示分析. 3 代码分析 3.1 分步解析 1.事件 ...

最新文章

  1. linux运维基础篇 unit14
  2. Simulink中From、Goto模块
  3. 9、图书修改,删除功能
  4. mysql查询某张表的所有外键_oracle中查询所有外键引用到某张表的记录
  5. 用C#实现软件自动更新
  6. rabbitmq channel对象的方法
  7. 【My Sft】彩色图像分析软件V1.0.1.0
  8. 「管理数学基础」3.4 凸分析:最优性的充要条件、无约束极小化问题、一般非线性规划问题
  9. java 爬虫 html页面 parse,Java 爬虫 爬取html网页解析
  10. gsyVideoPlayer直播短视频回放,集成腾讯播放器(2)
  11. [数据分析笔记] 网易云歌单分析系列01—爬取网易云歌单信息
  12. java 鼠标变成手型_当鼠标放在按钮上时让指针变为手型
  13. 如何通过自媒体创业月入万元
  14. 生信必会格式:Fasta Fastq 简介及转换
  15. 新一代的数据库备份解决方案--Oracle数据库
  16. Android应用面试题及答案汇总
  17. 修改Android app图标(Android Studio)
  18. Excel如何把全部符合单个条件的数据提取出
  19. 这个传奇大佬,自杀了!
  20. 颜色帮你缓解职场压力 给你的心情换个色

热门文章

  1. python中sys.argv的用法_python的sys.argv[]用法解释
  2. 致敬达叔 -- 80、90的童年观影记忆
  3. C++多线程detach函数使用
  4. python+opencv读取文件夹图片并保存
  5. vb局域网连接mysql_VB 用代码进行局域网内数据库的连接
  6. diamond mysql_TDDL动态数据源Diamond配置
  7. 拳皇世界6月13服务器维护,拳皇世界2月8日例行维护 数据互通公告[图]
  8. ​杠杆率是什么意思?外汇杠杆率高好还是低好?
  9. 恢复win7快速启动栏
  10. JAVA 中的修饰符的适用范围