上节简单描述了一下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)
相关推荐
【标题】"Efs_Demo_Java.rar_DEMO_Ext 3.0 de_efs" 指示了一个Java相关的示例项目,其中包含了EXT 3.0框架的使用,特别是与Efs(可能指的是某种文件系统或存储解决方案)相关的功能。这个压缩包可能是一个演示程序,...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java...在实际项目中,可能需要结合其他技术,如JMS(Java Message Service)或Web服务来增强功能和健壮性。
ActiveMQ 是一个开源的消息中间件,它是 Java Message Service(JMS)的实现,遵循开放标准,支持多种协议,包括 OpenWire、AMQP、STOMP、XMPP 和 MQTT。这个 `JMS.zip_DEMO_activemq` 压缩包包含了 ActiveMQ 的一个...
jBPM可以轻松地与各种Java应用框架(如Spring、Hibernate)以及企业级系统(如EJB、JMS)集成,实现业务流程与应用程序的无缝衔接。 六、工作流引擎 jBPM的工作流引擎负责解析流程定义,执行流程实例,并管理流程中...
Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用集成的标准化接口,它允许应用程序创建、发送、接收和读取消息。JMS被设计用来在分布式环境中传递可靠的数据,使得不同系统之间可以进行...
《JMS_DEMO——深入理解Java消息服务》 在IT领域,Java消息服务(Java Message Service,简称JMS)是一个标准接口,它允许应用程序创建、发送、接收和读取消息。JMS_DEMO是一个用于演示JMS实际应用的实例,通过这个...
**Java消息服务(Java Message Service,JMS)**是一种在分布式系统中用于应用程序间异步通信的标准接口。它允许应用程序创建、发送、接收和读取消息。在Java中,JMS通常用于解耦生产者(消息发送方)和消费者(消息...
JMS,即Java Message Service,是一个Java平台的标准,用于在分布式环境中传递消息。它提供了一种可靠且异步的方式来通信,使得应用程序可以解耦发送和接收消息的过程。在温度控制系统中,JMS可能被用作传感器数据的...
在这个“mq_demo(java).zip”压缩包中,我们预计会找到一些使用Java语言开发的IBM MQ测试案例和相关的文档教程,这对于理解和实践IBM MQ在Java环境中的应用非常有帮助。 IBM MQ的核心概念是消息队列,它允许应用...
Java MQDemo是一个基于Java实现的消息队列(Message Queue)演示项目,它主要用于展示如何在Java应用程序中使用消息队列技术。消息队列是一种中间件,它允许不同组件之间异步通信,通过解耦发送者和接收者来提高系统...
Java消息服务(JMS)则是另一种数据传递机制,主要用于应用程序之间的异步通信。它提供了一种标准的API,允许开发者发送和接收消息。JMS支持两种消息模型:点对点(Point-to-Point)和发布/订阅(Publish/Subscribe...
Java消息服务(Java Message Service,简称JMS)是Java平台中用于在分布式环境中交换异步消息的标准API。它允许应用程序创建、发送、接收和读取消息,提供了在分布式系统间可靠且高效的数据通信。JMS API 的核心概念...
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的...
Weblogic服务器是一款由Oracle公司开发的企业级应用服务器,它提供了丰富的功能和服务,其中包括Java消息服务(JMS,Java Message Service)。JMS是一种标准接口,允许应用程序创建、发送、接收和读取消息。在这个...
【标题】"activemq_demo,activeMQ的简单demo"涉及的是Apache ActiveMQ的实践应用,这是一款开源的消息中间件,广泛应用于分布式系统中的异步通信。ActiveMQ提供了多种消息协议的支持,包括开放消息中间件协议...
- **JMS介绍**:首先,了解JMS(Java Message Service)是必要的,它是Java平台上的一个标准接口,用于在分布式环境中进行异步通信。ActiveMQ就是JMS的一个实现。 - **消息模型**:ActiveMQ支持多种消息模式,包括...
【标题】"Article_demo.zip" 是一个压缩包文件,它主要关注的是Web服务器与Java相关的技术。在IT领域,Web服务器是用于托管Web应用程序并处理HTTP请求的重要组件,而Java是一种广泛使用的编程语言,尤其在构建后端...
通过这个demo,你可以学习到如何在实际应用中使用JMS来构建可靠的消息传递系统,理解不同通信模式的优缺点,以及如何配置和管理消息的传输特性。此外,这个demo也可以帮助你更好地理解和掌握Java中的并发编程和...
Java RMI的使用有助于构建可扩展、模块化的分布式系统,但需要注意的是,它并不适合所有场景,特别是在高并发和大流量的情况下,可能需要考虑其他更高效的通信机制,如RMI的替代品如Java的JMS(Java Message Service...