学习中的一些心得记录
p2p方式:
概念:queue,QueueSender,QueueReceiver,队列,消息发送者,消息接收者三个角色。发送者向队列中加入消息,接收者从队列取出消息,队列中的消息接收一条少一条,如果有多个接收者连接到队列,一条消息只能被一个接收者取走。
一、
消息发送方式默认不设置的时候是 DeliveryMode.PERSISTENT
方式,也就是持久化方式。该常量值为2。这种方式消息不会丢失,会保存在服务器上。就是说消息发送后,即使你关闭jms服务器(比如用activeMQ,
关闭服务器程序),然后服务重新启动后,这条消息仍然是存在的,而其他使用NON_PERSISTENT方式的消息就丢失了。我想大多数情况下啊我们需要
的是PERSISTENT方式吧!
DeliveryMode.NON_PERSISTENT 常量值为1
DeliveryMode.PERSISTENT 常量值为2
int a = msgp0.getDeliveryMode();
//msgp0.setDeliveryMode(DeliveryMode.PERSISTENT);
二、消息的消费者接收消息可以采用两种方式:
1、consumer.receive() 或 consumer.receive(int timeout);
2、注册一个MessageListener。
采用第一种方式,即同步方式,遇到receive方法就会阻塞,消息的接收者会一直等待下去,直到有消息到达,或者超时。该方式调用一次方法只接收一条消息。
采用第二种方式,即异步方式,程序会一直监听,只要有消息就会响应onMessage方法,当执行
conn.close()方法时会结束监听器。
MessageConsumer comsumer
=
session.createConsumer(queue);
comsumer.setMessageListener(
new
MessageListener(){
@Override
public
void
onMessage(Message m) {
TextMessage textMsg
=
(TextMessage) m;
try
{
System.out.println(textMsg.getText());
}
catch
(JMSException e) {
e.printStackTrace();
}
}
});
测试发现
conn.close()
方法对这两种方式有些不同,对于监听器方式,只要close方法执行,监听就会终止,估计监听是以后台线程方式执行的。而对于recive接收方式,只要
receive方法只要调用一次,就必须等到有消息到达才会执行下面的语句,是阻塞的方式,即使后面的conn.close()不会执行到。
参考:http://www.cnblogs.com/iloveu/archive/2009/06/10/1500714.html
pub/sub方式
:
概念:topic,publisher,subscriber,主题,发布者,订阅者三个角色。主题和订阅者是一对多关系,一个主题可以被多个订阅者订阅。当发布者向某个主题发送一条消息时,所有的订阅者都会收到。
如何理解订阅的概念呢,个人理解,分两种情况:
一、
创建一个订阅者时使用session.createDurableSubscriber(topic, clientId
)方法创建为持久型订阅者时,该topic和clientId的订阅关系将被保存在服务器上,即产生了订阅关系。这样clientId这个id的订阅者将
在离线的时候,也不会丢失消息。这个订阅关系也可以理解为被持久化在jms服务器上了,使用jmx的监视控制台(我使用的activeMq),可以看到有
一个Subscription的节点,下面有你订阅主题时给定的客户端名字。可以使用unsubscribe
方法
取消订阅关系。
二、
创建一个非持久化方式的订阅者时,只有在客户端订阅者连接到jms服务器时,订阅关系成立,订阅者离线时,订阅关系即取消,不会保存在服务器上,这也是非
持久化方式订阅者不能离线接收消息的原因吧。默认为广播方式,在没有订阅者连接到服务器时,发送的消息将丢失,不会保存在服务器。
对jms规范的理解:
jms
规范是sun提出的java的消息服务统一的api接口规范,规范、标准的好处就不用说了,java能走到今天,规范标准的制定可以说有很大的功劳吧。所
有提供java消息服务的软件提供者都必须针对这个接口实现。我们编写jms程序时,基本可以做到只针对接口编程,不用考虑是那个厂家实现,这是我们的代
码有了很大的灵活行,不绑定某个具体厂商。只要你的代码写的够好,完全可以不修改代码就直接部署到不同厂商的jms服务器上。
举个例子:编写一个基于ActiveMQ的jms程序时有这样的代码:
ActiveMQConnectionFactory factory =new
ActiveMQConnectionFactory("vm://localhost"
);
...
Queue queue =new
ActiveMQQueue("testQueue"
);
等,这样就在代码里绑死了ActiveMQ的api。要做到厂商无关性,应该使用jndi来取得工厂对象以及队列资源。
比如:
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("connectionFactory");
...
Destination dest = (Queue) ctx.lookup("MyQueue");
注意接口也尽量使用jms的大的接口。当然这里需要提供jndi服务支持,ActiveMQ本身提供jndi服务,只要在classpath中有一个jndi.properties文件,在配置文件中对资源做一些配置就可以了
比如:
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry
queue.MyQueue = zmQueue
topic.MyTopic = zmTopic
等。
对jms规范1.1的一些理解:
JMS 1.0.2 定义了两种类型的消息传递域(它们是相互独立的),即点对点和发布/订阅。JMS 的最新版本,即版本 1.1,JMS 统一了这两个域。如下图:有了 JMS 1.1,客户机就不再必须专门针对这个或那个域进行实现了。
JMS 公共
|
PTP 域
|
Pub/Sub 域
|
ConnectionFactory |
QueueConnectionFactory |
TopicConnectionFactory |
Connection |
QueueConnection |
TopicConnection |
Destination |
Queue |
Topic |
Session |
QueueSession |
TopicSession |
MessageProducer |
QueueSender |
TopicPublisher |
MessageConsumer |
QueueReceiver |
TopicSubscriber |
参考:http://www.ibm.com/developerworks/cn/java/j-jms11/index.html
就是说,只使用JMS公共域的接口就可以完成jms程序编写。所以推荐尽量使用大的接口,增加代码的灵活性。
比如,写pub/sub方式的消息程序也可以这样:
Context ctx = new InitialContext();
ConnectionFactory factory = (ConnectionFactory) ctx
.lookup("connectionFactory");
Connection connection = factory.createConnection();
connection.start();
// 创建一个Topic
Destination topic = (Destination) ctx.lookup("MyTopic");
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageConsumer comsumer3 = session.createConsumer(topic);
Message msg = comsumer3.receive();
分享到:
相关推荐
Websphere MQ,通常简称为WMQ,是IBM提供的一款企业级消息中间件产品,它在分布式系统中扮演着至...在文档"Websphere MQ学习心得.doc"中,我详细记录了我在探索和应用这些知识时的心得体会,希望对你的学习也有所帮助。
这篇学习心得主要涵盖了Java的基础知识、进阶概念以及实战应用,同时提及了与Oracle数据库的交互和JDBC(Java Database Connectivity)的使用。 首先,Java的学习从基础开始,包括语法结构、数据类型、控制流程(如...
### Java学习心得知识积累 在探索Java编程语言的旅程中,从初学者到熟练掌握,每一步都充满了挑战与收获。以下是对Java基础知识、开发工具、以及应用平台的一些深入理解和经验分享。 #### JDK(Java Development ...
在本文中,我们将深入探讨JavaEE的基本构成、核心技术和学习心得。 JavaEE的学习分为多个部分,首先是基础服务,包括对平台的概述,如JavaEE的发展历程、架构、组件和服务。这部分还涉及开发环境的选择和应用服务的...
本文主要围绕"J2EE Design and Development"的学习心得展开,探讨如何在JavaEE开发中实现高效且具有可扩展性和可维护性的程序架构设计。 分布式系统是现代企业级应用的基石,尤其是在处理大数据量、高并发场景时,...
7. **JMS (Java Message Service)**:JMS是Java消息服务,提供了一种标准的方式来创建、发送、接收和读取消息,用于异步通信。 8. **JMX (Java Management Extensions)**:JMX是用于管理和监控Java应用程序的框架,...
在学习JAVA基础的过程中,了解并掌握一些常用的英文缩写是非常重要的。这些缩写不仅代表着JAVA技术的核心概念,也是深入理解JAVA平台和应用开发的关键。以下是一些重要术语的详细解释: 1. **API (Application ...
基础服务部分是Java EE学习的起点,它涵盖了诸如JNDI(Java Naming and Directory Interface)、JDBC(Java Database Connectivity)、JTA(Java Transaction API)、RMI(Remote Method Invocation)和JMS(Java ...
这份学习资料涵盖了30多个架构学习心得,旨在帮助读者掌握J2EE平台的核心技术和高级概念,同时深入理解开源架构的设计与实践。 J2EE(Java 2 Platform, Enterprise Edition)是Java平台上用于构建企业级应用的框架...
【XAware学习心得】 XAware是一款企业级的数据集成平台,其设计目的是为了简化数据的集成、管理和使用。本文将深入探讨XAware的核心技术、操作技巧以及各个关键组件的作用,帮助读者更好地理解和应用XAware。 首先...
在本文中,我们将深入探讨RabbitMQ,一个广泛使用的开源消息代理和队列管理系统,尤其在Java开发中被广泛应用。RabbitMQ是一个基于AMQP(Advanced Message Queuing Protocol)协议的中间件,它允许分布式系统中的...
### Java自学心得详解 #### 一、安装JDK与环境配置 自学Java的第一步是安装JDK(Java Development Kit)。这是开发Java程序的基础工具包,包含编译、运行Java程序所需的组件。 - **CLASSPATH问题**:理解...
【Java学习心得】 Java作为一门广泛使用的编程语言,学习它是一项既有挑战又有乐趣的过程。从初识语法到熟练掌握各种框架和技术,每一步都需要扎实的基础和不断的实践。 首先,Java学习的基础是掌握基本语法和核心...
Tomcat,作为Java Web应用程序的开源服务器,是Apache软件基金会Jakarta项目的一个核心组件。在本文中,我们将深入探讨Tomcat 8.5版本的学习要点,包括其工作原理、配置与优化,以及在实际开发中的应用。 首先,...
9. **Java信使服务(JMS)**:JMS是一个用于消息传递的API,允许应用程序之间通过消息队列进行通信。 10. **扩展标记语言(XML)**:XML是一种用于标记数据的语言,广泛应用于数据交换和配置文件中。 11. **Struts+...
BookStore项目不仅是一个实用的B2C网上书店平台,更是学习Spring框架及企业级应用开发技术的绝佳案例。通过本心得的介绍,读者可以了解到该项目是如何综合运用多种技术和框架来构建一个功能完备、性能稳定的在线书店...
从给定的文件信息来看,这是一篇关于个人学习J2EE的心得体会,虽然原文内容较为抽象且不易理解,但我们可以从中提炼出与J2EE相关的知识点,并结合标题和描述进行深入探讨。 ### J2EE简介 J2EE(Java 2 Platform, ...
### 深入解析《ejb学习笔记5》——消息驱动Bean详解 #### 消息驱动Bean概述 消息驱动Bean(MDB,Message Driven Bean)是Enterprise JavaBeans(EJB)框架中的一个重要组成部分,主要用于接收并处理来自消息中间件...
JavaEE(Java Platform, Enterprise Edition)是Oracle公司提供的一个用于构建分布式、多层企业应用的平台,它包含了丰富的组件和服务,如Servlet、JSP、EJB、JMS、JPA等,旨在简化开发过程并提高应用的可扩展性和...