2013年4月26日 星期五

JBoss ESB Sample quickstarts - HelloWorld

如題接下來會佈署 JBoss ESB 提供的 Sample - HelloWorld, 除測試 JBoss ESB 外透過這個 Sample 來說明 JBoss ESB 的內部運作。


準備執行環境

預設JBoss SOA/ESB 5.0 及 MySQL Server 5.1 已配置這裡不再贅述,如要更換 SOA/ESB 配置的 Database 可參考另一篇:JBoss SOA/ESB DataSource Configuration using MySql
  • JBoss SOA Server 5.0.2.GA+
  • JBoss ESB Server 4.10+
  • MySQL Server 5.1
  • Apache Ant 1.8.2+

%JBOSS_HOME%設定為 JBoss SOA 的路徑jboss-soa-5.0\jboss-as,須跟JBoss EAP做區別。


Quickstarts - HelloWorld Deployment & Test

  1. 將DOS Command 切換到如下路徑 %JBOSS_HOME%\samples\quickstarts\helloworld ,輸入 ant deploy,執行畫面如下,佈署成功的話會有 .esb Copy 到 %JBOSS_HOME%\server\PROFILE\deploy\ , 以此 Sample 為例可在 deploy 路徑下找到 Quickstart_helloworld.esb ,佈署預設 PROFILEdefault ,如要指定其它 PROFILE 可將 %JBOSS_HOME%\samples\quickstarts\conf\quickstarts.properties-example 更名為 quickstarts.properties 並修改內容;另外如佈署前 JBOSS 已啟動則會重新佈署。

  2. Start MySQL/JBoss SOA ,於 DOS Command 輸入 ant runtest,執行畫面如下 。

  3. 執行後的 JBoss SOA log 如下,這邊有做一些小修改,就是將 %JBOSS_HOME%\samples\quickstarts\helloworld\jboss-esb.xml 中的 action - SystemPrintln 的參數改為 <property name="printfull" value="true"/>printfull=false 只會在 Console 上輸出 body 的資訊(畫面中的紅色框),改為 printfull=true 可從畫面中看到顯示 message 的完整訊息。

  4. 執行 ant runtest 可由 %JBOSS_HOME%\samples\quickstarts\helloworld\build.xml 中看出是執行 src\org\jboss\soa\esb\samples\quickstart\helloworld\test\SendJMSMessage.java 就是將 Message 傳送至 Queue 的方式來觸發 HelloWorld 的執行;而另一種執行方式為 ant sendesb 則是 run SendEsbMessage.java ,這種方式則是呼叫 jboss-esb.xml 中定義的 Service: <service category="FirstServiceESB" name="SimpleListener" description="Hello World"> ,而呼叫端使用 ServiceName 不直接指定 QueueName,可對照如下的檔案 jboss-esb.xml/build.xml/SendEsbMessage.java
  5. <project name="Quickstart_helloworld" default="run" basedir=".">
    ....
        <target name="sendesb" depends="compile"
            description="Will send an esb Message">
            <echo>Runs Test ESB Message Sender</echo>
            <java fork="yes" classname="org.jboss.soa.esb.samples.quickstart.helloworld.test.SendEsbMessage" failonerror="true">
                <arg value="FirstServiceESB"/> <!--  service category -->
                <arg value="SimpleListener"/>  <!--  service name -->
                <arg value="Hello World - Straight to ESB listener - no Gateway"/> <!--  Message text -->
                <classpath refid="exec-classpath"/>
            </java>
        </target>
    </project>
    

    package org.jboss.soa.esb.samples.quickstart.helloworld.test;
    
    import org.jboss.soa.esb.message.Message;
    import org.jboss.soa.esb.message.format.MessageFactory;
    import org.jboss.soa.esb.client.ServiceInvoker;
    
    /**
     * Standalone class with to send ESB messages to a 'known' [category,name].
     * arg0 - service category
     * arg1 - service name
     * arg2 - Text of message to send
     * 
     * @author <a href="mailto:schifest@heuristica.com.ar">schifest@heuristica.com.ar</a>
     * @since Version 4.0
     *
     */
    public class SendEsbMessage 
    {
        public static void main(String args[]) throws Exception
        {
            //Setting the ConnectionFactory such that it will use scout
            System.setProperty("javax.xml.registry.ConnectionFactoryClass","org.apache.ws.scout.registry.ConnectionFactoryImpl");
            
            if (args.length < 3)
            {
                System.out.println("Usage SendEsbMessage <category> <name> <text to send>");
            }
    
            Message esbMessage = MessageFactory.getInstance().getMessage();
    
            esbMessage.getBody().add(args[2]);
    
            new ServiceInvoker(args[0], args[1]).deliverAsync(esbMessage);
        }
    }
    

  6. 接下來針對 JBoss ESB 內部的運作以 HelloWorld 做說明,ServiceProviderListenerAction 都在 jboss-esb.xml 中定義,詳細可參考文末的相關連結。
  7. JMS Client:SendJMSMessage.javaSendEsbMessage.java,呼叫 ESB Service 。
  8. Service:除了可發佈為對外的 Service 讓 JMS Client 呼叫外,內部也可以定義更小的 Service ,讓 ESB 內部重覆呼叫;以 ServiceCategory + ServiceName 來識別 Service (從第3點可看出)。
  9. Provider:a.做為 ESB Service 對外的接口接收來自 JMS Client Request ,除了 JMS 的型式外還有 http、sql.... 等多種型式。 b.也做為 ESB 內部的 Action 及 Service 之間傳遞訊息的通道,這部份使用 JMS - Queue/Topic 。
  10. Listener:監控 Provider 以取得 JMS Client 傳遞至 Provider 的 Message ,最後一個 Listener 會再將訊息傳遞至 Action,同樣除了 JMS 的型式外還有 http、sql.... 等多種型式。
  11. Action:接收 Listener 傳至的訊息並做商業邏輯的處理,處理後再做輸出,輸出有多種型式,以 HelloWorld 來講即透過 SystemPrintln 將訊息輸出至 Console 。
  12. 下面的圖中 Service 包含 Listener 跟 Action ,這是依據 jboss-esb.xml 中定義 Service 的方式做這樣的區分,實際上一個可對外的 ESB Service 除了圖中的 JMS Client 外,原則上是包含其他所有的元素。



相關設定可參考:
JBoss ESB學習筆記2——第一個ESB應用Hello World
JBoss ESB 4.x 介绍
JBossESB 4.4 GA Programmers Guide
JBoss Enterprise SOA Platform 5 ESB Services Guide - 3.3. Quickstart

沒有留言:

張貼留言