JBossESB HelloWorld实例解析
2010-03-22 20:15
441 查看
本文我们来具体结合JBossESB中自带的helloworld_action例子,通过具体的HelloWorld中的配置来分析JBossESB的运行机制。
该文件存放在%JBOSSESB_HOME%/sample/quickstarts/helloworld_action中。在看jboss-esb.xml的配置时候,我们应该分成两个部份.
<jms-provider name="JBossMQ" connection-factory="ConnectionFactory">
<jms-bus busid="quickstartGwChannel">
<jms-message-filter
dest-type="QUEUE"
dest-name="queue/quickstart_helloworld_action_Request"
/>
</jms-bus>
<jms-bus busid="quickstartEsbChannel">
<jms-message-filter
dest-type="QUEUE"
dest-name="queue/quickstart_helloworld_action_esb"
/>
</jms-bus>
</jms-provider>
</providers>
首先是
1.2、 services的部分配置代码如下:
<services>
<service category="HelloWorld_ActionESB"
name="SimpleListener"
description="Hello World" >
<listeners>
<jms-listener name="JMS-Gateway"
busidref="quickstartGwChannel"
is-gateway="true"
/>
<jms-listener name="JMS-ESBListener"
busidref="quickstartEsbChannel"
/>
</listeners>
<actions mep="OneWay">
<action name="action2"
class="org.jboss.soa.esb.actions.SystemPrintln"/>
<action name="displayAction" class="org.jboss.soa.esb.samples.quickstart.helloworldaction.MyJMSListenerAction"
process="displayMessage">
<property name="exceptionMethod" value="exceptionHandler"/>
</action>
<action name="playAction"
class="org.jboss.soa.esb.samples.quickstart.helloworldaction.MyJMSListenerAction"
process="playWithMessage">
<property name="exceptionMethod" value="exceptionHandler"/>
</action>
<action name="notificationAction"
class="org.jboss.soa.esb.actions.Notifier">
<property name="okMethod" value="notifyOK" />
<property name="notification-details">
<NotificationList type="OK">
<target class="NotifyConsole" />
<target class="NotifyQueues">
<messageProp name="quickstart" value="hello_world_action" />
<queue jndiName="queue/quickstart_helloworld_action_Response"/>
</target>
</NotificationList>
</property>
</action>
<!-- The next action is for Continuous Integration testing -->
<action name="testStore" class="org.jboss.soa.esb.actions.TestMessageStore"/>
</actions>
</service>
</services>
第二部份就是定义services的部份, 在这里定义了当前这个esb包所提供的services. 每个service又是由
在listener里,我们通过 busidref来关联到我们定义在provider里面的bus. 在这里,我们定义了两个listener. 其中一个是做为Gateway,只负责从外界获取到JMS的消息,然后转成ESB内部所需要的Message. 而另外一个listener是用来这个Message在services内部之间通讯的通道. 所以对于每个service来说,一定要至少定义一个listener来作为内部Message传输用.
{
protected ConfigTree _config;
public MyJMSListenerAction(ConfigTree config) { _config = config; }
public Message noOperation(Message message) { return message; }
public Message displayMessage(Message message) throws Exception{
logHeader();
System.out.println("Body: " + message.getBody().get().toString());
logFooter();
return message;
}
public Message playWithMessage(Message message) throws Exception {
// Header msgHeader = message.getHeader();
Body msgBody = message.getBody();
// Call theCall = msgHeader.getCall();
// EPR theEpr = theCall.getFrom();
String contents = msgBody.get().toString();
StringBuffer sb = new StringBuffer();
sb.append("/nBEFORE**/n");
sb.append(contents);
sb.append("/nAFTER**/n");
msgBody.add(sb.toString());
return message;
}
public void exceptionHandler(Message message, Throwable exception) {
logHeader();
System.out.println("!ERROR!");
System.out.println(exception.getMessage());
System.out.println("For Message: ");
System.out.println(message.getBody().get());
logFooter();
}
// This makes it easier to read on the console
private void logHeader() {
System.out.println("/n&&&&&&&&&&&&&&&&&&&&&&&&&&");
}
private void logFooter() {
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&/n");
}
}
其中上述的方法会对应在jboss-esb.xml文件中的action。其中action中的name表示该action的一个别名,class表示定义该action方法所在的类(包及类名),process表示该类下的具体的方法。
1、 jboss-esb.xml
该文件存放在%JBOSSESB_HOME%/sample/quickstarts/helloworld_action中。在看jboss-esb.xml的配置时候,我们应该分成两个部份. providers
和services
.
1.1、Providers部分配置代码如下:
<providers><jms-provider name="JBossMQ" connection-factory="ConnectionFactory">
<jms-bus busid="quickstartGwChannel">
<jms-message-filter
dest-type="QUEUE"
dest-name="queue/quickstart_helloworld_action_Request"
/>
</jms-bus>
<jms-bus busid="quickstartEsbChannel">
<jms-message-filter
dest-type="QUEUE"
dest-name="queue/quickstart_helloworld_action_esb"
/>
</jms-bus>
</jms-provider>
</providers>
首先是
<providers>,它是有一系列的
<provider>组成, 目前有jms-provider, fs-provider, ftp-provider等等. 然后我们在provider里面定义这个.esb文件里面service所定义的listener所需要的bus, Bus可以简单理解成消息传送所需要的传输层. 正如以下所显示的,我们定义了两个Bus,一个是给Gateway的Listener用,另外一个是给ESB-aware Message传输所需要的传输层.
1.2、 services的部分配置代码如下:
<services>
<service category="HelloWorld_ActionESB"
name="SimpleListener"
description="Hello World" >
<listeners>
<jms-listener name="JMS-Gateway"
busidref="quickstartGwChannel"
is-gateway="true"
/>
<jms-listener name="JMS-ESBListener"
busidref="quickstartEsbChannel"
/>
</listeners>
<actions mep="OneWay">
<action name="action2"
class="org.jboss.soa.esb.actions.SystemPrintln"/>
<action name="displayAction" class="org.jboss.soa.esb.samples.quickstart.helloworldaction.MyJMSListenerAction"
process="displayMessage">
<property name="exceptionMethod" value="exceptionHandler"/>
</action>
<action name="playAction"
class="org.jboss.soa.esb.samples.quickstart.helloworldaction.MyJMSListenerAction"
process="playWithMessage">
<property name="exceptionMethod" value="exceptionHandler"/>
</action>
<action name="notificationAction"
class="org.jboss.soa.esb.actions.Notifier">
<property name="okMethod" value="notifyOK" />
<property name="notification-details">
<NotificationList type="OK">
<target class="NotifyConsole" />
<target class="NotifyQueues">
<messageProp name="quickstart" value="hello_world_action" />
<queue jndiName="queue/quickstart_helloworld_action_Response"/>
</target>
</NotificationList>
</property>
</action>
<!-- The next action is for Continuous Integration testing -->
<action name="testStore" class="org.jboss.soa.esb.actions.TestMessageStore"/>
</actions>
</service>
</services>
第二部份就是定义services的部份, 在这里定义了当前这个esb包所提供的services. 每个service又是由
<listener>和
<actions>组成的.而actions又是由n个action组成。这里的action是对消息(Message)处理的地方.
在listener里,我们通过 busidref来关联到我们定义在provider里面的bus. 在这里,我们定义了两个listener. 其中一个是做为Gateway,只负责从外界获取到JMS的消息,然后转成ESB内部所需要的Message. 而另外一个listener是用来这个Message在services内部之间通讯的通道. 所以对于每个service来说,一定要至少定义一个listener来作为内部Message传输用.
2、 MyJMSListenerAction的定义:
public class MyJMSListenerAction extends AbstractActionLifecycle{
protected ConfigTree _config;
public MyJMSListenerAction(ConfigTree config) { _config = config; }
public Message noOperation(Message message) { return message; }
public Message displayMessage(Message message) throws Exception{
logHeader();
System.out.println("Body: " + message.getBody().get().toString());
logFooter();
return message;
}
public Message playWithMessage(Message message) throws Exception {
// Header msgHeader = message.getHeader();
Body msgBody = message.getBody();
// Call theCall = msgHeader.getCall();
// EPR theEpr = theCall.getFrom();
String contents = msgBody.get().toString();
StringBuffer sb = new StringBuffer();
sb.append("/nBEFORE**/n");
sb.append(contents);
sb.append("/nAFTER**/n");
msgBody.add(sb.toString());
return message;
}
public void exceptionHandler(Message message, Throwable exception) {
logHeader();
System.out.println("!ERROR!");
System.out.println(exception.getMessage());
System.out.println("For Message: ");
System.out.println(message.getBody().get());
logFooter();
}
// This makes it easier to read on the console
private void logHeader() {
System.out.println("/n&&&&&&&&&&&&&&&&&&&&&&&&&&");
}
private void logFooter() {
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&/n");
}
}
其中上述的方法会对应在jboss-esb.xml文件中的action。其中action中的name表示该action的一个别名,class表示定义该action方法所在的类(包及类名),process表示该类下的具体的方法。
3、 esb文件目录结构
在server目录下部署.esb的文件,它的目录结构如下所示:
/META-INF/jboss-esb.xml
/META-INF/deployment.xml 在这里定义对其他包或者服务的依赖,或者配置classloader.
jbm-queue-service.xml (optional) 这里是定义启动所需要的Queue
**.jar (optional) 放些所需要的第三方包
所需要的classes文件
4、 客户端调用服务
目前在JBossESB中,一般有两种方式来调用service. 一种是通过Gateway listener, 另外一种是直接通过ServiceInvoker的API来调用.
相关文章推荐
- Windows下qt的环境配置及运行一个c++"hello world"实例详细步骤
- Spring Rabbitmq HelloWorld实例
- Drools入门-----------环境搭建,分析Helloworld Drools5.0的xls文件转drl文件提升解析效率 使用BRMS的Tomcat6.0配置
- Spring4 MVC HelloWorld 注解和JavaConfig实例
- 驱动入门hello实例解析
- Drools入门-----------环境搭建,分析Helloworld Drools5.0的xls文件转drl文件提升解析效率 使用BRMS的Tomcat6.0配置
- HelloWorldScene解析
- Windows下qt的环境配置及运行一个c++"hello world"实例详细步骤
- SSM搭建-Maven安装与Maven HelloWorld入门实例(21)
- Qt学习之路(3):Hello, world!(源码解析)
- Spring4 MVC HelloWorld 注解和JavaConfig实例
- 大白话解析Objective-C(一):入门 (Hello World + 第一个类)
- Spring Hello World 实例
- Spring EL hello world实例
- (原)cocos2d笔记——解析HelloWorldAppDelegate
- 实例介绍Cocos2d-x物理引擎:HelloPhysicsWorld
- Windows下qt的环境配置及运行一个c++"hello world"实例详细步骤
- prjHelloWorld - Win32 Application Hello World 代码解析 - VC++6 - HackerJLY
- 第5章、解析Hello,world!知其然,更要知其所以然(从零开始学Android)
- apache module helloworld, Linux平台使用C编写网页 CGI helloword 实例