一家大企业 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
相关推荐
JMS的例子是学习和理解这一技术的关键,通过实际操作可以深入领会其工作原理和用法。 在“jmstest”这个压缩包中,我们可能找到一个简单的JMS应用实例。通常,这样的例子会包含生产者(Producer)、消费者...
Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的API,主要用于在分布式环境中传递消息,实现应用程序之间的异步通信。这个"JMS开发例子.rar"压缩包文件很可能是包含了一个关于如何...
### 基于JMS的分布式异构数据库间的数据同步 #### 1. 引言 随着企业信息化的快速发展及网络技术在企业内部的应用日益广泛,如何高效且安全地实现不同部门之间数据库的数据同步,成为了现代企业应用系统设计中一个...
本示例“java-jms小例子”旨在演示JMS的基本用法。JMS的核心概念包括消息生产者、消息消费者和消息队列/主题。在这个小例子中,我们将探讨如何创建这两者以及如何利用它们进行通信。 1. **消息生产者**:在JMS中,...
ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它实现了Java消息服务(JMS)标准,用于在分布式系统中高效地传递消息。JMS是一种API,它定义了生产、发送、接收和消费消息的标准接口,使得不同的应用系统...
在本例子中,我们将关注如何使用OpenJMS这一开源JMS实现来搭建服务器并进行消息的发送和接收。首先,你需要从官方网站下载最新版本的OpenJMS,解压缩后在bin目录下运行startup.bat启动服务。这会开启一个新窗口,...
一个具体的例子可能是在电子商务系统中,订单信息以XML格式创建并发送到JMS消息队列,然后由后台服务异步处理,如库存检查、支付验证等,这样可以保证主业务流程的快速响应,而不会因为后台处理的延迟影响用户体验。...
它允许应用程序创建、发送、接收和读取消息,为分布式系统提供了可靠的通信机制。在这个“JMS完全实例”中,我们将深入探讨八个独立的程序,它们覆盖了JMS的多个核心概念和应用场景。 1. **JMS简单收发** JMS的...
总的来说,理解和配置WebLogic中的JMS是Java EE开发者必须掌握的技能之一,它对于构建高可用、高性能的企业级分布式系统至关重要。通过以上步骤,你可以学习如何在WebLogic 8.1环境中设置和使用JMS,而提供的示例将...
JMS是一种标准,用于在分布式环境中传递消息,提供了一种可靠且异步的数据通信方式。在JBOSST中配置和使用JMS,可以实现应用程序间的解耦,提高系统的可扩展性和可靠性。 一、JMS基础知识 1. 概念理解:JMS是Java...
在分布式系统中,JMS允许应用程序进行异步通信,这对于解耦组件、提高系统可扩展性和容错性至关重要。 **JMS教程** 通常涵盖以下几个核心概念: 1. **消息模型**:JMS支持两种消息模型,即点对点(Point-to-Point, ...
JMS提供了一种在分布式环境中可靠地传递信息的方式,使得不同的应用程序之间可以进行异步通信。在JMS中,消息是数据传输的载体,而消息生产者和消费者通过消息中间件(如消息队列或主题)进行通信。 **JMS核心概念*...
描述中的"java消息系统 JMS 学习代码 例子 jar"表明这个压缩包是为了学习JMS而准备的,里面包含了示例代码,便于开发者理解和实践JMS的工作原理。`jar`文件通常用于打包和分发Java类库,这里可能是为了方便导入和...
标题"jms+spring+activeMq的例子serd和recevice"提到了三个关键术语:JMS(Java Message Service)、Spring框架和ActiveMQ。这表明我们将探讨一个结合了这三个技术的示例,其中"serd"可能是"server"的误拼,而...
- JMS(Java Message Service):用于在Java应用之间传递消息,可以实现解耦和异步通信。 - gRPC:基于HTTP/2协议的高性能RPC框架,支持多种语言,包括Java。 7. **应用示例**: - 多用户协作应用:例如文档编辑...
Java消息服务(JMS)是Java平台中用于企业级应用集成的一个标准API,它提供了一种在分布式系统中可靠地传递消息的方式。JMS允许应用程序创建、发送、接收和读取消息,以此来解耦生产者和消费者,使得两者不必同时...
而ActiveMQ作为开源的JMS提供商,提供了一个强大且稳定的中间件,用于在分布式系统中进行异步通信。 首先,我们需要理解JMS的基本概念。JMS是Java平台中定义的一个API,用于创建、发送、接收和读取消息。它允许应用...
它允许应用程序创建、发送、接收和读取消息,有效地支持分布式系统中的解耦和消息传递。OPENJMS是JMS的一个开源实现,提供了一个轻量级的消息中间件,使得开发者可以方便地在Java应用程序之间实现消息交换。 JMS的...