`
zc985552943
  • 浏览: 291017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Babe4ca6-5e6f-33aa-9078-762ee3ccfb7e
云计算--hadoop
浏览量:11866
5e98c2c1-2a82-3388-bc80-7fca0170bb12
redis解说
浏览量:27148
088014c7-4d3f-39ce-b72e-4ebe7046a134
MongoDB读书笔记
浏览量:16007
D2b74847-c860-3e26-96fe-3fa4498d6348
Maven读书笔记
浏览量:27236
688db20f-402d-3a1d-8188-d6153d6c7465
Java通信
浏览量:13678
社区版块
存档分类
最新评论

05_Java通信_JMS_demo

 
阅读更多

上节简单描述了一下JMS的概念,这节来写个小demo。这样可以比较直观的看到JMS通信的过程。

前期回顾:04_Java通信_JMS概念

在开发这个demo前,首先要下载ActiveMQ来作为消息服务器。

Demo实现功能



 这是我们要实现的一个发布/订阅模型的demo

A发送消息到消息服务器ActiveMQ,然后ActiveMQ将消息发给订阅这个Topic的客户端:A和B

开发流程:

1.要开发一个jms demo首先要下载某厂商的JMS的实现
2.下载ActiveMQ,这是Apache的一个开源MQ系统

下载地址:http://activemq.apache.org/download.html

 

下载历史版本:http://activemq.apache.org/download-archives.html



 3.下载后直接解压

我们开发一个demo直接可以使用这个activemq-all-5.2.0.jar这个jar包

4.还需要jms的jar包:
如果使用Maven,可以使用下面的依赖:

<dependency>
	<groupId>javax.jms</groupId>
	<artifactId>jms</artifactId>
	<version>1.1</version>
</dependency>

 

5.开发一个简单的聊天demo,就想上面那张聊天图一样

package com.jms.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Chat implements javax.jms.MessageListener {
	private TopicSession pubSession;
	private TopicPublisher publisher;
	private TopicConnection conntection;
	private String username;
	
	public Chat(String topicFactory,String topicName,String username) throws Exception{
//		System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
//		System.setProperty(Context.PROVIDER_URL, "tcp://localhost:61616");
//		
		//使用JNDI获得ConnectionFactory
		InitialContext ctx = new InitialContext();
		TopicConnectionFactory conFactory = (TopicConnectionFactory)ctx.lookup(topicFactory);
		
		//通过ConnectionFactory得到Connection
		TopicConnection connection = conFactory.createTopicConnection();
		
		//得到session
		TopicSession pubSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
		TopicSession subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
		
		//使用JNDI查找主题Topic
		Topic chatTopic = (Topic)ctx.lookup(topicName);
		
		//通过session和主题Topic获得发布者,订阅者
		TopicPublisher publisher = pubSession.createPublisher(chatTopic);
		TopicSubscriber subscriber = subSession.createSubscriber(chatTopic);
		
		subscriber.setMessageListener(this);
		this.conntection = connection;
		this.pubSession = pubSession;
		this.publisher = publisher;
		this.username = username;
		
		conntection.start();
	}
	@Override
public void onMessage(Message m) {
	try {
//		m.set
		TextMessage tm = (TextMessage)m;
		System.out.println(tm.getText());
	} catch (JMSException e) {
		e.printStackTrace();
	}
	
}
	
	protected void writeMessage(String text) throws Exception{
		TextMessage message = pubSession.createTextMessage();
		message.setText(username+": "+text);
		//消息发送者,发送消息
		publisher.publish(message);
	}
	
	public void close() throws Exception{
		conntection.close();
	}
	
	public static void main(String[] args) throws Exception {
		
		Chat chat = new Chat("TopicCF","topic1","hh");
		
		BufferedReader commandLine = new BufferedReader(new InputStreamReader(System.in));
		
		while(true){
			String s = commandLine.readLine();
			if(s.equalsIgnoreCase("exit")){
				chat.close();
				System.exit(0);
			}else{
				chat.writeMessage(s);
			}
		}
		
	}
}

 

6.配置文件:

java.naming.factory.initial =org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url =tcp://localhost:61616
java.naming.security.principal =system
java.naming.security.credentials =manager
connectionFactoryNames =TopicCF
topic.topic1 =jms.topic1

 7.客户端B:

package com.jms.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ChatA {
	public static void main(String[] args) throws Exception {

		Chat chat = new Chat("TopicCF","topic1","cc");
		
		BufferedReader commandLine = new BufferedReader(new InputStreamReader(System.in));
		
		while(true){
			String s = commandLine.readLine();
			if(s.equalsIgnoreCase("exit")){
				chat.close();
				System.exit(0);
			}else{
				chat.writeMessage(s);
			}
		}
		
	}
}

 

8.如何运行代码:

启动消息服务器ActiveMQ

进入ActiveMQ的bin目录


双击运行:activemq.bat
查看是否启动成功:cmd-->netstat -na|find "61616"
出现:


则启动成功。还可以登陆

admin:http://127.0.0.1:8161/admin/

demo:http://127.0.0.1:8161/demo/

查看。
将配置文件jndi.properties放在classes的根目录。

项目目录结构:



 

代码难点分析:

1.在前面已经介绍过JNDI。我们可以通过JNDI来获取通信对象。
JMS客户端使用一个目录服务(JNDI)来访问ConnectionFactory和Destination(主题和队列)对象。也就是说这两个对象JMS API无法获得。在这一点上,它和连接,会话,生产者,消费者及消息不同。连接,会话,生产者,消费者及消息都是JMS API内部使用工厂模式生产的JNDI为了获得ConnectionFactory和Destination对象提供了一种方便、位置透明、可配置并且可移植的机制,这些对象也称为JMS受管对象,因为它是由系统管理员建立和配置的

2.线程和会话
在程序中创建了两个topicSession:pubSession,subSession。
为什么要创建两个呢,因为JMS规定一个session不能同时在一个以上的线程中运行。
这个例子中有两个线程:
运行writeMessage的主线程(线程所有者:chat应用程序)
运行onMessage的处理线程(线程所有者是JMS提供者所有,即:ActionMQ)

  • 大小: 111.6 KB
  • 大小: 41.6 KB
  • 大小: 5.6 KB
  • 大小: 31.9 KB
  • 大小: 15.7 KB
  • 大小: 25.5 KB
  • 大小: 44.5 KB
  • 大小: 40.8 KB
1
1
分享到:
评论

相关推荐

    Efs_Demo_Java.rar_DEMO_Ext 3.0 de_efs

    【标题】"Efs_Demo_Java.rar_DEMO_Ext 3.0 de_efs" 指示了一个Java相关的示例项目,其中包含了EXT 3.0框架的使用,特别是与Efs(可能指的是某种文件系统或存储解决方案)相关的功能。这个压缩包可能是一个演示程序,...

    rmi-demo.zip_DEMO_Java RMI_rmi

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java...在实际项目中,可能需要结合其他技术,如JMS(Java Message Service)或Web服务来增强功能和健壮性。

    JMS.zip_DEMO_activemq

    ActiveMQ 是一个开源的消息中间件,它是 Java Message Service(JMS)的实现,遵循开放标准,支持多种协议,包括 OpenWire、AMQP、STOMP、XMPP 和 MQTT。这个 `JMS.zip_DEMO_activemq` 压缩包包含了 ActiveMQ 的一个...

    jbpm.rar_jBPM User Guide chm_java 工作流_jbpm_jbpm-demo_工作流引擎

    jBPM可以轻松地与各种Java应用框架(如Spring、Hibernate)以及企业级系统(如EJB、JMS)集成,实现业务流程与应用程序的无缝衔接。 六、工作流引擎 jBPM的工作流引擎负责解析流程定义,执行流程实例,并管理流程中...

    JMS demo 及 资料

    Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的标准化接口,它允许应用程序创建、发送、接收和读取消息。JMS被设计用来在分布式环境中传递可靠的数据,使得不同系统之间可以进行...

    JMS_DEMO

    《JMS_DEMO——深入理解Java消息服务》 在IT领域,Java消息服务(Java Message Service,简称JMS)是一个标准接口,它允许应用程序创建、发送、接收和读取消息。JMS_DEMO是一个用于演示JMS实际应用的实例,通过这个...

    Jms做的一些的demo

    **Java消息服务(Java Message Service,JMS)**是一种在分布式系统中用于应用程序间异步通信的标准接口。它允许应用程序创建、发送、接收和读取消息。在Java中,JMS通常用于解耦生产者(消息发送方)和消费者(消息...

    esper和jms做的小demo

    JMS,即Java Message Service,是一个Java平台的标准,用于在分布式环境中传递消息。它提供了一种可靠且异步的方式来通信,使得应用程序可以解耦发送和接收消息的过程。在温度控制系统中,JMS可能被用作传感器数据的...

    mq_demo(java).zip

    在这个“mq_demo(java).zip”压缩包中,我们预计会找到一些使用Java语言开发的IBM MQ测试案例和相关的文档教程,这对于理解和实践IBM MQ在Java环境中的应用非常有帮助。 IBM MQ的核心概念是消息队列,它允许应用...

    java MqDemo

    Java MQDemo是一个基于Java实现的消息队列(Message Queue)演示项目,它主要用于展示如何在Java应用程序中使用消息队列技术。消息队列是一种中间件,它允许不同组件之间异步通信,通过解耦发送者和接收者来提高系统...

    demo.zip_DEMO

    Java消息服务(JMS)则是另一种数据传递机制,主要用于应用程序之间的异步通信。它提供了一种标准的API,允许开发者发送和接收消息。JMS支持两种消息模型:点对点(Point-to-Point)和发布/订阅(Publish/Subscribe...

    JMS Api Demo

    Java消息服务(Java Message Service,简称JMS)是Java平台中用于在分布式环境中交换异步消息的标准API。它允许应用程序创建、发送、接收和读取消息,提供了在分布式系统间可靠且高效的数据通信。JMS API 的核心概念...

    JMS 简单demo

    JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的...

    Weblogic提供JMS服务Demo

    Weblogic服务器是一款由Oracle公司开发的企业级应用服务器,它提供了丰富的功能和服务,其中包括Java消息服务(JMS,Java Message Service)。JMS是一种标准接口,允许应用程序创建、发送、接收和读取消息。在这个...

    activemq_demo,activeMQ的简单demo

    【标题】"activemq_demo,activeMQ的简单demo"涉及的是Apache ActiveMQ的实践应用,这是一款开源的消息中间件,广泛应用于分布式系统中的异步通信。ActiveMQ提供了多种消息协议的支持,包括开放消息中间件协议...

    AcriveMQ与java的demo使用

    - **JMS介绍**:首先,了解JMS(Java Message Service)是必要的,它是Java平台上的一个标准接口,用于在分布式环境中进行异步通信。ActiveMQ就是JMS的一个实现。 - **消息模型**:ActiveMQ支持多种消息模式,包括...

    Article_demo.zip_Web服务器_Java_

    【标题】"Article_demo.zip" 是一个压缩包文件,它主要关注的是Web服务器与Java相关的技术。在IT领域,Web服务器是用于托管Web应用程序并处理HTTP请求的重要组件,而Java是一种广泛使用的编程语言,尤其在构建后端...

    JMS的一个非常好的demo

    通过这个demo,你可以学习到如何在实际应用中使用JMS来构建可靠的消息传递系统,理解不同通信模式的优缺点,以及如何配置和管理消息的传输特性。此外,这个demo也可以帮助你更好地理解和掌握Java中的并发编程和...

    java RMI简单Demo

    Java RMI的使用有助于构建可扩展、模块化的分布式系统,但需要注意的是,它并不适合所有场景,特别是在高并发和大流量的情况下,可能需要考虑其他更高效的通信机制,如RMI的替代品如Java的JMS(Java Message Service...

Global site tag (gtag.js) - Google Analytics