`
uule
  • 浏览: 6322776 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

JMS分布式例子

    博客分类:
  • JMS
 
阅读更多

一家大企业 A、B系统间通信

(如银行,假设它有 

客户关系管理(CRM),

客户信息系统(CIS),

证券结算系统,

账户管理系统 等等,

 

客户信息系统 需要发送客户信息给 证券结算系统;

客户信息系统 需要发送客户信息给 账户管理系统 等;

若A系统 发送消息给 B系统,A 理解为 B 的上游系统

),

且A、B系统运行于两个独立的JBoss服务器中,A提供了MQ服务,那么B 需读取上游系统A的MQ信息来获取消息;

 

其实也可以自己根据前面的示例来模拟实现下;

思路:

建立两个JBoss,修改其中一个的端口,

一个模拟A系统,配置了JBossMQ信息;A系统发送一条消息到JBossMQ;

一个模拟B系统,B系统有个MDB来远程访问JBossMQ服务,并把消息打印出来;

 

 

环境: JBoss 5.1,JDK1.6

1、拿一个Jboss,copy一份,分别修改其名称为jboss-5.1.0_Sender、jboss-5.1.0_Receiver

 

修改 jboss-5.1.0_Sender 下的端口(同一机器上,避免冲突,其实也就是两个独立的 AS)

修改%JBOSS_HOME_Sender%\server\default\deploy\jbossweb.sar\server.xml 中的所有端口;

修改%JBOSS_HOME_Sender%\server\default\conf\bindingservice.beans\META-INF\bindings-jboss-beans.xml 中的所有端口;

为了简单快捷,就在端口前加个1,如8080 -> 18080,1099 -> 11099

注意:为防止冲突,需修改全部接口,模拟两个不同的JBOSS

 

 

2. 在 jboss-5.1.0_Sender中,进入%JBOSS_HOME_Sender%\server\default\deploy,新建Sender-service.xml文件

(这里就是配置JBossMQ,集成在JBoss中,这样启动 A 的JBoss 就提供了MQ服务,即构造发送到的目的地址destination)

 

<?xml version="1.0" encoding="utf-8"?>
<server>
	<mbean xmbean-dd="xmdesc/Queue-xmbean.xml" name="jboss.messaging.destination:service=Queue,name=itcastQueue" 				code="org.jboss.jms.server.destination.QueueService">  
		<attribute name="JNDIName">queue/itcastQueue</attribute>  
		<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>  
		<depends>jboss.messaging:service=PostOffice</depends>  
	</mbean>  
</server>

 Queue的name为itcastQueue

 

 

3. 创建Java Project,创建文件QueueSender.java

(这里就是模拟 A 中的系统往 MQ 发送消息,注意classpath加上JBoss的jar文件)

注意:此处注意导入的是jboss中client下的包,而不是其他

Jboss的client下已经有jboss-javaee.jar,不要再额外引入javaee.jar

 

javaee.jar冲突

Absent Code attribute in method that is not native or abstract

https://community.jboss.org/thread/176424?_sscc=t

package com;

import java.util.Properties;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class QueueSender{

	public static void main(String[] args) {
			
		Properties props = new Properties();

		props.setProperty("java.naming.factory.initial",
				"org.jnp.interfaces.NamingContextFactory");

		props.setProperty("java.naming.provider.url", "localhost:11099");

		props.setProperty("java.naming.factory.url.pkgs",
				"org.jboss.naming");

		/**
		 * Context不指定props会报错:
		 * javax.naming.NoInitialContextException: Need to specify class name in environment or system property, 
		 * or as an applet parameter, or in an application resource file:  java.naming.factory.initial
		 */
		try {
			InitialContext ctx = new InitialContext(props);
			QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
			QueueConnection conn = factory.createQueueConnection();
			
			QueueSession session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
			Destination destination = (Destination) ctx.lookup("queue/itcastQueue");
			MessageProducer producer = session.createProducer(destination);

			producer.send(session.createTextMessage("First JMS 消息!"));

			session.close();

			conn.close();
		} catch (NamingException e) {			
			e.printStackTrace();
		} catch (JMSException e) {			
			e.printStackTrace();
		}		
		System.out.println();
		
	}	
	
}

 注意此处的localhost:11099,需跟下面一致

 

企业B(或B系统)

4. 在 jboss-5.1.0_Receiver中,进入%JBOSS_HOME%\server\default\deploy,新建Receiver-service.xml文件

(这里就是 A 提供给 B 的MQ中间件配置信息,B根据A提供的信息配置在自己的JBoss中)

<?xml version="1.0" encoding="utf-8"?>
<server>
	<mbean code="org.jboss.jms.jndi.JMSProviderLoader" name="jboss.mq:service=JMSProviderLoader,name=RemoteJMSProvider,server=remotehost">
        <attribute name="ProviderName">RemoteJMSProvider</attribute>
        <attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute>
        <attribute name="FactoryRef">XAConnectionFactory</attribute>
        <attribute name="QueueFactoryRef">XAConnectionFactory</attribute>
        <attribute name="TopicFactoryRef">XAConnectionFactory</attribute>
        <attribute name="Properties">
            java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
            java.naming.factory.url.pkgs=org.jnp.interfaces
            java.naming.provider.url=localhost:11099
        </attribute>
    </mbean>
</server>

  注意此处的localhost:11099,需跟上面构造InitialContext时的环境一致,上面引用此处

MQ的name为RemoteJMSProvider

 

5.  创建EJB Project,新建MDB

(这里就是当A发送消息到MQ中时,B通过此EJB就能监听收到消息)

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(activationConfig = {
		@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
		@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/itcastQueue"),
		@ActivationConfigProperty(propertyName = "providerAdapterJNDI", propertyValue = "java:/RemoteJMSProvider")
})
public class MDBean implements MessageListener {

	public void onMessage(Message message) {
		TextMessage msg = (TextMessage) message;

		try {
			System.out.println(msg.getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

此处的propertyValue = "java:/RemoteJMSProvider" 

 

6. 打包部署EJB到%JBOSS_HOME_Reveiver%\server\default\deploy

 

7、进入 jboss-5.1.0_Sender下的bin目录,运行run.bat文件,也即启动了A提供的MQ服务器;

(可以http://localhost:18080/jmx-console/查看MQ的JNDI信息) 



 
 

8、进入 jboss-5.1.0_Receiver下的bin目录,运行run.bat文件,也即启动了B的系统来接受消息

(可以http://localhost:8080/jmx-console/查看remote JMS Provider的JNDI配置信息,也就是MQ服务器的JNDI信息) 



 
 

9、直接运行A中的系统QueueSender,发送消息;检查B中JBoss Console

 接收端B JBOSS的Console:



 

 

上面就是一个简单的模拟: A -> MQ -> B

 

 

如果客户端运行在应用服务器内,我们不需要为InitialContext设置应用服务器的上下文信息,也不建议设置。因为应用服务器启动时会把JNDI驱动类等上下文信息添加进系统属性,创建InitialContext对象时如果没有指定Properties参数,InitialContext内部会调用System.getProperty()方法从系统属性里获取必要的上下文信息

 

因此要是在两台机器上测试,不需要修改端口

 

 

 实例参考:http://bbs.51cto.com/thread-965361-1.html

 

  • 大小: 16.6 KB
  • 大小: 73.5 KB
  • 大小: 15.6 KB
  • 大小: 136.8 KB
  • 大小: 129.2 KB
分享到:
评论

相关推荐

    2010-2022年 ESG的同群效应().zip

    ESG是英文 Environmental(环境)、Social(社会)和Governance(治理)的缩写,是关注企业环境、社会、治理绩效的可持续发展理念和价值观。它并非一种新的投资策略,而是一种关注企业非财务绩效的投资理念。 同群效应,顾名思义,是指企业在环境、社会和治理方面会受到同行业、同类型企业的影响。这种影响可能是正向的,也可能是负向的。企业要善于观察和学习同行业、同类型企业的优秀实践经验,同时也要警惕潜在的负面影响,并采取措施规避风险。 相关数据指标 股票代码 、年份、行业代码、行政区划代码、ESG、E、S、G、同行业同群-ESG_均值、同行业同群-ESG_中位数、同省份同群-ESG_均值、同省份同群-ESG_中位数、同行业同群-E_均值、同行业同群-E_中位数、同省份同群-E_均值、同省份同群-E_中位数、同行业同群-S_均值、同行业同群-S_中位数、同省份同群-S_均值、同省份同群-S_中位数、同行业同群-G_均值、同行业同群-G_中位数、同省份同群-G_均值、同省份同群-G_中位数。

    JavaScript中的书签功能以及源代码.zip

    JavaScript中的书签功能以及源代码 项目:JavaScript中的书签功能及源代码 书签是一个简单的项目,使用HTML5、CSS和JavaScript编写。这是一个有趣的项目。这个项目是用来添加你想要标记以便以后访问的不同站点的记录。你可以用适当的名称保存你喜欢的任何站点的书签。该项目使用增删改查操作进行管理系统的操作。 关于系统 这个项目简单地使用了HTML、CSS和JavaScript。用户可以添加许多站点的记录,并且可以使用合适的名称。在这里,用户可以添加数据、在需要的时候删除数据,并且也可以在任何时候访问他们标记的站点。这个项目包括大量的JavaScript,用于对项目的某些部分进行验证。 如何运行项目? 你不需要任何类型的本地服务器来运行这个项目,只需要一个浏览器。我们建议你使用现代化的浏览器如Google Chrome和Mozilla Firefox以获得更好的性能。要执行项目,首先在你的浏览器中打开项目,点击index.html文件。 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

    前端 -后台架构 1.封装API请求 所引用的资源

    引用的资源

    数据中台“咨询平台实施”三位一体方案两份文件.pptx

    数据中台“咨询平台实施”三位一体方案两份文件.pptx

    制造业数字化转型蓝图规划及顶层设计框架两份文件.pptx

    制造业数字化转型蓝图规划及顶层设计框架两份文件.pptx

    java写的纯后台书店项目 - 副本.zip

    该项目是一个基于Java编程语言开发的纯后台书店管理系统。在大二实训课程中,学生在教师的指导下完成了这个项目,旨在帮助新手程序员理解并实践后端开发的基本原理和技巧。通过参与此类项目,开发者可以提升其代码逻辑思维能力,学习如何编写简洁、易于理解的代码,这对于培养良好的编程习惯至关重要。 在Java语言中,后端开发通常涉及到服务器端的数据处理、业务逻辑实现以及与前端交互。在这个书店管理系统的项目中,我们可以预见到以下几个关键知识点: 1. **MVC(Model-View-Controller)设计模式**:MVC是一种常用的软件设计模式,用于将数据模型、用户界面和应用程序控制逻辑分离。在这个项目中,Model代表数据库操作,View代表用户界面(虽然这里是纯后台,但逻辑上仍然存在),Controller负责处理用户请求并调用相应的Model进行数据处理。 2. **JDBC(Java Database Connectivity)**:Jdbc_bookstore这一文件名暗示了项目使用JDBC来连接和操作数据库。JDBC是Java中用于与各种数据库交互的标准API,包括执行SQL语句、处理结果集等。 3. **数据库设计**:项目可能包含了对书籍信息、订单、用户信息等表的设计。这涉及到了关系数据库理论,如ER图(实体关系图)、范式理论(第一范式、第二范式、第三范式等)以及表结构的设计。 4. **Servlet和JSP(JavaServer Pages)**:尽管是纯后台项目,但可能使用了Servlet来处理HTTP请求,并可能使用JSP来生成动态响应。Servlet是Java中的服务器端组件,用于扩展服务器的功能,而JSP则是一种动态网页技术,允许在HTML中嵌入Java代码。 5. **异常处理**:在Java后端开发中,良好的异常处理是必不可少的,它能够确保程序的健壮性。开发者可能会使用try-catch-finally语句块来捕获和处理可能出现的异常。 6. **数据验证和安全**:在处理用户输入时,数据验证是非常重要的,可以防止SQL注入等安全问题。此外,可能还涉及到对敏感信息的加密处理。 7. **单元测试**:为了保证代码质量,开发者可能会使用JUnit或其他测试框架进行单元测试,确保每个功能模块都能正常工作。 8. **版本控制**:项目可能使用了Git等版本控制系统进行版本管理和协作,便于团队成员之间的代码同步和历史记录查询。 9. **构建工具**:可能是通过Maven或Gradle这样的构建工具管理项目依赖,自动化构建和部署过程。 10. **日志记录**:通过Log4j或其他日志框架记录系统运行日志,便于排查问题和性能分析。 这个项目为初学者提供了一个很好的实践平台,可以帮助他们深入了解Java后端开发的核心概念和技术,同时也能提升他们的问题解决和项目管理能力。通过实际操作,新手程序员可以逐步熟悉上述各个知识点,为今后的开发工作打下坚实基础。

    55555555555555555555555555555

    5555555555555

    蒙牛伊利屈臣氏抖音营销方案.pptx

    蒙牛伊利屈臣氏抖音营销方案.pptx

    国联证券-计算机行业专题研究_AI大模型成果不断涌现_AGI或将到来.pdf

    《20240518-国联证券-计算机行业专题研究_AI大模型成果不断涌现_AGI或将到来》报告全面梳理了当前AI大模型技术的最新发展成果,从技术创新、应用落地到市场影响进行了深入剖析。报告指出,随着算法优化、算力提升及数据积累,AI大模型在多个领域取得了突破性进展,预示着通用人工智能(AGI)时代的到来或已不远。报告不仅列举了国内外多家领先企业的成功案例,还探讨了AGI实现的可能路径、面临的挑战以及潜在的社会经济影响,为行业内外人士提供了前瞻性的分析与洞察。

    C语言课程设计-学生学籍管理系统

    源码+报告

    PHP-在校学生成绩管理系统-源码 - 副本.zip

    成绩录入、成绩统计、成绩查询 设置系统信息、单位信息管理、类别管理、网页统计结果显示项目 学期、班级、班主任、学科管理 管理员、权限、角色管理

    安卓手机平板播放器2024最新版.apk

    传错了。请勿通过。

    ROS2-Gazebo模拟包利用Mid360和FASTLIO进行导航

    本项目使用全向移动小车,附加 Livox Mid360 雷达与 IMU,在 RMUC/RMUL 地图进行导航算法仿真,仅需要调整参数即可移植到真实机器人中导航。

    探索Java的幕后英雄:类加载器机制全解析

    Java是一种广泛使用的高级编程语言,由Sun Microsystems公司(现为甲骨文公司的一部分)在1995年发布。Java语言具有以下特点: 1. **跨平台性**:Java的口号是“一次编写,到处运行”(Write Once, Run Anywhere,简称WORA),意味着Java程序可以在任何支持Java虚拟机(JVM)的平台上运行,而无需重新编译。 2. **面向对象**:Java是一种面向对象的编程语言,支持封装、继承和多态等特性。 3. **健壮性**:Java设计时注重安全性和健壮性,提供了垃圾回收机制自动管理内存,减少了内存泄漏和其他内存相关问题。 4. **多线程**:Java内置了对多线程编程的支持,允许开发者创建同时运行的多个线程。 5. **丰富的标准库**:Java拥有一个庞大的标准库,提供了大量预先构建的类和接口,简化了开发过程。 6. **高性能**:虽然Java是一种解释执行的语言,但通过即时编译器(JIT)技术,Java程序可以接近或达到与编译语言相当的性能。 7. **分布式**:Java具有强大的网络能力,支持通过网络进行对象通

    08二十四节气之小满模板.pptx

    08二十四节气之小满模板.pptx

    基于STM32、SHT30和SSD1306的温度计

    基于STM32、SHT30和SSD1306的温度计

    学生成绩管理系统数据库文件

    学生成绩管理系统数据库文件,数据库文件是存储和管理数据的文件,它们在计算机系统中扮演着至关重要的角色。这些文件包含了组织好的数据集合,允许用户进行高效的查询、更新、删除和插入操作。数据库文件通过其结构化的特性,使得数据可以按照一定的逻辑和规则进行存储,从而便于管理和检索。它们通常与数据库管理系统(DBMS)配合使用,后者提供了一套工具和接口,用于操作数据库文件中的数据。数据库文件的类型可能包括关系型数据库的表文件、索引文件、日志文件等,它们共同确保数据的完整性、一致性和安全性。

    奥迪抖音互动视频营销规划两份文档.pptx

    奥迪抖音互动视频营销规划两份文档.pptx

    制造企业智慧物流架构解决方案双份材料.pptx

    制造企业智慧物流架构解决方案双份材料.pptx

    基于规则“SunThu-00:02:00-00:03:00,Mon-16:59:00-20:00:00”时间范围检查(C语言)

    规则: 1、Mon、Tue、Wed...表示一周的某一天; 2、00:02:00-00:03:00表示一天之内的某一时间段; 3、SunThu|00:02:00-00:03:00表示某天(和某天)的某一时间段; 4、SunThu|00:02:00-00:03:00,Mon|16:59:00-20:00:00表示某天(和某天)的某一时间段和表示某天(和某天)的某一时间段,一组内可包括一至七天,一组内只能包括一个时间段。 基于以上规则,使用C语言实现检查当前时间点是否在规则规定的时间段内,使用方式: ./time_range_check "SunThu|00:02:00-00:03:00,Mon|16:59:00-20:00:00,FriSun|00:02:00-23:30:59,Sun|15:59:00-20:00:00" 规则格式正确 当前时间点在规则内

Global site tag (gtag.js) - Google Analytics