jboss加载组件_直接从JBoss AS 7组件使用JGroups
jboss加載組件
JGroups是Bela Ban的用于可靠消息交換的軟件,該軟件高度可配置,可以使用TCP或UDP作為傳輸協(xié)議。 基本上,您在多個(gè)客戶端上運(yùn)行JGroup,它們構(gòu)成一個(gè)集群,它們可以在集群內(nèi)發(fā)送和接收消息。
JGroups由JBoss Infinispan內(nèi)部使用。 但是,與JGroups不同,Infinispan添加了分布式緩存語(yǔ)義(復(fù)制/分布式模式,條目無(wú)效,事務(wù)行為,Map訪問(wèn)API等)。它甚至允許您將集群用作計(jì)算網(wǎng)格。
依次使用Infinispan提供JBoss AS 7集群功能。 因此,這意味著底層的JGroups子系統(tǒng)可以并使用標(biāo)準(zhǔn)的JBoss AS 7 Standalone * .xml文件進(jìn)行配置。 您可以從Java EE組件(例如EJB)訪問(wèn)Infinispan緩存,而不會(huì)出現(xiàn)此處所述的任何問(wèn)題。
但是,在某些情況下,您只想使用基礎(chǔ)JGroups消息傳遞而不是Infinispan為您提供的所有緩存語(yǔ)義。 這是事情變得越來(lái)越復(fù)雜的地方。 您始終可以直接使用JGroups,并將其配置存儲(chǔ)為應(yīng)用程序本地資源。 是否違反或違反Java EE規(guī)范可能會(huì)引起爭(zhēng)議,Java EE規(guī)范規(guī)定應(yīng)用程序不應(yīng)管理低級(jí)連接,生成線程,打開(kāi)套接字等。應(yīng)用服務(wù)器-它還使我們可以使用一個(gè)配置文件,而不是將其分布在多個(gè)位置。 因此,問(wèn)題是– 如何從我們的EJB應(yīng)用程序訪問(wèn)JGroups子系統(tǒng)? 整個(gè)解決方案涉及幾個(gè)步驟,下面將對(duì)其進(jìn)行描述。 如果要檢查整個(gè)工作項(xiàng)目, 請(qǐng)查看我的JGroups AS7 Github項(xiàng)目 。
1.編寫自定義JBoss AS 7服務(wù)激活器
該激活器( JGroupsChannelServiceActivator.java )將做兩件事:
- 使用JBoss協(xié)議配置創(chuàng)建實(shí)際的JGroups通道,
- 將新創(chuàng)建的JGroups通道綁定到JNDI。
第一部分在JGroupsChannelServiceActivator#createChannel(-) 。 我不知道ServiceActivator或JBoss AS 7模塊的其他內(nèi)部組件,但從中您可以看到:
InjectedValue<ChannelFactory> channelFactory = new InjectedValue<>(); ServiceName serviceName = ChannelFactoryService.getServiceName(STACK_NAME); ChannelService channelService = new ChannelService(CHANNEL_NAME, channelFactory);target.addService(channelServiceName, channelService).addDependency(serviceName, ChannelFactory.class, channelFactory).install();似乎它會(huì)創(chuàng)建一個(gè)新服務(wù)( ChannelService ),并讓JBoss MSC在安裝過(guò)程中自動(dòng)注入其依賴的ChannelFactory 。 ChannelFactory將使用UDP協(xié)議棧。 第二部分在JGroupsChannelServiceActivator#bindChannelToJNDI(-)完成, JGroupsChannelServiceActivator#bindChannelToJNDI(-)新創(chuàng)建的Channel實(shí)例綁定到用戶定義位置下的JNDI。 在我們的例子中是java:jboss/channel/myChannel 。
2.注冊(cè)激活器
現(xiàn)在,我們需要告訴JBoss AS 7調(diào)用我們的自定義激活器。 使用標(biāo)準(zhǔn)化的JDK ServiceLoader API完成 。 簡(jiǎn)而言之,這意味著我們需要提供一個(gè)帶有我們激活器類完全限定名稱的META-INF/services/org.jboss.msc.service.ServiceActivator文件。 看一下這個(gè)例子 。
3.將必需的模塊添加到我們的應(yīng)用程序
好的,所以我們有一個(gè)應(yīng)該做魔術(shù)的活化劑。 如果我們嘗試這樣部署它,我們將獲得一堆ClassNotFoundException 。 這是因?yàn)镴Boss模塊。 我們的應(yīng)用程序未包含所有這些JBoss工件,例如JGroups,ServiceActivator API和JNDI相關(guān)類。 我們不想讓應(yīng)用程序被那些庫(kù)弄得亂七八糟,我們只想定義JBoss AS 7本身提供的模塊的依賴關(guān)系。 我們?cè)贛ETA-INF/jboss-deployment-structure.xml 。 請(qǐng)注意,我們可以在MANIFEST.MF Dependencies:部分中執(zhí)行此操作,但是Intellij IDEA似乎無(wú)法與Maven生成的MANIFEST.MF一起使用 :
<?xml version='1.0' encoding='UTF-8'?> <jboss-deployment-structure><deployment><dependencies><module name='org.jgroups'/><module name='org.jboss.as.naming'/><module name='org.jboss.as.clustering.jgroups'/></dependencies></deployment> </jboss-deployment-structure>訪問(wèn)JChannel,ChannelService等需要JGroups模塊。JNDI綁定代碼需要命名模塊。
4.使用JGroups Channel開(kāi)發(fā)EJB
JGroupsSampleDataProducer是一個(gè)Singleton EJB,它顯示了如何訪問(wèn)JGroups通道。 由于JNDI綁定,它相當(dāng)簡(jiǎn)單。 我們可以使用:
@Resource(lookup = 'java:jboss/channel/myChannel') private JChannel channel;在那里。 該EJB注冊(cè)一個(gè)計(jì)時(shí)器,該計(jì)時(shí)器每2秒被調(diào)用一次,并發(fā)送一些隨機(jī)的String消息。
注意,我們不必顯式啟動(dòng)JChannel 。 我們只是注入并立即使用它。 看一下步驟1中在我們的激活器中使用的ChannelService 。它的啟動(dòng)方法如下:
@Override protected void start() throws Exception {(...)if (this.channel.getProtocolStack().findProtocol(STATE_TRANSFER.class, STATE.class, STATE_SOCK.class) != null) {this.channel.connect(this.id, null, STATE_TRANSFER_TIMEOUT);} else {this.channel.connect(this.id);}因此, 該服務(wù)將自動(dòng)連接到我們的頻道 。 除了使用ChannelService我們還可以開(kāi)發(fā)自己的服務(wù),該服務(wù)將負(fù)責(zé)啟動(dòng)和停止我們的頻道,或者甚至可以將此責(zé)任移交給頻道的實(shí)際用戶。
5.部署EJB-JAR
現(xiàn)在,我們準(zhǔn)備將應(yīng)用程序部署到JBoss AS 7服務(wù)器。 這里最重要的部分是確保我們的服務(wù)器將以適當(dāng)?shù)呐渲眠\(yùn)行,這意味著已定義了JGroups協(xié)議棧。 使用<subsystem xmlns='urn:jboss:domain:jgroups:1.1'> 。 我正在使用JBoss AS 7.1.1和standalone-full-ha.xml配置。
**注意:**因?yàn)镮ntellij IDEA不允許您像Eclipse一樣輕松地更改JBoss AS的配置文件,所以我們需要使用VM選項(xiàng)來(lái)指定它: -Djboss.server.default.config=standalone-full-ha.xml 。
我們還需要確保JGroups將使用IPv4 (有時(shí)會(huì)選擇IPv6,這可能會(huì)導(dǎo)致某些奇怪而又難以解決的問(wèn)題。)為此,請(qǐng)?jiān)诜?wù)器配置中添加-Djava.net.preferIPv4Stack=true選項(xiàng)。
6.運(yùn)行客戶端應(yīng)用程序
您可以在此處找到相當(dāng)簡(jiǎn)單的客戶端代碼。 它只是使用指定的配置文件連接到JGroups集群。 注意,服務(wù)器和客戶端的多播端口號(hào)和地址應(yīng)設(shè)置為相同的值。 另外,請(qǐng)記住在運(yùn)行客戶端時(shí)添加-Djava.net.preferIPv4Stack=true VM選項(xiàng)。 希望本教程對(duì)您有所幫助,并且可以節(jié)省一些配置時(shí)間。 十分感謝貝拉班了很多重要的建議和保羅·費(fèi)拉羅指著我初步認(rèn)識(shí)論壇主題(像這樣或這樣就類似的問(wèn)題之一)。
參考:在Piotr Nowicki主頁(yè)博客上,我們的JCG合作伙伴 Piotr Nowicki 直接從JBoss AS 7組件使用JGroups 。
翻譯自: https://www.javacodegeeks.com/2013/03/using-jgroups-directly-from-jboss-as-7-component.html
jboss加載組件
總結(jié)
以上是生活随笔為你收集整理的jboss加载组件_直接从JBoss AS 7组件使用JGroups的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 芋艿怎么读 芋艿如何读
- 下一篇: 如何处理异常