`
wanmeilingdu
  • 浏览: 24274 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ActiveMQ:JMS开源框架入门介绍

阅读更多

      JMS是为企业级的应用提供一种智能的消息系统,JMS定义了一整套的企业级的消息概念与工具,尽可能最小化的Java语言概念去构建最大化企业消息应用。统一已经存在的企业级消息系统功能。下面我们来学习JMS开源框架入门介绍。

 

介绍基本的JMS概念与开源的JMS框架ActiveMQ应用,内容涵盖一下几点:

  1. 基本的JMS概念
  2. JMS的消息模式
  3. 介绍ActiveMQ
  4. 一个基于ActiveMQ的JMS例子程序

一:JMS基本概念

1. JMS的目标

为企业级的应用提供一种智能的消息系统,JMS定义了一整套的企业级的消息概念与工具,尽可能最小化的Java语言概念去构建最大化企业消息应用。统一已经存在的企业级消息系统功能。

2. 提供者

JMS提供者是指那些完全完成JMS功能与管理功能的JMS消息厂商,理论上JMS提供者完成。

JMS消息产品必须是100%的纯Java语言实现,可以运行在跨平台的架构与操作系统上,当前一些JMS厂商包括IBM,Oracle, JBoss社区 (JBoss Community), Apache 社区(ApacheCommunity)。

3. JMS应用程序, 一个完整的JMS应用应该实现以下功能:

  • JMS 客户端 – Java语言开发的接受与发送消息的程序
  • 非JMS客户端 – 基于消息系统的本地API实现而不是JMS
  • 消息 – 应用程序用来相互交流信息的载体
  • 被管理对象–预先配置的JMS对象,JMS管理员创建,被客户端运用。如链接工厂,主题等
  • JMS提供者–完成JMS功能与管理功能的消息系统

二:JMS的消息模式

1.点对点的消息模式(Point to Point Messaging)


 

下面的JMS对象在点对点消息模式中是必须的:

a.队列(Queue) – 一个提供者命名的队列对象,客户端将会使用这个命名的队列对象

b.队列链接工厂(QueueConnectionFactory) – 客户端使用队列链接工厂创建链接队列

ConnectionQueue来取得与JMS点对点消息提供者的链接。

c. 链接队列(ConnectionQueue) – 一个活动的链接队列存在在客户端与点对点消息提供者之间,客户用它创建一个或者多个JMS队列会话(QueueSession)

d.     队列会话(QueueSession) – 用来创建队列消息的发送者与接受者(QueueSenderand QueueReceiver)

e.消息发送者(QueueSender 或者MessageProducer)– 发送消息到已经声明的队列

f.消息接受者(QueueReceiver或者MessageConsumer) – 接受已经被发送到指定队列的消息

2.发布订阅模式(publish – subscribe Mode)


 

a.主题Topic(Destination) – 一个提供者命名的主题对象,客户端将会使用这个命名的主题对象

b.主题链接工厂(TopciConnectionFactory) – 客户端使用主题链接工厂创建链接主题

ConnectionTopic来取得与JMS消息Pub/Sub提供者的链接。

c.链接主题(ConnectionTopic) – 一个活动的链接主题存在发布者与订阅者之间

d.会话(TopicSession) – 用来创建主题消息的发布者与订阅者 (TopicPublisher  and TopicSubscribers)

e.消息发送者MessageProducer) – 发送消息到已经声明的主题

f.消息接受者(MessageConsumer) – 接受已经被发送到指定主题的消息

三:介绍ActiveMQ

ActiveMQ是apache社区完成的JMS开源消息组件,客户端支持多种语言调用,包括Java,C++, C#,

Perl, Python等。支持Spring配置集成等。更多信息访问这里:

http://activemq.apache.org/index.html

四:基于ActiveMQ的Publish/subscribe模式Demo程序

 

消息Broker,JMSprovider

  1. import java.net.URI;  
  2. import java.net.URISyntaxException;  
  3.  
  4. import javax.jms.Connection;  
  5. import javax.jms.ConnectionFactory;  
  6. import javax.jms.Destination;  
  7. import javax.jms.JMSException;  
  8. import javax.jms.MessageProducer;  
  9. import javax.jms.Session;  
  10. import javax.jms.TextMessage;  
  11. import javax.naming.Context;  
  12. import javax.naming.InitialContext;  
  13. import javax.naming.NamingException;  
  14.  
  15. import org.apache.activemq.broker.BrokerFactory;  
  16. import org.apache.activemq.broker.BrokerService;  
  17. import org.apache.commons.logging.Log;  
  18. import org.apache.commons.logging.LogFactory;  
  19.  
  20. /**  
  21.  * refer to http://activemq.apache.org/jndi-support.html  
  22.  * http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html  
  23.  * @author gloomyfish  
  24.  *  
  25.  */ 
  26. public class PureJMSProducer {  
  27.       
  28.     private static final Log LOG = LogFactory.getLog(PureJMSProducer.class);  
  29.  
  30.     private PureJMSProducer() {  
  31.     }  
  32.  
  33.     /**  
  34.      * @param args the destination name to send to and optionally, the number of  
  35.      *                messages to send  
  36.      */ 
  37.     public static void main(String[] args) {  
  38.         Context jndiContext = null;  
  39.         ConnectionFactory connectionFactory = null;  
  40.         Connection connection = null;  
  41.         Session session = null;  
  42.         Destination destination = null;  
  43.         MessageProducer producer = null;  
  44.         BrokerService broker = null;  
  45.         final int numMsgs = 10;  
  46.  
  47.         /*  
  48.          * Create a JNDI API InitialContext object  
  49.          */ 
  50.         try {  
  51.             jndiContext = new InitialContext();  
  52.         } catch (NamingException e) {  
  53.             LOG.info("Could not create JNDI API context: " + e.toString());  
  54.             System.exit(1);  
  55.         }  
  56.           
  57.         // create external TCP broker  
  58.         try {  
  59.             broker = BrokerFactory.createBroker(new URI("broker:tcp://localhost:61616"));  
  60.             broker.start();   
  61.         } catch (URISyntaxException e) {  
  62.             LOG.info("Could not create broker: " + e.toString());  
  63.         } catch (Exception e) {  
  64.             LOG.info("Could not create broker: " + e.toString());  
  65.         }  
  66. //        try {  
  67. //            
  68. //        }  
  69.  
  70.         /*  
  71.          * Look up connection factory and destination.  
  72.          */ 
  73.         try {  
  74.             connectionFactory = (ConnectionFactory)jndiContext.lookup("ConnectionFactory");  
  75.             destination = (Destination)jndiContext.lookup("MyTopic");  
  76.         } catch (NamingException e) {  
  77.             LOG.info("JNDI API lookup failed: " + e);  
  78.             System.exit(1);  
  79.         }  
  80.           
  81.         /*  
  82.          * Create connection. Create session from connection; false means  
  83.          * session is not transacted. Create sender and text message. Send  
  84.          * messages, varying text slightly. Send end-of-messages message.  
  85.          * Finally, close connection.  
  86.          */ 
  87.         try {  
  88.             connection = connectionFactory.createConnection();  
  89.             session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  90.             producer = session.createProducer(destination);  
  91.             TextMessage message = session.createTextMessage();  
  92.             Thread.sleep(3000);  
  93.             for (int i = 0; i < numMsgs; i++) {  
  94.                 message.setText("This is message " + (i + 1));  
  95.                 LOG.info("Sending message: " + message.getText());  
  96.                 producer.send(message);  
  97.                 Thread.sleep(3000);  
  98.             }  
  99.  
  100.             /*  
  101.              * Send a non-text control message indicating end of messages.  
  102.              */ 
  103.             producer.send(session.createMessage());  
  104.         } catch (JMSException e) {  
  105.             LOG.info("Exception occurred: " + e);  
  106.         } catch (InterruptedException e) {  
  107.             LOG.info("Exception occurred: " + e);  
  108.         } finally {  
  109.             if (connection != null) {  
  110.                 try {  
  111.                     connection.close();  
  112.                 } catch (JMSException e) {  
  113.                 }  
  114.             }  
  115.         }  
  116.           
  117.         // stop the TCP broker  
  118.         try {  
  119.             broker.stop();  
  120.         } catch (Exception e) {  
  121.             LOG.info("stop the broker failed: " + e);  
  122.         }  
  123.     }  

客户端:

  1. import java.io.IOException;  
  2.  
  3. import javax.jms.Connection;  
  4. import javax.jms.JMSException;  
  5. import javax.jms.Message;  
  6. import javax.jms.MessageConsumer;  
  7. import javax.jms.MessageListener;  
  8. import javax.jms.Session;  
  9. import javax.jms.TextMessage;  
  10. import javax.jms.Topic;  
  11. import javax.naming.InitialContext;  
  12.  
  13. import org.apache.activemq.ActiveMQConnectionFactory;  
  14.  
  15.  
  16. public class ActiveMQClient {  
  17.       
  18.     public static void main(String[] args) throws IOException {  
  19.           
  20.         // -- http://dlc.sun.com/pdf//816-5904-10/816-5904-10.pdf  
  21.         try {  
  22.         ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");  
  23.         // ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://locahost");  
  24.         Connection connection = factory.createConnection();  
  25.         connection.start();  
  26.           
  27.         // create message topic  
  28.         //Topic topic= new ActiveMQTopic("MyTopic");  
  29.         InitialContext jndiContext=new InitialContext();  
  30.         Topic topic=(Topic)jndiContext.lookup("MyTopic");   
  31.         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  32.           
  33.         // register message consumer  
  34.         MessageConsumer comsumer1 = session.createConsumer(topic);  
  35.         comsumer1.setMessageListener(new MessageListener(){  
  36.             public void onMessage(Message m) {  
  37.                 try {  
  38.                     System.out.println("Consumer get " + ((TextMessage)m).getText());  
  39.                 } catch (JMSException e) {  
  40.                     e.printStackTrace();  
  41.                 }   
  42.             }  
  43.         });  
  44.         Thread.sleep(30000);  
  45.         session.close();  
  46.         connection.stop();  
  47.           
  48.         } catch(Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.     }  

项目配置,Jar依赖:

 

依赖的三个Jar分别为:

  • activemq-all.jar
  • geronimo-jms_1.1_spec-1.1.1.jar
  • xbean-spring.jar

原文链接:http://blog.csdn.net/jia20003/article/details/7601176

分享到:
评论
2 楼 cuisuqiang 2013-08-23  
你这代码粘贴的太没有技术含量了
1 楼 hanmiao 2012-11-29  
樓主的代碼排版那叫壹個亂,我就不多說了。

相关推荐

    activemq与spring整合发送jms消息入门实例

    ActiveMQ是Apache软件基金会开发的一个开源消息代理,它实现了JMS规范,提供了一个高效、可靠的平台,用于在分布式系统之间传递消息。ActiveMQ支持多种协议,如OpenWire、AMQP、STOMP等,并且可以与其他Java应用...

    ActiveMQ入门

    ### ActiveMQ入门详解 #### 一、ActiveMQ简介与重要性 **ActiveMQ**作为Apache组织下的一个开源项目,是一款非常成熟且功能强大的消息中间件。消息中间件是指在分布式系统中用来完成消息发送和接收的基础软件。它...

    SpringActiveMQ入门示例

    SpringActiveMQ入门示例是关于如何在Java环境中利用Spring框架与Apache ActiveMQ集成的一个实践教程。这个示例主要适用于开发者想要了解如何在Spring应用中使用消息队列进行异步通信和解耦。在这个项目中,开发环境...

    activeMQ的使用入门

    ActiveMQ是中国最流行的开源消息中间件之一,它基于Java Message Service (JMS) 规范,为分布式系统提供高效、可靠的消息传递服务。本入门教程将帮助初学者了解如何使用ActiveMQ,以及如何在实际项目中集成和应用。 ...

    ActiveMQ整合spring的Demo

    ActiveMQ是Apache软件基金会的一个开源项目,它是一个功能丰富的Java消息服务(JMS)提供者,支持多种消息协议,如AMQP、STOMP等。Spring框架则是广泛使用的Java应用程序开发框架,它提供了丰富的功能,包括依赖注入...

    spring-jms入门

    ActiveMQ是Apache提供的开源JMS消息代理,具有高性能、高可用性等特点。配置Spring-JMS与ActiveMQ的集成,主要涉及连接工厂和目的地的配置。 **9. Spring Boot与Spring-JMS** 在Spring Boot项目中,通过添加相关...

    ActiveMQ的入门例子

    ActiveMQ是Apache组织开发的一款开源的消息中间件,它是Java Message Service (JMS) 的实现,主要用于处理应用间的异步通信。在分布式系统中,ActiveMQ作为一个消息代理,允许应用程序通过发送和接收消息来进行通信...

    从入门到精通的ActiveMQ.docx

    通过以上介绍,我们可以看到 ActiveMQ 作为一款强大的消息中间件,不仅实现了 JMS 规范,还提供了许多高级特性和易用的管理工具。无论是新手还是经验丰富的开发者,都能通过深入学习 ActiveMQ,提升系统的稳定性和可...

    ActiveMQ入门示例

    Apache ActiveMQ是一款开源的消息中间件,它是Java消息服务(JMS)的实现,广泛应用于分布式系统中的异步通信。在这个入门示例中,我们将探讨如何使用ActiveMQ实现点对点(Point-to-Point)的通信模式。 首先,我们...

    ActiveMQ基础入门

    Apache ActiveMQ是开源的、基于Java的消息中间件,它遵循JMS(Java消息服务)规范,提供了高效、可靠的异步通信能力。在本文中,我们将深入探讨ActiveMQ的基础知识,帮助你快速上手。 1. **什么是消息队列** 消息...

    消息中间件activemq项目demo

    描述中提到"消息中间件activemq的入门demo",这意味着这个项目是为初学者设计的,旨在介绍ActiveMQ的基本用法和概念。"集成了spring管理jsm的初始化管理"这部分表明这个项目不仅涉及ActiveMQ,还利用了Spring框架来...

    spring_jms

    在这个入门级实例中,我们将探讨如何使用Maven、Spring和ActiveMQ来构建一个简单的Spring JMS应用。 首先,Maven是一个项目管理和综合工具,它管理项目的构建、依赖关系和报告。在Spring JMS项目中,Maven用于管理...

    ActiveMQDemo:这是关于消息中间件ActiveMQ的WEB项目,将覆盖JMS,ActiveMQ的初始入门和API详细使用,两种经典的消息模式(PTP和PubSub),与Spring集成,ActiveMQ进行监控,监控与配置优化等。不多说,直接撸原始码!

    ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它是Java消息服务(JMS)的一个实现,主要用于处理应用程序之间的异步通信。在分布式系统中,ActiveMQ能够帮助解耦组件,提高系统的可扩展性和可靠性。 **JMS...

    activemq-example sping maven

    【标题】"activemq-example spring maven" 涉及到的是一个使用ActiveMQ、Spring框架和Maven构建的入门示例项目。这个项目旨在帮助开发者了解如何在Java环境中集成这三个关键技术来实现消息队列的功能。 【activemq...

    JMS完全实例(八个实例)

    理解如何创建消息对象,设置其属性,并通过Session和Destination接口进行发送和接收是JMS入门的关键。 2. **网关设置** 实例中可能涉及到的消息网关配置,如ActiveMQ,是JMS实现的核心组件。ActiveMQ是Apache软件...

    camel2.2.0 手册

    - 引言(Introduction):介绍 Camel 的核心理念和功能。 - 快速入门(Quickstart):提供快速启动指南和示例。 - 开始(Getting Started):引导用户如何开始使用 Camel。 - 架构(Architecture):详细介绍 Camel ...

    camel-manual-2.10.4.pdf

    - 快速入门:引导读者通过一个简单的例子快速开始使用Camel。 - 架构介绍:深入解释Camel的内部架构和工作原理。 - 企业集成模式:详细介绍了Camel支持的各种企业集成模式。 - CookBook:提供了一系列可复用的集成...

    CAMEL核心开发指南

    CAMEL(即Apache Camel)是一个基于已知企业集成模式(Enterprise Integration Patterns,EIPs)的多功能开源集成框架。其主要作用是允许开发者在各种特定领域语言(Domain Specific Languages, DSLs)中定义路由和...

Global site tag (gtag.js) - Google Analytics