`
uule
  • 浏览: 6323866 次
  • 性别: 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
分享到:
评论

相关推荐

    Jms的例子 不错的例子

    JMS的例子是学习和理解这一技术的关键,通过实际操作可以深入领会其工作原理和用法。 在“jmstest”这个压缩包中,我们可能找到一个简单的JMS应用实例。通常,这样的例子会包含生产者(Producer)、消费者...

    JMS开发例子.rar

    Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的API,主要用于在分布式环境中传递消息,实现应用程序之间的异步通信。这个"JMS开发例子.rar"压缩包文件很可能是包含了一个关于如何...

    java-jms小例子

    本示例“java-jms小例子”旨在演示JMS的基本用法。JMS的核心概念包括消息生产者、消息消费者和消息队列/主题。在这个小例子中,我们将探讨如何创建这两者以及如何利用它们进行通信。 1. **消息生产者**:在JMS中,...

    activeMQ JMS WEB 例子

    ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它实现了Java消息服务(JMS)标准,用于在分布式系统中高效地传递消息。JMS是一种API,它定义了生产、发送、接收和消费消息的标准接口,使得不同的应用系统...

    JMS开发例子.pdf

    在本例子中,我们将关注如何使用OpenJMS这一开源JMS实现来搭建服务器并进行消息的发送和接收。首先,你需要从官方网站下载最新版本的OpenJMS,解压缩后在bin目录下运行startup.bat启动服务。这会开启一个新窗口,...

    JMS开发例子

    `samples`目录下包含了一些基础示例,你可以运行这些例子来了解JMS的基本工作方式。 JMS定义了五种不同类型的的消息,包括MapMessage、ObjectMessage、StreamMessage、TextMessage和BytesMessage。其中,...

    JMS和XML的分布式应用研究.pdf

    一个具体的例子可能是在电子商务系统中,订单信息以XML格式创建并发送到JMS消息队列,然后由后台服务异步处理,如库存检查、支付验证等,这样可以保证主业务流程的快速响应,而不会因为后台处理的延迟影响用户体验。...

    JMS完全实例(八个实例)

    它允许应用程序创建、发送、接收和读取消息,为分布式系统提供了可靠的通信机制。在这个“JMS完全实例”中,我们将深入探讨八个独立的程序,它们覆盖了JMS的多个核心概念和应用场景。 1. **JMS简单收发** JMS的...

    WebLogic下配置的JMS.+例子

    总的来说,理解和配置WebLogic中的JMS是Java EE开发者必须掌握的技能之一,它对于构建高可用、高性能的企业级分布式系统至关重要。通过以上步骤,你可以学习如何在WebLogic 8.1环境中设置和使用JMS,而提供的示例将...

    JBOSS建立JMS应用实例

    JMS是一种标准,用于在分布式环境中传递消息,提供了一种可靠且异步的数据通信方式。在JBOSST中配置和使用JMS,可以实现应用程序间的解耦,提高系统的可扩展性和可靠性。 一、JMS基础知识 1. 概念理解:JMS是Java...

    JMS相关,教程,例子,学习笔记

    在分布式系统中,JMS允许应用程序进行异步通信,这对于解耦组件、提高系统可扩展性和容错性至关重要。 **JMS教程** 通常涵盖以下几个核心概念: 1. **消息模型**:JMS支持两种消息模型,即点对点(Point-to-Point, ...

    JMS简单示例1

    JMS提供了一种在分布式环境中可靠地传递信息的方式,使得不同的应用程序之间可以进行异步通信。在JMS中,消息是数据传输的载体,而消息生产者和消费者通过消息中间件(如消息队列或主题)进行通信。 **JMS核心概念*...

    jms.rar_jar j_java jms_jms_jms jar_jms.j

    描述中的"java消息系统 JMS 学习代码 例子 jar"表明这个压缩包是为了学习JMS而准备的,里面包含了示例代码,便于开发者理解和实践JMS的工作原理。`jar`文件通常用于打包和分发Java类库,这里可能是为了方便导入和...

    jms+sping+activeMq的例子serd和recevice

    标题"jms+spring+activeMq的例子serd和recevice"提到了三个关键术语:JMS(Java Message Service)、Spring框架和ActiveMQ。这表明我们将探讨一个结合了这三个技术的示例,其中"serd"可能是"server"的误拼,而...

    采用RMI分布式方式实现的java例子

    - JMS(Java Message Service):用于在Java应用之间传递消息,可以实现解耦和异步通信。 - gRPC:基于HTTP/2协议的高性能RPC框架,支持多种语言,包括Java。 7. **应用示例**: - 多用户协作应用:例如文档编辑...

    SpringBoot使用JMS的小例子(ActiveMQ实现)

    而ActiveMQ作为开源的JMS提供商,提供了一个强大且稳定的中间件,用于在分布式系统中进行异步通信。 首先,我们需要理解JMS的基本概念。JMS是Java平台中定义的一个API,用于创建、发送、接收和读取消息。它允许应用...

    JMS OPENJMS的实现例子

    它允许应用程序创建、发送、接收和读取消息,有效地支持分布式系统中的解耦和消息传递。OPENJMS是JMS的一个开源实现,提供了一个轻量级的消息中间件,使得开发者可以方便地在Java应用程序之间实现消息交换。 JMS的...

    分布式JAVA应用基础与实践(林昊)完整版pad+源码

    在Java中,分布式计算通常涉及到RMI(远程方法调用)、JMS(Java消息服务)以及EJB(企业级Java Bean)等技术。 其次,书中可能涉及了Java在分布式环境中的核心特性,如JNDI(Java命名和目录接口),它为分布式系统...

    Spring发送接收JMS消息

    在Java世界中,Java Message Service (JMS) 是一个标准接口,用于在分布式环境中发送和接收消息。Spring框架提供了一种简单而强大的方式来集成JMS,使得开发者可以轻松地在应用中实现异步通信和解耦。本篇文章将深入...

Global site tag (gtag.js) - Google Analytics