在用户修改了领域对象的值后,我们有时需要记录下用户的改动。比如对一些关键业务对象的改动有时往往需要发邮件通知客户。有时用户可能想查阅所有历史的改动,甚至有可能会改回原先的值。
领域逻辑关系往往比较复杂,这时我们会使用到ORM Framework。本文以toplink为例,讲述如何利用toplink编写一个完成此功能的简易Framework,我们暂且把它称为ActionMemed。
我们先来看一下大体的流程:
l 我们获得用户修改信息通常有两种方式,一种是被动的监听,另一种主动的通知。被动的监听就是framework订阅所关心领域对象的修改,主动通知是application主动的将修改之前和之后的对象通知framework。
l Framework接着从整个对象的树结构中找出用户所关心的某个特定的字段或者字段的组合,生成actionRecord。ActionRecord是描述用户对领域对象修改的数据结构,会包括用户修改的原因,修改者,修改的时间,修改的字段或者组合,修改前后的值等等信息。
l 在ActionRecord生成好之后,会将它记录到DB,发邮件通知用户或者通过JMS通知其他Application。
有了基本的概念后,看一下整体的结构:
Registry: 在TopLink上注册ActionListener。一旦在TopLink上检测到业务对象的改动就会调用ActionService,生成ActionRecord并调用相关的ActionRecorder。
ActionListener:TopLink的SessionListener,每次会话都会调用。我们在这里实现了preCommit方法,在UnitOfWork提交之前,捕捉用户的所有修改,并从中选取出用户所关心的对象的变动。
ActionService:当ActionListener从TopLink中获得到改动的对象,就会调用ActionService生成ActionRecord,并通知相关的Recorder,可能是Log到DB。如果用户是通过主动的方式传入新老两个对象就不需要Listener,直接调用ActionService,将新老对象或者新对象和ValueDistiller作为参数传入,
ValueDistiler:根据当前的新对象,萃取出老对象。TopLink就可以根据当前UnitOfWork中的新对象获取原始对象。方法是:
public Object getOriginalVersionOfObject(Object workingClone)
|
Expression:ActionMemed相关的配置数据,由ExpressionParser解析出来后就会cache在内存中。这个配置可以是文件,或者DB配置。只要能描述清楚就行。文件配置我们直接利用spring bean。
ActionConstructor:Listener从TopLink ChangeSet中拿到的只是有改动的对象。而我们关心的只是对象上某个Field或者它引用的某个对象的Field,比如说Employee有PhoneNumber List,PhoneNumber有个属性是areaCode,可能我们只关心areaCode值的更改,就只需要记录areaCode的更改,并且通知客户。所以我们需要根据用户配置对新老对象进行对比,比较是否有关注的属性被用户更改了。并且构建ActionRecord。比较的方法我们可以用JXpath, Xpath的表达能力很强,而且还可以自定义函数,在自定义扩展函数里用户可以对字段进行组合处理,从而生成它们自己想要记录的值。
ActionRecorder:当Action构建完成后,ActionRecorder就要将它通知客户,用JMS发给其他项目或者记录到DB。用户可以配置多个ActionRecorder。
MemedEventListener,让用户在ActionRecorder调用之前和之后做一些额外的处理。比如说用户可能在之前对Action的数据结构加入一些定制信息。
上面介绍了ActionMemed的流程和相关模块的功能。其实在使用中,特别是一次修改很多业务对象的时候,处理Action时间会有点长,况且Action的处理也并不需要实时。所以Action还需要提供异步处理的功能。
将异步调用的模块图和先前的结构图进行比较会发现有两处不同:
ServiceTask: 实现Java Runnable接口,基本实现类似于先前图中的ActionService。
ObjectCloner: 如果我们使用TopLink,在异步的情况下,用户当前的UnitOfWork(事务)会先提交,提交之后,从TopLink中萃取的旧对象会被Merge成新对象,这时我们只能提前在UnitOfWork提交之前自己根据Expression的结构深Copy一份出来。
ActionAsyncService: 为异步设计的ActionService,利用ValueDistiller从UnitOfwork获得当前对象的原始clone,构建ServiceTask,将ServiceTask提交到ThreadPool,当task被执行时,就会调用ActionService,这时的ActionService重用了同步流程中的ActonService。
在下篇中,将会介绍几个注意点。
下篇地址:http://ldd600.iteye.com/blog/534043
- 大小: 19.2 KB
- 大小: 28.3 KB
分享到:
相关推荐
Servlet上下文和侦听器
在编程和软件开发中,时间类型的侦听函数是一种重要的技术,它主要用于监控和处理与时间相关的事件或行为。这类函数通常被用在实时系统、游戏引擎、数据流处理或者任何需要定时触发某些操作的场景。在本文中,我们将...
借助大数据处理技术和流计算框架(如Apache Flink或Spark Streaming),企业可以实时处理大量并发的交易数据,快速识别出异常交易、热门服务、用户需求变化等关键信息。这样的实时响应能力对于提升用户体验、预防...
而过滤器(Filter)和侦听器(Listener)是Servlet规范中的两个重要概念,它们增强了应用的功能和灵活性。 **过滤器(Filter)** 过滤器在JSP中起到中介的作用,它们可以拦截HTTP请求和响应,对数据进行处理或修改...
在MATLAB开发中,事件侦听器是一种强大的工具,它允许程序对特定事件做出响应,例如数据更改或用户交互。本教程重点介绍了如何利用单个事件侦听器以及MATLAB UI(用户界面)中的Simulink Signal Viewer来增强模型的...
首先简要介绍了网络侦听的原理及其潜在的安全隐患,讲述了侦听技术在Unix和Windows环 境下的几种实现技术;说明了如何检测侦听器的存在;最后提出了一种切实可行的、用来消除网络侦听 的方案。
2. 创建TCP侦听器类,包含启动和停止侦听的方法以及处理连接的回调函数: ```vbnet Public Class TCPListener Private tcpListener As TcpListener Private serverPort As Integer Public Sub New(port As ...
这个示例可能涵盖了连接数据库、创建`SqlCommand`和`SqlDependency`对象、设置事件处理程序以及处理数据变更事件的完整流程。 需要注意的是,`SqlDependency`需要SQL Server Agent服务运行,并且需要在服务器端启用...
事件侦听器允许我们响应特定的事件,如用户点击、对象加载等,而无需不断检查这些事件是否已经发生,这与线性编程模式形成了鲜明对比。 线性编程,也称为顺序编程,是一种按照预定顺序执行指令的编程方式。在上述...
在IT领域,多线程TCP/IP侦听器是一种常见的网络通信工具,用于接收并处理来自多个客户端的并发连接。在VB.NET环境下,开发者可以利用System.Net.Sockets命名空间中的TcpListener类来实现这样的功能。本节将深入探讨...
<br>SerialTrace的界面美观精致,侦听、显示、仿真功能简捷易用,符合用户的操作和心理习惯。软件针对不同专业用户的关注内容,对信息进行分类,提供了 具有信息染色功能的多视图窗口供显示、分析使用,并提供...
8种加密狗侦听工具8种加密狗侦听工具8种加密狗侦听工具
PHP-PayPal-IPN, 用于侦听和处理即时付款通知( IPN )的PHP 5类 PHP-PayPal-IPN一个用于 PHP 5的贝宝即时付款通知( IPN ) 类。在 PHP IPN脚本中使用 IpnListener 类处理发布数据。回发到贝宝,以及从PayPal解析响应。...
当我们提到“arp 侦听工具”时,我们通常是指一种能够监控和分析ARP流量的软件,这些工具可以帮助网络管理员检测和解决网络中的问题。 标题中提到的“arp 侦听工具”通常具有以下功能: 1. **ARP请求和应答捕获**...
在Windows API中,"waveform"通常指的是Waveform Audio ...综上所述,利用Windows API实现话筒侦听涉及多个步骤,需要对音频处理和系统编程有深入的理解。通过学习和实践,开发者可以创建出高效、稳定的音频输入应用。
用于在服务器端侦听上传到服务器的数据。该工具是用C#编写的 ,使用的时候只要侦听端口号,以及要创建相应的数据库表。
Dojo事件对象包含了丰富的属性,例如`bubbles`(事件是否冒泡)、`currentTarget`(当前处理事件的节点)和`keyCode`(键盘事件的键码)等,这些都极大地简化了跨浏览器的事件处理。 键码的标准化是Dojo的一大亮点...
事件侦听是ActionScript(特别是Flash和Flex)中一个重要的交互处理机制。它允许我们对用户的行为或者对象的状态变化做出响应,例如,当用户点击一个按钮时触发特定的操作。 首先,`addEventListener`方法用于添加...
【TCP.rar_侦听_网络侦听】是一个与网络编程相关的资源,主要涉及TCP协议的实现和网络侦听技术。这个资源包含了一个使用VC(Visual C++)编写的TCP网络侦听示例工程的源代码,是学习和理解TCP网络通信机制的一个宝贵...
此外,一些高级的串口侦听工具可能还提供过滤、数据解析、保存日志等功能,以便更有效地处理大量数据和长期监测。 在"AccessPort"这个文件名中,可能指的是一个特殊的串口或者一种访问接口。这可能是一个特定设备的...