自动完成事件内容
通过设置属性和策略,可以自动完成事件内容。
执行此任务的目的和时间
在某些情况下,您可能希望为创建的所有事件自动设置某些事件属性数据。这是填写不会更改的特定标准值(如应用程序名称)或根据运行时环境(如创建时间或线程信息)提供的信息设置某些属性的方法。还可根据业务规则设置管理事件内容的策略;例如,您可能要求带有特定扩展名的任何事件的严重性设置为特定值。
可通过创建内容处理程序来实现此目的。内容处理程序是一个对象,它根据您要使用的任意策略自动设置每个事件的属性值。只要事件符合公共基本事件规范,Common Event Infrastructure 对内容处理程序修改事件数据的方式没有任何限制。
为确保所有事件源符合相同的策略,您可以创建与内容处理程序关联的事件工厂(使用 EventFactoryFactory 类),然后将创建的事件工厂绑定至
JNDI 名称空间。事件源不会创建自己事件工厂,而是执行 JNDI 查询来访问已经存在的事件工厂(而无需对内容处理程序有任何了解)。如果业务规则以后更改,您可以在一个地方修改内容处理程序。
事件源不需要进行任何操作即可启用内容完成。如果事件工厂与内容处理程序相关联,则它创建的每个事件都会带有该内容处理程序的引用。将事件提交至发射器时,事件将调用内容处理程序的
completeEvent() 方法,将引用传递给自身。这确保了事件源设置完特定于事件的属性后、发射器验证并处理事件之前,对事件应用了正确的策略。
注: 将事件从一个进程传输到另一个进程时,不会传输内容处理程序的引用。这是因为内容完成依赖于发起事件所在的环境,而必要的信息在别处可能无法获得。这一限制不会影响互为本地的应用程序之间的调用(如使用其本地接口对企业 bean 的调用)。
要创建内容处理程序,按这些步骤进行操作:
完成此任务需要执行的步骤
- 创建实现 org.eclipse.hyades.logging.events.cbe.ContentHandler 接口的新 Java 类。 此接口定义单个方法
completeEvent(CommonBaseEvent);该参数是要完成其内容的事件。在实现此方法时,可使用 CommonBaseEvent
的 getter 和 setter 方法来根据适用的任何策略处理事件属性数据。
注: 当事件源使用 JNDI
检索事件工厂时,将返回内容处理程序和事件工厂。因此,内容处理程序必须是可序列化的。
以下示例是一个简单的内容处理程序,它将自动设置每个事件的扩展名:
import java.io.Serializable;
import org.eclipse.hyades.logging.events.cbe.*;
public class BusinessContentHandler
implements ContentHandler, Serializable {
public void completeEvent(CommonBaseEvent event)
throws CompletionException {
event.setExtensionName("business");
}
}
- 将内容处理程序与事件工厂关联起来。 为此,在创建事件工厂时指定内容处理程序:
EventFactory eventFactory =
(EventFactory) EventFactoryFactory.createEventFactory(contentHandler);
返回的事件工厂将与指定的内容处理程序永久关联。