JBossESB教程(三)——別人不會對你說的,第一個實例

前言

        發現JBossESB網上流傳甚廣的就是JBoss學習筆記系列了,這個系列資料還可以,但如果你一上來就看這個的話,感覺還是有點蒙,因爲根本不明白這樣做到底是爲什麼。所以看了之後,也會發現自己只能照着葫蘆畫一個葫蘆,連一個瓢也畫不了。

        helloworld這句話從我們一進行編程的世界就經常聽到,那麼第一個例子,我們就來helloworld。

ESB目錄結構

        ESB發佈之後,會是一個.esb格式的zip壓縮包,裏面的結構如下:

                        

        其中:

                jboss-esb.xml:包含service、listener、action、provider的配置,具體都是什麼,後面會說到的。

                deployment.xml:是可選的,有兩種情況下會用這個。一種是一個.esb依賴令一個.esb,用來指定加載順序,另一種就是確定.esb的部署範圍。不明白沒關係,有的是例子使你明白這個的用處的。

                java classes:是你自己的包含包層次的action

                jars:這個我想不用說吧,就是添加你的應用依賴的包

                queue-service.xml:如果你的jboss-esb.xml中的provider使用的queue或者topic,你可以在通過這個來進行部署。使用其它方式督署也可以,不過ESB的官方文檔中明確說明的建議採取此種方式。

運行helloworld

        在JBossESB的doc裏面的Getting Started的最後面列出了一個學習JBossESB的學習建議。網上的JBossESB學習筆記大概就是按照這個順序來進行的,有一些不同,但不礙事。
        在最初,我其實不太建議自己去敲,因爲你還很不熟悉,直接運行它自己帶的例子就好。
        運行需要安裝Ant,Ant的安裝很簡單。提到Ant,不得不說一下。JBossESB是用的Ant構建的,所以最近和Ant打的交道特別多,最初感覺Ant沒啥,現在感覺裏面需要學習的東西很多,最近沒事學習一下這個小東西。前面的博客對這個對這個進行過說明,這裏不再重複。
        首先啓動服務器,這裏在JBossESB_Home/bin下的run.bat,不過建議新建一個start.bat,然後在裏面寫上run -b 0.0.0.0,這樣寫,就可以監聽所有的IP了,不然,你的服務只能用localhost或者127.0.0.1訪問(JBoss應用服務器首頁也是這樣的)。
        命令行下進入JBossESB_HOME/sample/quickstart/helloworld,然後運行ant deploy,成功後,再執行ant runtest;還可以執行ant sendesb執行,兩個執行的結果是一樣的,但原理卻差好多。

helloworld配置解析

        action的代碼很簡單,所以就不做什麼解析了,列一下代碼得了,需要說的就是配置以及執行流程。
        
public class MyJMSListenerAction extends AbstractActionLifecycle
{
    
  protected ConfigTree	_config;
	  
  public MyJMSListenerAction(ConfigTree config) { _config = config; } 
  
  public Message displayMessage(Message message) throws Exception{
		
		  System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");		  		  
		  System.out.println("Body: " + message.getBody().get()) ;
		  System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
		  return message; 
        		
	}
}
        怎樣寫Action,自己查文檔吧,沒啥意思。

jboss-esb.xml

        在這個裏面有provider、service、listener、action。
        provider是對外提供的一個入口,不論是ESB(aware)還是非ESB(aware)都可以通過這個進入。
        listener是對provider進行監聽的一個東西。通過它能夠獲取到發到provider上的東西。
        service是對外發布的服務,我感覺是對action的一個整理。
        action是一個又一個的動作。可大可小(粒度),就看你是怎樣設計的。
        看完這些基本的概念,那麼現在來看一下官方提供的權威例子吧。

<?xml version = "1.0" encoding = "UTF-8"?>
<jbossesb xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd" parameterReloadSecs="5">

    <providers>
          <jms-provider name="JBossMQ" connection-factory="ConnectionFactory">
              <jms-bus busid="quickstartGwChannel">
                  <jms-message-filter
                      dest-type="QUEUE"
                      dest-name="queue/quickstart_helloworld_Request_gw"
                   />
              </jms-bus>
              <jms-bus busid="quickstartEsbChannel">
                  <jms-message-filter
                      dest-type="QUEUE"
                      dest-name="queue/quickstart_helloworld_Request_esb"
                  />
              </jms-bus>

          </jms-provider>
      </providers>
      
      <services>
        <service 
        	category="FirstServiceESB" 
        	name="SimpleListener" 
        	description="Hello World">
            <listeners>
                <jms-listener name="JMS-Gateway"
                    busidref="quickstartGwChannel"
                    is-gateway="true"
                />
                <jms-listener name="helloWorld"
                              busidref="quickstartEsbChannel"
                />
            </listeners>
            <actions mep="OneWay">
                   <action name="action1" 
                   	class="org.jboss.soa.esb.samples.quickstart.helloworld.MyJMSListenerAction" 
                   	process="displayMessage" 
                   	/>      
                    <action name="action2" class="org.jboss.soa.esb.actions.SystemPrintln">
                      <property name="printfull" value="false"/>
                    </action>
                    <!-- The next action is for Continuous Integration testing -->
                    <action name="testStore" class="org.jboss.soa.esb.actions.TestMessageStore"/>
            </actions>
        </service>
      </services>
     
</jbossesb>

        大家發現了麼,在一個jms-provider裏面使用了兩個jms-bus,而且除了名字其它都一樣。但監聽它們的listoner配置是不一樣的,那就是is-gateway="true",這個區別了,is-gateway的默認值爲false。被設置這個屬性爲true的才能監聽來自非ESB(Unaware)發過來的消息,否則只能監聽ESB消息(Aware,採用ServiceInvoker調用)。
        下面,咱們來看一下官方文檔中給的一個helloworld中給出的執行流程的一個圖:
                
        有了這一張原理圖,是不是好些了呢?那麼我們繼續來看後幾個吧。

jbm-queue-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<server>
  <mbean code="org.jboss.jms.server.destination.QueueService"
    name="jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_esb"
    xmbean-dd="xmdesc/Queue-xmbean.xml">
	<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
	<depends>jboss.messaging:service=PostOffice</depends>
  </mbean>
  <mbean code="org.jboss.jms.server.destination.QueueService"
    name="jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_gw"
    xmbean-dd="xmdesc/Queue-xmbean.xml">
    <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
	<depends>jboss.messaging:service=PostOffice</depends>
  </mbean>
</server

        如果你看sample/quickstart/helloworld下面,還有一個jbmq-queue-service.xml,但部署文件裏只有jbm-queue-service.xml。
        下面是jbmq-queue-service.xml的配置信息:
<?xml version="1.0" encoding="UTF-8"?>
<server>
  <mbean code="org.jboss.mq.server.jmx.Queue"
    name="jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_esb">
    <depends optional-attribute-name="DestinationManager">
      jboss.mq:service=DestinationManager
    </depends>
  </mbean>
  <mbean code="org.jboss.mq.server.jmx.Queue"
    name="jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_gw">
    <depends optional-attribute-name="DestinationManager">
      jboss.mq:service=DestinationManager
    </depends>
  </mbean>
</server>

        jbm-queue-service.xml是JBoss messaging這種消息使用方式採用的配置文件,jbmq-queue-service.xml是JBossMQ的配置文件,但官方建議我們使用JBoss messaging,具體原因還待日後研究,只能說時間和精力有限啊。。。
        那麼剩下的就是對QUEUE的定義了,privide中用到的QUEUE和Topic都需要在這裏面進行一下定義。使用方法就照葫蘆畫一個瓢吧。

deployment.xml

<jbossesb-deployment>
  <depends>jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_esb</depends>
  <depends>jboss.esb.quickstart.destination:service=Queue,name=quickstart_helloworld_Request_gw</depends>
</jbossesb-deployment>

        上面說過兩種情況你會用到這個東西,esb部署上來需要使用到QUEUE或Topic,也就是說QUEUE這些東西是需要在程序部署上來之前就創建好。我感覺這個只是說明一下順序,而創建工作是jbm-queue-service.xml這個配置文件中做的事情。

結語

        至此,helloworld中用到的配置文件就說完了。我是看完官方給的所有PDF後纔開始看這些源碼的,再加上JBossESB學習筆記系列的一些簡單說明,現在感覺看例子什麼的比之前好多了,但是還是有一些數據庫之類的配置真心讓人感覺很不爽,而且還有一些概念目前沒有時間和精力來細研究,這塊的學習繼續進行~~後面陸續會有一些相對綜合的文章。
        下篇想就Notifier、Router、Wiretap說一下自己的看法~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章