ActiveMQ –JMS开源框架入门介绍

简介: ActiveMQ –JMS开源框架入门介绍

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


1.      基本的JMS概念


2.       JMS的消息模式


3.       介绍ActiveMQ


4.      一个基于ActiveMQ的JMS例子程序


一:JMS基本概念


1.      JMS的目标


       为企业级的应用提供一种智能的消息系统,JMS定义了一整套的企业级的消息概念与工具,


       尽可能最小化的Java语言概念去构建最大化企业消息应用。统一已经存在的企业级消息系


       统功能。


2.      JMS提供者


       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)

1337915714_4642.png


下面的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)

1337915755_8015.png


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

import java.net.URI;
import java.net.URISyntaxException;
 
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
 
import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
/**
 * refer to http://activemq.apache.org/jndi-support.html
 * http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html
 * @author gloomyfish
 *
 */
public class PureJMSProducer {
  
  private static final Log LOG = LogFactory.getLog(PureJMSProducer.class);
 
    private PureJMSProducer() {
    }
 
    /**
     * @param args the destination name to send to and optionally, the number of
     *                messages to send
     */
    public static void main(String[] args) {
        Context jndiContext = null;
        ConnectionFactory connectionFactory = null;
        Connection connection = null;
        Session session = null;
        Destination destination = null;
        MessageProducer producer = null;
        BrokerService broker = null;
        final int numMsgs = 10;
 
        /*
         * Create a JNDI API InitialContext object
         */
        try {
            jndiContext = new InitialContext();
        } catch (NamingException e) {
            LOG.info("Could not create JNDI API context: " + e.toString());
            System.exit(1);
        }
        
        // create external TCP broker
    try {
      broker = BrokerFactory.createBroker(new URI("broker:tcp://localhost:61616"));
      broker.start(); 
    } catch (URISyntaxException e) {
      LOG.info("Could not create broker: " + e.toString());
    } catch (Exception e) {
      LOG.info("Could not create broker: " + e.toString());
    }
//        try {
//          
//        }
 
        /*
         * Look up connection factory and destination.
         */
        try {
            connectionFactory = (ConnectionFactory)jndiContext.lookup("ConnectionFactory");
            destination = (Destination)jndiContext.lookup("MyTopic");
        } catch (NamingException e) {
            LOG.info("JNDI API lookup failed: " + e);
            System.exit(1);
        }
        
        /*
         * Create connection. Create session from connection; false means
         * session is not transacted. Create sender and text message. Send
         * messages, varying text slightly. Send end-of-messages message.
         * Finally, close connection.
         */
        try {
            connection = connectionFactory.createConnection();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            producer = session.createProducer(destination);
            TextMessage message = session.createTextMessage();
            Thread.sleep(3000);
            for (int i = 0; i < numMsgs; i++) {
                message.setText("This is message " + (i + 1));
                LOG.info("Sending message: " + message.getText());
                producer.send(message);
                Thread.sleep(3000);
            }
 
            /*
             * Send a non-text control message indicating end of messages.
             */
            producer.send(session.createMessage());
        } catch (JMSException e) {
            LOG.info("Exception occurred: " + e);
        } catch (InterruptedException e) {
          LOG.info("Exception occurred: " + e);
    } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                }
            }
        }
    
    // stop the TCP broker
    try {
      broker.stop();
    } catch (Exception e) {
      LOG.info("stop the broker failed: " + e);
    }
    }
 
 
}

客户端:

import java.io.IOException;
 
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.naming.InitialContext;
 
import org.apache.activemq.ActiveMQConnectionFactory;
 
 
public class ActiveMQClient {
  
  public static void main(String[] args) throws IOException {
    
    // -- http://dlc.sun.com/pdf//816-5904-10/816-5904-10.pdf
    try {
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    // ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://locahost");
        Connection connection = factory.createConnection();
        connection.start();
        
        // create message topic
        //Topic topic= new ActiveMQTopic("MyTopic");
        InitialContext jndiContext=new InitialContext();
        Topic topic=(Topic)jndiContext.lookup("MyTopic"); 
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        
        // register message consumer
        MessageConsumer comsumer1 = session.createConsumer(topic);
        comsumer1.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                  System.out.println("Consumer get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                  e.printStackTrace();
                } 
            }
        });
        Thread.sleep(30000);
        session.close();
        connection.stop();
        
    } catch(Exception e) {
      e.printStackTrace();
    }
    }
 
}

项目配置,Jar依赖:

1337915919_7952.png

依赖的三个Jar分别为:

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


补充JNDI内容:

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
connectionFactory=topicConnectionFactry
topic.MyTopic = example.MyTopic
相关文章
|
8月前
|
消息中间件 Java 数据库连接
03JMS简介
03JMS简介
34 0
|
消息中间件 缓存 安全
SpringBoot与JMS集成(中间件为ActiveMQ)
Apache ActiveMQ是最受欢迎和强有力的开源消息和集成模式服务器,支持许多跨语言客户端和协议,便利使用企业集成模式还有许多先进的特性。
|
消息中间件 Cloud Native Java
RocketMQ-Spring 毕业两周年,为什么能成为 Spring 生态中最受欢迎的 messaging 实现?
2019 年 1 月,孵化 6 个月的 RocketMQ-Spring 作为 Apache RocketMQ 的子项目正式毕业,发布了第一个 Release 版本 2.0.1。该项目是把 RocketMQ 的客户端使用 Spring Boot 的方式进行了封装,可以让用户通过简单的 annotation 和标准的 Spring Messaging API 编写代码来进行消息的发送和消费。当时 RocketMQ 社区同学请 Spring 社区的同学对 RocketMQ-Spring 代码进行 review,引出一段罗美琪(RocketMQ)和春波特(Spring Boot)的故事。
183 0
 RocketMQ-Spring 毕业两周年,为什么能成为 Spring 生态中最受欢迎的 messaging 实现?
|
消息中间件 存储 Java
[原创]JMS-ActiveMQ基础与SpringBoot整合
[原创]JMS-ActiveMQ基础与SpringBoot整合
[原创]JMS-ActiveMQ基础与SpringBoot整合
|
消息中间件
ActiveMQ - 基础篇(下)
ActiveMQ - 基础篇(下)
119 0
ActiveMQ - 基础篇(下)
|
消息中间件 中间件
ActiveMQ - 基础篇(上)
ActiveMQ - 基础篇(上)
119 0
ActiveMQ - 基础篇(上)
|
消息中间件 存储 JSON
RabbitMQ精讲6:与Spring AMQP整合实战
RabbitMQ精讲6:与Spring AMQP整合实战
240 0
RabbitMQ精讲6:与Spring AMQP整合实战
|
消息中间件 Java API
RocketMQ-Spring 毕业两周年,为什么能成为 Spring 生态中最受欢迎的 messaging 实现?
RocketMQ-Spring 毕业两周年,为什么能成为 Spring 生态中最受欢迎的 messaging 实现?
RocketMQ-Spring 毕业两周年,为什么能成为 Spring 生态中最受欢迎的 messaging 实现?
|
消息中间件 Java Spring
消息中间件系列三、JMS和activeMQ的简单使用
一、JMS 1、什么是JMS   JMS(JAVA Message Service,java消息服务)本质是API,Java平台消息中间件的规范,java应用程序之间进行消息交换。并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。
4119 1
|
消息中间件 网络协议 Java