AxonFramework消息、命令和事件
消息传送的概念 尽管所有这些消息都实现了消息接口,但不同类型的消息及其处理方式之间有明显的区别。所有消息包含payload、元数据和唯一标识符。消息的payload是消息的功能说明。该对象的类名组合与它所携带的数据,描述了消息的应用程序的含义。元数据允许你描述正在发送消息的上下文。例如,你可以存储跟踪信息,以允许跟踪消息的来源或原因。你还可以存储信息以描述正在执行命令的安全上下文。
命令 命令总是有一个确切的目的地。虽然发送者并不关心由哪个组件来处理命令或该组件驻留在哪里,但它可能对它的结果感兴趣。这就是命令总线上发送命令消息后,允许返回结果的原因。 事件 当事件被分发时,Axon把他们包装在一个EventMessage中。实际使用的消息类型取决于事件的来源。当一个事件是由一个聚合引发时,它被包装在DomainEventMessage(继承自EventMessage)中。所有其他事件都被包装在一个EventMessage中。除了像唯一标识这种常见的消息属性,EventMessage还包含一个时间戳。DomainEventMessage额外包含类型和聚合的标识符,它还在聚合的事件流中包含事件的序号,以允许重现事件的顺序。
原始事件对象存储为EventMessage的payload。紧挨着的payload,你可以将信息存储在一个事件消息的元数据中。元数据的目的是存储关于事件的额外信息,而不是业务信息。审计信息就是一个典型的例子。它可以让你看到在哪些情况下,一个事件会被引发,比如用户帐户触发进程,或处理事件的机器名称。
虽然不是强制性的,但让领域事件不可变是一种很好的做法,最好是将所有字段声明为final并在构造函数中初始化。如果事件构造太麻烦可考虑使用建造者模式(Builder pattern )。
当在事件总线分发事件时,你需要把它包装在一个事件消息中。GenericEventMessage是一个允许你将你的事件包装到一个消息的实现。你可以使用构造函数,或静态方法:asEventMessage()。 后者检查给出的参数是否已经实现了消息接口,如果是这样,它直接返回(如果它实现了EventMessage),或者返回一个使用给定消息的payload和元数据来实例化的GenericEventMessage。如果一个事件通过聚合发布,Axon将自动把事件包装在一个DomainEventMessage中,包含聚合的标识符,类型和序列号。 作者:勇赴 链接:http://www.jianshu.com/p/e7abb5a228e9 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |