摘要:類是一個模板類,用戶可以指定需要通過創建的對象的類型,以及創建對象時需要傳入的參數類型。它的職責是提供通過創建相應對象的具體策略。后記本文主要是講解從創建的實例過程,所以不對作過多講解,這兒只給出所處位置接口位于模塊中的命名空間下。
背景
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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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...
閱讀 2433·2021-11-15 11:36
閱讀 1172·2019-08-30 15:56
閱讀 2243·2019-08-30 15:53
閱讀 1038·2019-08-30 15:44
閱讀 649·2019-08-30 14:13
閱讀 997·2019-08-30 10:58
閱讀 476·2019-08-29 15:35
閱讀 1293·2019-08-29 13:58