资讯专栏INFORMATION COLUMN

从URI创建artemis core的ServerLocator实例过程的思考

wuaiqiu / 1176人阅读

摘要:类是一个模板类,用户可以指定需要通过创建的对象的类型,以及创建对象时需要传入的参数类型。它的职责是提供通过创建相应对象的具体策略。后记本文主要是讲解从创建的实例过程,所以不对作过多讲解,这儿只给出所处位置接口位于模块中的命名空间下。

背景

broker.xml中有这么一段:


    
    tcp://localhost:61618

那么,artemis中是如何将URI“tcp://localhost:61618”解析成ServerLocator的呢?

URI工厂

在artemis中,URI的处理,是通过URIFactory类进行加工的。
URIFactory类位于artemis-commons包中的org.apache.activemq.artemis.utils.uri命名空间下,它的主要功能是注册URISchema、委托URISchema创建相应的对象。URIFactory类是一个模板类,用户可以指定需要通过URI创建的对象的类型T,以及创建对象时需要传入的参数类型P。比如我们想要通过URI创建ServerLocator类型的对象,则T传入ServerLocator接口类型,P传入String类型。如其名称,它采用的是工厂方法设计模式。同时它还隐藏了策略模式,通过注册URISchema方法,引入包含通过URI创建相应对象的策略的URISchema,将创建对象的策略委托给了URISchema。

URI工厂中的策略

具体注册URISchema策略的执行者是ServerLocatorParser类。该类位于artemis-core-client模块中的org.apache.activemq.artemis.uri命名空间下。该类的构造函数,直接注册了4中策略:InVM、TCP、UDP、JGroup四种SchemaURI解析及策略。

    public ServerLocatorParser() {
      registerSchema(new InVMServerLocatorSchema());
      registerSchema(new TCPServerLocatorSchema());
      registerSchema(new UDPServerLocatorSchema());
      registerSchema(new JGroupsServerLocatorSchema());
   }

策略的载体——URISchema类,位于artemis-commons包中的org.apache.activemq.artemis.utils.uri命名空间下。它也是一个模板类,,用户可以指定需要通过URI创建的对象的类型T,以及创建对象时需要传入的参数类型P。它的职责是提供通过URI创建相应对象的具体策略。

URISchema类是策略接口的定义,其实现类InVMServerLocatorSchema、TCPServerLocatorSchema、UDPServerLocatorSchema、JGroupsServerLocatorSchema,是具体策略的实现。四个具体策略的实现类,位于artemis-commons包中的org.apache.activemq.artemis.uri.schema.serverLocator命名空间下。

URI策略-TCP策略的实现

URISchema类采用了模板方法模式,其中要求子类必须实现internalNewObject抽象方法。我们以TCPServerLocatorSchema这个子类为例来看看它是如何实现internalNewObject抽象方法的。代码如下:

    ConnectionOptions options = newConnectionOptions(uri, query);

    List configurations = TCPTransportConfigurationSchema.getTransportConfigurations(uri, query, TransportConstants.ALLOWABLE_CONNECTOR_KEYS, name, NettyConnectorFactory.class.getName());
    TransportConfiguration[] tcs = new TransportConfiguration[configurations.size()];
    configurations.toArray(tcs);
    if (options.isHa()) {
       return ActiveMQClient.createServerLocatorWithHA(tcs);
    } else {
       return ActiveMQClient.createServerLocatorWithoutHA(tcs);
    }

可见它主要是利用了TCPTransportConfigurationSchema的静态方法getTransportConfigurations,来根据uri解析得到TransportConfiguration对象列表,然后使用ActiveMQClient工具类的createServerLocatorWithHA或createServerLocatorWithoutHA类创建ServerLocator接口实例的。

后记

本文主要是讲解从URI创建artemis core的ServerLocator实例过程,所以不对ServerLocator作过多讲解,这儿只给出ServerLocator所处位置:
ServerLocator接口位于artemis-core-client模块中的org.apache.activemq.artemis.api.core.client命名空间下。
两个实现类,ServerLocaorInternal类和ServerLocatorImpl类,位于artemis-core-client模块中的org.apache.activemq.artemis.api.core.client.impl命名空间下。

相关模块、命名空间和类的汇总参考

artemis-commons

org.apache.activemq.artemis.utils.uri
    URIFactory
    URISchema
org.apache.activemq.artemis.uri.schema.serverLocator
    InVMServerLocatorSchema
    TCPServerLocatorSchema
    UDPServerLocatorSchema
    JGroupsServerLocatorSchema

artemis-core-client

org.apache.activemq.artemis.uri
    ServerLocatorParser
org.apache.activemq.artemis.api.core
    TransportConfiguration
org.apache.activemq.artemis.api.core.client
    ServerLocator
    ActiveMQClient
org.apache.activemq.artemis.api.core.client.impl
    ServerLocaorInternal
    ServerLocatorImpl

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/35805.html

相关文章

  • Spring Boot 参考指南(消息传递)

    摘要:还自动配置发送和接收消息所需的基础设施。支持是一个轻量级的可靠的可伸缩的可移植的消息代理,基于协议,使用通过协议进行通信。 32. 消息传递 Spring框架为与消息传递系统集成提供了广泛的支持,从使用JmsTemplate简化的JMS API到使用完整的基础设施异步接收消息,Spring AMQP为高级消息队列协议提供了类似的特性集。Spring Boot还为RabbitTempla...

    Doyle 评论0 收藏0
  • ArtemisJMS客户端中CompletionHandler是如何在artemis core

    摘要:在公开的方法中,为的设置了继承于回调句柄。如此看来,如果想要异步通信完毕后,处理一些回调,则只需实现,并在适当的位置设置到的的里。在其保护方法里,创建了对象,并传入了。 ActiveMQChannelHandler NettyConnector在公开的start方法中,为Channel的pipeline设置了ActiveMQChannelHandler(继承于io.netty.chan...

    Edison 评论0 收藏0
  • 使用Spring/Spring Boot集成JMS陷阱

    摘要:本文旨在指出中集成的一些性能陷阱,在另一篇文章各组件详解里有组件介绍及如何正确使用的内容。因此的做法会大大降低性能,并且将大部分的时间都花在反复重建这些对象上。提供的可以让使用避免频繁创建的问题。至于使用的性能测试则留给同学自己做了。 Github 本文旨在指出Spring/Spring Boot中集成JMS的一些性能陷阱,在另一篇文章Spring JMS各组件详解里有Spring J...

    xcold 评论0 收藏0
  • ArtemisMQ“未消费之谜”

    摘要:通过以上修改保证了客户端连接能够快速的断开,在应用重启时不会持续往这边发送消息,我使用进行压测,重启消费者过程中,消息都正常。 showImg(https://segmentfault.com/img/bVbjWjt?w=470&h=200);2018年6月份,我们开发了两个使用Artemis做消息队列实现的积分模块和PUSH推送模块,在几轮测试以后,大家信心满满的正式上线了,而且经过...

    callmewhy 评论0 收藏0
  • ArtemisMQ“未消费之谜”

    摘要:通过以上修改保证了客户端连接能够快速的断开,在应用重启时不会持续往这边发送消息,我使用进行压测,重启消费者过程中,消息都正常。 showImg(https://segmentfault.com/img/bVbjWjt?w=470&h=200);2018年6月份,我们开发了两个使用Artemis做消息队列实现的积分模块和PUSH推送模块,在几轮测试以后,大家信心满满的正式上线了,而且经过...

    William_Sang 评论0 收藏0

发表评论

0条评论

wuaiqiu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<