- 浏览: 86885 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
518ts520:
03:07:24,852 INFO [ServiceInvo ...
JBoss ESB学习笔记16——第十五个ESB应用Web Service Consumer 1 -
dy.f:
你理解错误了,selector="type='fro ...
JBoss ESB学习笔记5——第四个ESB应用Hello World File Action -
xiaoshalou_2002:
错误贴上 。Exception in thread &q ...
JBoss ESB学习笔记12——第十一个ESB应用Spring Hello World -
xiaoshalou_2002:
我这边16个例子中的客户端运行都出错,是少了 ...
JBoss ESB学习笔记12——第十一个ESB应用Spring Hello World -
qianyang:
ligenhang 写道我部署也报java.lang.Runt ...
JBoss ESB学习笔记2——第一个ESB应用Hello World
续上篇介绍了第一个ESB应用,本文介绍第二个ESB应用——Hello World Action。
说明:本文及后续文章虽非百分百的原创,但毕竟包含本人的努力和付出,所以希望大家转载时务请注明出处:http://yarafa.iteye.com,谢谢合作。
1 概述
该实例主要是用来演示在一个配置文件中配置多个action的调用,下面将要演示的是在一个action类中定义多个调用方法,当然也可以这些调用方法放在不同的类中。
通常,对于一个service而言,需要同时定义两个listener,其中一个是做为Gateway,只负责从外界获取JMS消息,然后转成ESB内部所需要的Message。而另一个listener是ESB Message在services内部之间通讯的通道。所以对于每个service来说,一定要至少定义一个listener来作为内部Message传输用,否则,需要将service的invmScope属性设置为GLOBAL。
在下面的例子中,需要定义三个消息队列,一个接收来自客户端的消息,第二个用作ESB内部Message通道,第三个接收来自ESB的反馈消息,客户端可从该消息队列中获取ESB的反馈消息。
2 新建ESB工程
操作过程略。
3 ESB配置
3.1 创建消息队列
如概述中所描述,这里将创建三个消息队列。在esbcontent文件夹下创建文件jbm-queue-service.xml用于配置消息队列,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <server> <mbean code="org.jboss.jms.server.destination.QueueService" name="jboss.esb.helloworld.destination:service=Queue,name=helloworldRequest" 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.helloworld.destination:service=Queue,name=helloworldEsb" 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.helloworld.destination:service=Queue,name=helloworldResponse" xmbean-dd="xmdesc/Queue-xmbean.xml"> <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer </depends> <depends>jboss.messaging:service=PostOffice</depends> </mbean> </server>
3.2 定义Provider
这里将定义一个JMS Provider,同时定义两个消息通道,一个用于监听客户端发来的消息,另一个用作ESB消息通道。内容如下:
<jms-provider connection-factory="ConnectionFactory" name="JBossMQ"> <jms-bus busid="helloworldGwChanel"> <jms-message-filter dest-name="queue/helloworldRequest" dest-type="QUEUE" /> </jms-bus> <jms-bus busid="helloworldEsbChanel"> <jms-message-filter dest-name="queue/helloworldEsb" dest-type="QUEUE" /> </jms-bus> </jms-provider>
3.3 定义Service
<service category="HelloWorld" description="Hello World" name="HelloWorldService"> <listeners /> <actions / </service>
3.4 定义Listener
这里定义两个listener,分别用于监听客户端消息和ESB内部消息。其中,前者用于监听客户端消息,因此需要将其is-gateway属性设置为true。
<jms-listener busidref="helloworldGwChanel" is-gateway="true" name="helloworldJMSListener" /> <jms-listener busidref="helloworldEsbChanel" name="helloworldEsbListener" />
3.5 定义Action类
这里仍然使用自定义的action类,因此需要扩展AbstractActionLifecycle类。类的全部代码如下:
/*********************************************************************** * <p>Project Name: helloworldaction</p> * <p>File Name: com.thu.afa.esb.jbossesb.action.HelloWorldAction.java</p> * <p>Copyright: Copyright (c) 2010</p> * <p>Company: <a href="http://afa.thu.com">http://afa.thu.com</a></p> ***********************************************************************/ package com.thu.afa.esb.jbossesb.action; import org.jboss.soa.esb.actions.AbstractActionLifecycle; import org.jboss.soa.esb.helpers.ConfigTree; import org.jboss.soa.esb.message.Body; import org.jboss.soa.esb.message.Message; /** * <p>Class Name: HelloWorldAction</p> * <p>Description: </p> * @author Afa * @date 2010-9-7 * @version 1.0 */ public class HelloWorldAction extends AbstractActionLifecycle { protected ConfigTree configTree; public HelloWorldAction(ConfigTree configTree) { this.configTree = configTree; } public Message noOperation(Message message) throws Exception { return message; } public Message printMessage(Message message) throws Exception { System.out.println("Message Body: " + message.getBody().get().toString()); return message; } public Message playWithMessage(Message message) throws Exception { Body body = message.getBody(); String content = body.get().toString(); StringBuffer buffer = new StringBuffer(); buffer.append("Before------------------"); buffer.append(content); buffer.append("After-------------------"); body.add(buffer.toString()); return message; } public void exceptionHandler(Message message, Throwable exception) { System.out.println("!ERROR!"); System.out.println(exception.getMessage()); System.out.println("For Message: "); System.out.println(message.getBody().get()); } }
类方法说明:printMessage方法用于在控制台打印输出消息的内容,playWithMessage方法用于处理消息,而exceptionHandler则是异常处理方法。
3.6 配置Action
由于使用了自定义的action类,因此在说明action配置之前介绍了action类的定义。下面将说明action的配置。
<actions mep="OneWay"> <action lass="com.thu.afa.esb.jbossesb.action.HelloWorldAction" name="printAction" process="printMessage"> <property name="exceptionMethod" value="exceptionHandler" /> </action> <action lass="com.thu.afa.esb.jbossesb.action.HelloWorldAction" name="playAction" process="playWithMessage"> <property name="exceptionMethod" value="exceptionHandler" /> </action> <action class="org.jboss.soa.esb.actions.Notifier" name="notificationAction"> <property name="okMethod" value="notifyOK" /> <property name="notification-details"> <NotificationList type="OK"> <target class="NotifyConsole" /> <target class="NotifyQueues"> <messageProp name="helloworld" value="Queue Notification" /> <queue jndiName="queue/helloworldResponse" /> </target> </NotificationList> </property> </action> </actions>
配置说明:这里定义了三个action,当有消息到来时,所有的action将会顺序执行。即当接收到客户端消息时,将首先执行printAction,该action将会调用HelloWorldAction类的printMessage方法打印消息内容。之后执行第二个action,即playAction,该action将会调用HelloWorldAction类的playWithMessage方法用于处理printAction传递过来的消息(ESB内部消息)。之后执行第三个action,即notificationAction,这是一个由JBoss ESB所提供的处理类,从类名可看出该类用于像指定的位置发出通知,这里的通知位置有两个,一个是控制台,由<target class="NotifyConsole" />指定,另一个是消息队列:queue/helloworldResponse,即被第二个action处理后的消息将会被发送到该消息队列,客户端或者其他的应用系统可在此读取消息。
3.7 配置部署文件
部署依赖文件deployment.xml内容如下:
<jbossesb-deployment> <depends>jboss.esb.helloworld.destination:service=Queue,name=helloworldRequest </depends> <depends>jboss.esb.helloworld.destination:service=Queue,name=helloworldEsb </depends> <depends>jboss.esb.helloworld.destination:service=Queue,name=helloworldResponse </depends> </jbossesb-deployment>
3.8 部署ESB
将整个工程导出成一个ESB文件,并保存至JBoss ESB Server的部署目录下,启动JBoss ESB Server即可。
4 ESB客户端
4.1 新建Java工程
这里略去操作过程以及添加所需要的Jar包,具体操作过程可参考第一个ESB实例说明。
4.2 发送消息的客户端
package com.thu.afa.esb.jbossesb.client; import java.util.Properties; import javax.jms.Message; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.naming.Context; import javax.naming.InitialContext; public class Main { private QueueConnection connection; private QueueSession session; private Queue queue; public void setupConnection() throws Exception { …… } public void stop() throws Exception { …… } public void sendMessage(String text) throws Exception { …… } public static void main(String[] args) throws Exception { Main main = new Main(); main.setupConnection(); main.sendMessage("Llu, miss you, afa"); main.stop(); } }
其中,省略部门代码如下:
public void setupConnection() throws Exception { System.out.println("Connection Starting..."); Properties properties = new Properties(); properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); properties.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); properties.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); InitialContext context = new InitialContext(properties); QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup("ConnectionFactory"); connection = factory.createQueueConnection(); queue = (Queue) context.lookup("queue/helloworldRequest"); session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); connection.start(); System.out.println("Connection Started"); }
public void stop() throws Exception { if(connection != null) connection.stop(); if(session != null) session.close(); if(connection != null) connection.close(); } public void sendMessage(String text) throws Exception { QueueSender sender = session.createSender(queue); Message message = session.createTextMessage(text); sender.send(message); sender.close(); }
运行程序将会在ESB服务器的控制台看到如下图所示输出信息,其中第一行即是printAction打印输出的来自客户端的消息。第二行显示的是经过playAction处理后的消息,由notificationAction指向控制台的输出通知。
4.3 接收消息的客户端
package com.thu.afa.esb.jbossesb.client; import java.util.Properties; import javax.jms.Message; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.naming.Context; import javax.naming.InitialContext; public class Main { private QueueConnection connection; private QueueSession session; private Queue queue; public void setupConnection() throws Exception { …… } public void stop() throws Exception { …… } public void receiveMessage() throws Exception { …… } public static void main(String[] args) throws Exception { Main main = new Main(); main.setupConnection(); client.receiveMessage(); main.stop(); } }
其中,省略部门代码如下:
public void setupConnection() throws Exception { System.out.println("Connection Starting..."); Properties properties = new Properties(); properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); properties.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); properties.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); InitialContext context = new InitialContext(properties); QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup("ConnectionFactory"); connection = factory.createQueueConnection(); queue = (Queue) context.lookup("queue/helloworldResponse"); session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); connection.start(); System.out.println("Connection Started"); }
public void stop() throws Exception { if(connection != null) connection.stop(); if(session != null) session.close(); if(connection != null) connection.close(); } public void receiveMessage() throws Exception { QueueReceiver receiver = session.createReceiver(queue); Message message = receiver.receive(); if(message != null) { if(message instanceof ObjectMessage) { ObjectMessage objectMessage = (ObjectMessage) message; System.out.println(objectMessage.getObject().toString()); } else if (message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message; System.out.println(textMessage.getText()); } } receiver.close(); }
运行程序将会在Java控制台看到如下图所示的输出信息,该信息即是notificationAction发往queue/helloworldResponse的消息。
上述便是ESB第二个应用实例。如有问题,欢迎指正。
-----------------------------------------------------
Stay Hungry, Stay Foolish!
http://yarafa.iteye.com
Afa
Dec 21st, 2010
-----------------------------------------------------
评论
Before------------------Llu, miss you, afaAfter-------------------
这个时候它接收的消息应该是空 因为我发送消息的客户端程序并没有执行
请问这个是为什么呢
那么这两个listener 在执行actions方法时是如何进行的呢
还希望楼主帮助~
client.receiveMessage();
这句是否错误?
是否应该是:
main.receiveMessage();?
发表评论
-
JBoss ESB学习笔记16——第十五个ESB应用Web Service Consumer 1
2011-04-15 21:06 3213续上篇介绍了第十四个ESB应用,本文介绍第十五个ESB应用—— ... -
JBoss ESB学习笔记15——第十四个ESB应用Transform XML to POJO
2011-04-12 13:09 1993续上篇介绍了第十三个ESB应用,本文介绍第十四个ESB应用—— ... -
JBoss ESB学习笔记14——第十三个ESB应用Transform CSV to XML
2011-04-09 13:12 1942续上篇介绍了第十二个ESB应用,本文介绍第十三个ESB应用—— ... -
JBoss ESB学习笔记13——第十二个ESB应用Spring AOP
2011-04-03 11:42 1560续上篇介绍了第十一个ESB应用,本文介绍第十二个ESB应用—— ... -
JBoss ESB学习笔记12——第十一个ESB应用Spring Hello World
2011-04-01 15:27 2275续上篇介绍了第十个ESB应用,本文介绍第十一个ESB应用——S ... -
JBoss ESB学习笔记11——第十个ESB应用Message Filters
2011-03-29 20:35 1920续上篇介绍了第九个ESB应用,本文介绍第十个ESB应用——Me ... -
JBoss ESB学习笔记10——第九个ESB应用JMS Topic
2011-03-26 21:14 2312续上篇介绍了第八个ESB应用,本文介绍第九个ESB应用——JM ... -
JBoss ESB学习笔记9——第八个ESB应用JMS Router
2011-03-11 21:16 2504续上篇介绍了第七个ESB应用,本文介绍第八个ESB应用——JM ... -
JBoss ESB学习笔记8——第七个ESB应用Https Gateway
2011-03-05 11:29 2492续上篇介绍了第六个ESB应用,本文介绍第七个ESB应用——Ht ... -
JBoss ESB学习笔记7——第六个ESB应用Http Gateway
2011-02-26 10:45 3423续上篇介绍了第五个ESB应用,本文介绍第六个ESB应用——Ht ... -
JBoss ESB学习笔记6——第五个ESB应用Custom Action
2011-01-15 10:34 2210续上篇介绍了第四个ESB应用,本文介绍第五个ESB应用——Cu ... -
JBoss ESB学习笔记5——第四个ESB应用Hello World File Action
2011-01-08 11:23 2581续上篇介绍了第三个ESB应用,本文介绍第四个ESB应用——He ... -
JBoss ESB学习笔记4——第三个ESB应用Hello World Notification
2011-01-03 15:01 2978续上篇介绍了第二个ESB应用,本文介绍第三个ESB应用——He ... -
JBoss ESB学习笔记2——第一个ESB应用Hello World
2010-12-13 20:34 6515续上文搭建好开发环境后就可以开发ESB应用了。本文介绍第一个E ... -
JBoss ESB学习笔记1——搭建ESB开发环境
2010-12-12 13:55 7702最近由于工作需要用到 ...
相关推荐
3——第二个ESB代码Hello World Action 29 4——第三个ESB代码Hello World Notification 38 5——第四个ESB代码Hello World File Action 45 6——第五个ESB代码Custom Action 51 7——第六个ESB代码Http Gateway 63 ...
JBossESB学习笔记 收集了网上1-16系列教程,笔记详细介绍了JBossESB各个组件的特性及配置文件的说明
Jboss_ESB学习笔记以及总结和实例
Jboss_ESB学习笔记,介绍的很详细,可以作为入门文档来看。
jboss esb 实例及讲解,我收集的资料整理做成书
Jboss_ESB学习笔记.doc
一、Jboss ESB的简介 1、 什么是ESB。 ESB的全称是Enterprise Service Bus,即企业服务总线。ESB是过去消息中间件的发展,ESB采用了“总线”这样一种模式来管理和简化应用之间的集成拓扑结构,以广为接受的开放...
jbossesb开发手册,适合初学者学习使用
JBoss ESB新手指南 / JBoss ESB Beginners Guide。 一本很好的jboss esb入门书籍。
5. 第三章 什么时候使用JBossESB 18 5.1. 介绍 18 6. 第四章 JBossESB 21 6.1. Rosetta 21 6.2. JBossESB的核心 22 6.3. JBossESB的组件 23 6.4. 配置 23 6.5. 消息存储 24 6.6. ESB-aware和ESB-unaware用户 25 6.7....
JBoss ESB 入门例子。主要是一个Server和一个Client。
NULL 博文链接:https://siye1982.iteye.com/blog/592400
ESB应用Hello_World_File_Action
JBOSS_Esb学习资料包含各种基础学习资料与协议交互资料
JBoss ESB Beginner's Guide
1.JBossESB的总体要求和我们应采取的架构方法的纲要。2.JBossESB的主要目的是提供一个部署,运行和管理的SOA基础结构。 3.SOA原则将贯穿于整个架构,而传统意义上ESB可能是它所提供功能的一狭小部分
。。。
中文版,简易介绍 JBOSS ESB的说明文档.
ESB应用Hello_World,有图片
JbossESB开发环境配置.docxJbossESB开发环境配置.docx