mbassador
mbassador是实施发布订阅模式的轻巧,高性能事件总线。它旨在易于使用,并旨在具有丰富且可扩展的功能,同时保持资源效率和性能。
mbassador的核心是围绕一个自定义数据结构而建立的,该自定义数据结构提供了非阻滞读取和最小化锁定的争论,以使同时读取/写入访问的性能降低是最小的。说明该设计优势的基准可以在此GitHub存储库中获得。
该代码已经准备就绪:86%的指令覆盖范围,82%的分支机构覆盖范围,随机和同时运行的测试集,在过去的18个月中没有重大错误。如果不彻底测试代码,将不会对核心进行修改。
用法|功能|安装| Wiki |发行说明|集成|学分|贡献|执照
用法
在您的项目中使用mbassador非常容易。创建mbassador的尽可能多的实例(通常是单身人士会做的) bus = new mbassador () ,标记并使用@Handler注释配置您的消息处理程序,最后在任何mbassador INSPENS bus.subscribe(aListener)上注册听众。开始使用mbassador的出版物bus.post(message).now()或bus.post(message).asynchronously()一种开始向听众发送消息。
作为第一个参考,请考虑此说明性示例。您可能想查看示例的集合,以更详细地查看其功能。
mbassador ();
bus.subscribe (new SimpleFileListener());
bus.post(new File("/tmp/smallfile.csv")).now();
bus.post(new File("/tmp/bigfile.csv")).asynchronously();
\”>
// Define your handlers @ Listener ( references = References . Strong ) class SimpleFileListener { @ Handler public void handle ( File file ){ // do something with the file } @ Handler ( delivery = Invoke . Asynchronously ) public void expensiveOperation ( File file ){ // do something with the file } @ Handler ( condition = \"msg.size >= 10000\" ) @ Enveloped ( messages = { HashMap . class , LinkedList . class }) public void handleLarge ( MessageEnvelope envelope ) { // handle objects without common super type } } // somewhere else in your code mbassador bus = new mbassador (); bus . subscribe ( new SimpleFileListener ()); bus . post ( new File ( \"/tmp/smallfile.csv\" )). now (); bus . post ( new File ( \"/tmp/bigfile.csv\" )). asynchronously ();
特征
注释驱动
| 注解 | 功能 |
|---|---|
@Handler |
将方法标记为消息处理程序 |
@Listener |
可用于自定义侦听器宽配置,例如使用的参考类型 |
@Enveloped |
消息信封可用于将不同类型的消息传递到单个处理程序中 |
@Filter |
添加过滤以防止某些消息发布 |
提供所有内容,尊重类型层次结构
消息不需要实现任何接口,并且可以是任何类型的界面。在消息传递期间考虑了一条消息的类层次结构,因此处理程序还将接收其消耗的消息类型的子类型 – 例如,对象的处理程序。Class收到所有内容。与任何处理程序不匹配的消息会导致包装原始消息的DeadMessage对象的发布。可以通过注册处理DeadMessage的听众来处理DeadMessage事件。
同步和异步消息传递
使用mbassador时,有两种类型的(A-)同步性:消息派遣和处理程序调用。消息派遣
同步调度意味着发布方法块,直到所有处理程序都被处理为止。注意:这并不一定意味着每个处理程序都已被调用并收到了消息 – 由于可能将同步调度与异步处理程序相结合。这是publish(Object obj)和post(Objec obj).now()
异步调度意味着发布方法会立即返回,并且该消息将在另一个线程中派发(Fire and Hospect)。这是publishAsync(Object obj)和post(Objec obj).asynchronously()
处理程序调用
同步处理程序被顺序调用,并从运行出版物中的同一线程调用。异步处理程序意味着将实际的处理程序调用推到由工作线池处理的队列。
可配置的参考类型
默认情况下, mbassador使用弱参考来对听众使用弱参考,以使程序员明确订阅了不再使用的侦听器并避免记忆 – 透露率。在容器管理的环境中,这非常舒适,在这些环境中,通过框架,即春季,guice等创建和破坏听众。只需将所有内容添加到公共汽车中,它就会忽略没有处理程序的物体,并在垃圾收集器完成工作后自动清理孤儿弱参考。
可以使用@Listener(references=References.Strong)使用强引用来对侦听器进行配置,而不是使用弱参考。强烈引用的听众会坚持下去,直到明确取消订阅为止。
消息过滤
mbassador提供静态消息过滤。使用注释配置过滤器,可以将多个过滤器附加到单个消息处理程序上。由于@Handler中的1.2.0版Java EL表达式是定义条件消息调度的另一种方法。具有匹配处理程序但不传递配置过滤器的消息会导致包装原始消息的过滤对象出版。可以通过注册处理过滤的听众来处理过滤的事件。
注意:由于版本1.3.1可以将过滤器包裹在自定义注释中以进行重复使用
public static final class RejectAllFilter implements IMessageFilter { @ Override public boolean accepts ( Object event , SubscriptionContext context ) { return false ; } } @ IncludeFilters ({ @ Filter ( RejectAllFilter . class )}) @ Retention ( RetentionPolicy . RUNTIME ) public @interface RejectAll {} public static class FilteredMessageListener { // will cause republication of a FilteredEvent @ Handler @ RejectAll public void handleNone ( Object any ){ FilteredEventCounter . incrementAndGet (); } }
包裹的消息
消息处理人员可以声明使用Enveloped消息接收包裹的消息。信封可以包装不同类型的消息,以允许单个处理程序处理多种无关的消息类型。
处理程序的优先事项
处理程序可以与优先级相关联,以影响存在多个匹配处理程序时传递消息的顺序
自定义错误处理
消息传递期间的错误将发送到所有已注册的错误处理程序,可以根据需要将其添加到总线上。
可扩展性
mbassador设计为可扩展的,以自定义实现各种组件,例如消息调度程序和处理程序调用(使用装饰器模式),元数据读取器(您可以添加自己的注释)和工厂为各种对象。配置对象用于自定义不同的可配置零件,请参阅功能
安装
mbassador可从Maven Central存储库中使用以下坐标提供:
mbassador</artifactId>
<version>{see.git.tags.for.latest.version}</version>
</dependency>
\”>
< dependency > < groupId >net.engio</ groupId > < artifactId > mbassador </ artifactId > < version >{see.git.tags.for.latest.version}</ version > </ dependency >
您还可以从Maven Central存储库下载二元版本和Javadoc。当然,您始终可以克隆存储库并从源构建。
文档
正在进行努力扩展文档并提供代码样本以及有关消息总线如何工作的详细说明。代码样本也可以在各种测试用例中找到。请阅读有关此项目中使用的术语,以避免混乱和误解。
- Javadoc
- Wiki
- ProgramCreek上的API示例:处理程序,BusConfiguration, mbassador
集成
有一个弹簧延伸,可以支持在春季环境中发送类似CDI的交易消息。这是与其他框架集成的一个很好的例子。另一个例子是Guice集成。
学分
创建此组件的最初灵感来自Google Guava的活动总线实现。我喜欢其设计的简单性,并且相信Google库的代码质量。不幸的是,它仅使用强烈的参考。
感谢所有贡献者,尤其是
- Arne-dandamme增加了对元通道的支持
- Bernd Rosstauscher提供与Juel的初步集成
- David Sowerby回答用户问题,他的Guice集成教程和他的各种PRS
- Dorkbox用于各种PRS及其在性能调整方面的工作
- Durron597为他的许多PRS以及他为其他用户提供的帮助
非常感谢EJ技术提供了Intellij Idea的许可的开源许可证和Jetbrains的开源许可证
mbassador使用的OSS:Junit | Maven | MOCKITO | slf4j |奥德修斯·乔尔(Odysseus Juel)
贡献
从开放问题列表中选择问题并开始实施。使您的PRS小并提供测试代码!以一个很好的例子来看一下这个问题。
注意:由于数据结构和同步代码的复杂性,要获得稳定的核心花了很长时间。仅当新功能不需要对核心进行重大修改时,才能实现。 mbassador的主要重点是提供高性能扩展的酒吧/子。
示例代码和文档都是非常感谢的贡献。特别是与不同框架的集成具有很大的价值。随意并欢迎创建Wiki页面以分享您的代码和想法。示例:Guice集成
执照
该项目根据MIT许可证的条款分发。有关进一步的参考,请参见文件“许可”。
