摘要:类是一个模板类,用户可以指定需要通过创建的对象的类型,以及创建对象时需要传入的参数类型。它的职责是提供通过创建相应对象的具体策略。后记本文主要是讲解从创建的实例过程,所以不对作过多讲解,这儿只给出所处位置接口位于模块中的命名空间下。
背景
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。
具体注册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); Listconfigurations = 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
摘要:还自动配置发送和接收消息所需的基础设施。支持是一个轻量级的可靠的可伸缩的可移植的消息代理,基于协议,使用通过协议进行通信。 32. 消息传递 Spring框架为与消息传递系统集成提供了广泛的支持,从使用JmsTemplate简化的JMS API到使用完整的基础设施异步接收消息,Spring AMQP为高级消息队列协议提供了类似的特性集。Spring Boot还为RabbitTempla...
摘要:在公开的方法中,为的设置了继承于回调句柄。如此看来,如果想要异步通信完毕后,处理一些回调,则只需实现,并在适当的位置设置到的的里。在其保护方法里,创建了对象,并传入了。 ActiveMQChannelHandler NettyConnector在公开的start方法中,为Channel的pipeline设置了ActiveMQChannelHandler(继承于io.netty.chan...
摘要:本文旨在指出中集成的一些性能陷阱,在另一篇文章各组件详解里有组件介绍及如何正确使用的内容。因此的做法会大大降低性能,并且将大部分的时间都花在反复重建这些对象上。提供的可以让使用避免频繁创建的问题。至于使用的性能测试则留给同学自己做了。 Github 本文旨在指出Spring/Spring Boot中集成JMS的一些性能陷阱,在另一篇文章Spring JMS各组件详解里有Spring J...
阅读 2414·2021-11-15 11:36
阅读 1150·2019-08-30 15:56
阅读 2206·2019-08-30 15:53
阅读 967·2019-08-30 15:44
阅读 632·2019-08-30 14:13
阅读 977·2019-08-30 10:58
阅读 446·2019-08-29 15:35
阅读 1272·2019-08-29 13:58