您的位置:首页 > 其它

JBossESB教程(三)——别人不会对你说的,第一个实例

2013-10-06 21:48 330 查看

前言

发现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说一下自己的看法~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: