`
yarafa
  • 浏览: 88638 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JBoss ESB学习笔记11——第十个ESB应用Message Filters

阅读更多

续上篇介绍了第九个ESB应用,本文介绍第十个ESB应用——Message Filters。

 

说明:本文及后续文章虽非百分百的原创,但毕竟包含本人的努力和付出,所以希望大家转载时务请注明出处:http://yarafa.iteye.com,谢谢合作。

 

 

1 概述
本实例主要演示了如何设置基于内容的过滤器。这里通过客户端发送Order对象到ESB,在处理消息之前,过滤器将根据Order对象的quantity属性进行过滤,当该属性的值大于10时,消息将被传送到NextService服务进行处理,否则,该消息将会被过滤掉不做任何处理。

 

2 新建ESB工程
操作过程略。

 

3 ESB配置
3.1 创建消息队列和消息主题

<?xml version="1.0" encoding="UTF-8"?>
<server>
	<mbean code="org.jboss.jms.server.destination.QueueService"		name="jboss.esb.quickstart.destination:service=Queue,name=messagefilterRequestEsb" 	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=messagefilterRequestGw" 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=messagefilterNextRequestEsb" 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,并定义3个消息通道,内容如下:

<jms-provider connection-factory="ConnectionFactory"
name="JBossMessaging">
	<jms-bus busid="gwChanel">
		<jms-message-filter dest-name="queue/messagefilterRequestGw"
			dest-type="QUEUE" />
	</jms-bus>
	<jms-bus busid="esbChanel">
		<jms-message-filter dest-name="queue/messagefilterRequestEsb"
			dest-type="QUEUE" />
	</jms-bus>
	<jms-bus busid="nextEsbChanel">
		<jms-message-filter dest-type="QUEUE"
dest-name="queue/messagefilterNextRequestEsb" />
	</jms-bus>
</jms-provider>

 

3.3 定义第一个Service

<service category="MessageFilter" description="Message Filter"
name="MessageFilterService">
	<listeners />
	<actions mep="OneWay">
		<action />
	</actions>
</service>

 

3.3.1 定义Listener

<listeners>
	<jms-listener busidref="gwChanel" is-gateway="true"
		name="gwListener" />
	<jms-listener busidref="esbChanel" name="esbListener" />
</listeners>

 

3.3.2 定义Action

<actions mep="OneWay">
	<action class="org.jboss.soa.esb.actions.MessageFilter"
name="MessageFilter">
		<property name="ruleSet" value="FilterRules.drl" />
		<property name="ruleReload" value="true" />
		<property name="destinations">
			<route-to destination-name="DemoDestination"
				service-category="Test" service-name="NextService" />
		</property>
		<property name="object-paths">
			<object-path
esb="body.'org.jboss.soa.esb.message.defaultEntry'" />
		</property>
	</action>
</actions>

配置说明:这里定义了一个消息过滤器,过滤规则在文件FilterRules.drl中进行定义。当满足规则的消息到来时,将会通过过滤器而被传送到NextService服务进行处理,否则,消息将会被直接过滤掉而不做任何处理。

 

3.3.3 定义过滤规则
在src目录下创建FilterRules.drl文件,并定义如下规则脚本:

#created on: Oct 30, 2006
package com.jboss.soa.esb.routing.cbr

#list any import classes here.
import org.jboss.soa.esb.message.Message;
import org.jboss.soa.esb.message.format.MessageType;
import com.thu.afa.esb.jbossesb.client.bean.Order;

#declare any global variables here
global java.util.List destinations;

rule "Pricing Rule - over threshold"
	
	when
	    m     : Message ()
		order : Order( quantity >= 10)
	then
		System.out.println(order.getQuantity() + " Makes the threshold");
		#we can modify the object
		order.setDiscount(10);
		#demonstrate that we can add a new object to the message
		m.getBody().add("DiscountObject","10%");
		destinations.add("DemoDestination");
end
		
rule "Pricing Rule - under threshold"

	#adding this for debug output, the important part is to *NOT* set a destination
	when
	    m     : Message ()
		order : Order( quantity < 10)
	then
		System.out.println(order.getQuantity() + " Does not make the threshold");
		order.setDiscount(0);
end

 

3.3.4 定义Order类

package com.thu.afa.esb.jbossesb.client.bean;

import java.io.Serializable;
import java.math.BigDecimal;

public class Order implements Serializable
{
    private static final long serialVersionUID = 1L;
    private int quantity;
    private BigDecimal unitPrice;
    private double discount;
    private BigDecimal totalPrice;
    
    // setters and getters
}

 

3.5 定义第二个Service

<service category="Test" description="Demo Destination"
name="NextService">
	<listeners>
		<jms-listener busidref="nextEsbChanel" name="esbChanel" />
	</listeners>
	<actions mep="OneWay">
		<action class="org.jboss.soa.esb.actions.Notifier"
name="notificationAction">
			<property name="okMethod" value="notifyOK" />
			<property name="destinations">
				<NotificationList type="OK">
					<target class="NotifyConsole" />
				</NotificationList>
			</property>
		</action>
	</actions>
</service>

 

3.6 配置部署文件
部署依赖文件deployment.xml内容如下:

<jbossesb-deployment>
	<depends>jboss.esb:deployment=jbrules.esb</depends>
	<depends>jboss.esb.quickstart.destination:service=Queue,name=messagefilterRequestEsb
	</depends>
	<depends>jboss.esb.quickstart.destination:service=Queue,name=messagefilterRequestGw
	</depends>
	<depends>jboss.esb.quickstart.destination:service=Queue,name=messagefilterNextRequestEsb
	</depends>
</jbossesb-deployment>

 

3.7 部署ESB
将整个工程导出成一个ESB文件,并保存至JBoss ESB Server的部署目录下,启动JBoss ESB Server即可

4 ESB客户端
4.1 新建Java工程

这里略去操作过程以及添加所需要的Jar包,具体操作过程可参考第一个ESB实例说明。

4.2 发送消息的客户端

/***********************************************************************
 * <p>Project Name: helloworldclient</p>
 * <p>File Name: com.thu.afa.esb.jbossesb.client.MessageFilterClient.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.client;

import java.io.Serializable;
import java.util.Properties;

import javax.jms.ObjectMessage;
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;

import com.thu.afa.esb.jbossesb.client.bean.Order;

/**
 * <p>Class Name: MessageFilterClient</p>
 * <p>Description: </p>
 * @author Afa
 * @date 2010-9-14
 * @version 1.0
 */
public class MessageFilterClient
{
	private QueueConnection connection;
	private QueueSession session;
	private Queue queue;
	
	public void setupConnection() throws Exception
	{
		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/messagefilterRequestGw");
		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 sendAMessage(Serializable object) throws Exception
	{
		QueueSender sender = session.createSender(queue);
		ObjectMessage message = session.createObjectMessage(object);
		sender.send(message);
		sender.close();
	}

	/**
	 * <p>Title: </p>
	 * <p>Method Name: main</p>
	 * <p>Description: </p>
	 * @author: Afa
	 * @date: 2010-9-14
	 * @param args
	 */
	public static void main(String[] args) throws Exception
	{
		Order order = new Order();
		order.setQuantity(5);
		MessageFilterClient client = new MessageFilterClient();
		client.setupConnection();
		client.sendAMessage(order);
		client.stop();
	}

}

 

运行客户端程序即可看到以下输出结果,下图是分别将quantity属性设置为15和5的输出结果。

JBoss ESB  

 

4.3 注意事项
在客户端和服务端的classpath中都必须能找到Order类,其中,类名和包路径也都必须完全一致,而且需要与规则文件中的导入信息保持一致,否则,将会出现如下异常:
No ClassLoaders found for: com.thu.afa.esb.jbossesb.client.bean.Order

 

-----------------------------------------------------
Stay Hungry, Stay Foolish!
http://yarafa.iteye.com
Afa
Mar 29th, 2011
-----------------------------------------------------

 

分享到:
评论
1 楼 apollo211 2012-11-28  
需添加jbossesb-jbrules.jar包

相关推荐

    JBOSS_Esb学习资料

    5. **消息过滤**:《JBoss_ESB学习笔记11——第十个ESB应用Message_Filters.doc》介绍了消息过滤器,它是控制服务间通信流程的重要工具,用于对传递的消息进行预处理或后处理,确保消息符合预期格式或满足特定条件。...

    JBoss ESB 学习笔记

    #### 十一、第十个ESB应用Message Filters - **重点**:探索如何使用Message Filters过滤消息。 - **实现**:配置Filter规则,筛选符合条件的消息进行处理。 #### 十二、第十一个ESB应用Spring Hello World - **...

    ysoserial-master.zip

    ysoserial是一个用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具。它包含一系列在常见Java库中发现的"gadget chains",可以在特定条件下利用执行不安全的反序列化操作的Java应用程序。ysoserial项目最初在2015年AppSecCali会议上提出,包含针对Apache Commons Collections(3.x和4.x版本)、Spring Beans/Core(4.x版本)和Groovy(2.3.x版本)的利用链

    zigbee CC2530无线自组网协议栈系统代码实现协调器与终端的TI Sensor实验和Monitor使用.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。

    YOLO算法-自卸卡车-挖掘机-轮式装载机数据集-2644张图像带标签-自卸卡车-挖掘机-轮式装载机.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    Oracle10gDBA学习手册中文PDF清晰版最新版本

    **Oracle 10g DBA学习手册:安装Oracle和构建数据库** **目的:** 本章节旨在指导您完成Oracle数据库软件的安装和数据库的创建。您将通过Oracle Universal Installer (OUI)了解软件安装过程,并学习如何利用Database Configuration Assistant (DBCA)创建附加数据库。 **主题概览:** 1. 利用Oracle Universal Installer (OUI)安装软件 2. 利用Database Configuration Assistant (DBCA)创建数据库 **第2章:Oracle软件的安装与数据库构建** **Oracle Universal Installer (OUI)的运用:** Oracle Universal Installer (OUI)是一个图形用户界面(GUI)工具,它允许您查看、安装和卸载机器上的Oracle软件。通过OUI,您可以轻松地管理Oracle软件的安装和维护。 **安装步骤:** 以下是使用OUI安装Oracle软件并创建数据库的具体步骤:

    消防验收过程服务--现场记录表.doc

    消防验收过程服务--现场记录表.doc

    (4655036)数据库 管理与应用 期末考试题 数据库试题

    数据库管理\09-10年第1学期数据库期末考试试卷A(改卷参考).doc。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    YOLO算法-瓶纸盒合并数据集-3161张图像带标签-纸张-纸箱-瓶子.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    职业暴露后的处理流程.docx

    职业暴露后的处理流程.docx

    Java Web开发短消息系统

    Java Web开发短消息系统

    java毕设项目之ssm基于java和mysql的多角色学生管理系统+jsp(完整前后端+说明文档+mysql+lw).zip

    项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    批量导出多项目核心目录工具

    这是一款可以配置过滤目录及过滤的文件后缀的工具,并且支持多个项目同时输出导出,并过滤指定不需要导出的目录及文件后缀。 导出后将会保留原有的路径,并在新的文件夹中体现。

    【图像压缩】基于matlab GUI DCT图像压缩(含MAX MED MIN NONE)【含Matlab源码 9946期】.zip

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    YOLO算法-挖掘机与火焰数据集-7735张图像带标签-挖掘机.zip

    YOLO算法-挖掘机与火焰数据集-7735张图像带标签-挖掘机.zip

    操作系统实验 Ucore lab5

    操作系统实验 Ucore lab5

    IMG_5950.jpg

    IMG_5950.jpg

    竞选报价评分表.docx

    竞选报价评分表.docx

    java系统,mysql、springboot等框架

    java系统,mysql、springboot等框架

    zigbee CC2530网关+4节点无线通讯实现温湿度、光敏、LED、继电器等传感节点数据的采集上传,网关通过ESP8266上传远程服务器及下发控制.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。

Global site tag (gtag.js) - Google Analytics