ActiveMQ 入门实践(一)

Activemq 是由Apache出品的一款开源消息中间件,旨在为应用程序提供高效、可扩展、稳定、安全的企业级消息通信。它的设计目标是提供标准的、面向消息的、多语言的应用集成消息通信中间件。ActiveMQ 实现了JMS1.1并提供了很多附加的特性,比如JMX管理、主从管理、消息组通信、消息优先级、延迟接收消息、虚拟接收者、消息持久化、消息队列监控等。

 

一、基本概念:

(1)消息传送模型

*   点对点模型。使用队列作为消息通信载体,满足生产者与消费者模式。一条消息只能被一个消费者使用,未被消费的消息在队列中保留知道被消费或者超时。

*  发布-订阅模型。使用主题作为消息通信载体,类似于广播模式,发布者发布一条消息,该消息通过主题传递给所有的订阅者,在一条消息被广播之后才订阅的用户是收不到该条消息的。

(2)基本组件

broker(消息代理),producer(消息生产者),consumer(消息消费者),topic(主题),queue(队列),message(消息)

(3)连接器

ActiveMQ Broker的主要作用是为客户端应用提供一种通信机制。为此ActiveMQ 提供了一种连接机制,并用连接器(Connector)来描述这种连接机制。

(4)消息存储

在JMS规范中对消息的分发方式有两种:非持久化和持久化。非持久化消息,JMS实现者尽力分发消息,但消息不会持久化存储;而采用持久化方式分发的消息则必须进行持久化存储。

 

二、代码实例

1、Java访问ActiveMQ实例

官网下载apache-activemq-5.15.2-bin.zip包

根据机器类型执行activemq.bat启动服务。端口是默认的

 

创建java或者maven工程,引入依赖activemq-all-5.15.2.jar

 

*****************************我是分割线*******************************

package com.my.activemq;
import javax.jms.*;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;


public class TopicPublisher {

    public static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
    
    public static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
    
    public static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
    
    public static void main(String[] args) {
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory
                (USERNAME,PASSWORD,BROKER_URL);
        
        try {
            Connection connection = connectionFactory.createConnection();
            connection.start();
            
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Topic myTestTopic = session.createTopic("topic1");
            MessageProducer producer = session.createProducer(myTestTopic);
            for(int i=1;i<=3 ;i++){
                TextMessage message = session.createTextMessage("send message " + i);
                producer.send(myTestTopic,message);
            }
            
            //close resource
            session.close();
            connection.close();
            
        }catch(JMSException e){
            e.printStackTrace();
        }
    }
    
}
*****************************我是分割线*******************************

package com.huawei.activemq;

import javax.jms.*;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQConnection;


public class TopicSubscriber {

    public static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
    
    public static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
    
    public static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
    
    public static void main(String[] args){
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory
                (USERNAME,PASSWORD,BROKER_URL);
        
        try {
            Connection connection = connectionFactory.createConnection();
            connection.start();
            
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Topic myTestTopic = session.createTopic("topic1");
            MessageConsumer messageConsumer = session.createConsumer(myTestTopic);
            
            messageConsumer.setMessageListener(new MessageListener(){

                @Override
                public void onMessage(Message message) {
                    // TODO Auto-generated method stub
                    try{
                        System.out.println("receiver1: " + ((TextMessage)message).getText() );
                    }catch(JMSException e){
                        e.printStackTrace();
                    }
                }
                
            });
            
            MessageConsumer messageConsumer2 = session.createConsumer(myTestTopic);
            messageConsumer2.setMessageListener(new MessageListener(){

                @Override
                public void onMessage(Message message) {
                    // TODO Auto-generated method stub
                    try{
                        System.out.println("receiver1: " + ((TextMessage)message).getText() );
                    }catch(JMSException e){
                        e.printStackTrace();
                    }
                }
                
            });
            
            MessageConsumer messageConsumer3 = session.createConsumer(myTestTopic);
            messageConsumer3.setMessageListener(new MessageListener(){

                @Override
                public void onMessage(Message message) {
                    // TODO Auto-generated method stub
                    try{
                        System.out.println("receiver1: " + ((TextMessage)message).getText() );
                    }catch(JMSException e){
                        e.printStackTrace();
                    }
                }
                
            });
            
            Thread.sleep(100*1000);
            
            //close resource
            session.close();
            connection.close();
            
        }catch(JMSException e){
            e.printStackTrace();
        }catch(InterruptedException ee){
            ee.printStackTrace();
        }
        
    }
}
本例创建了3个消费者并订阅了同一个主题。需要先运行topicsubscriber类的main方法,这样发布者发送消息时订阅者爱能接收到消息。日志如下:

 INFO | Successfully connected to tcp://localhost:61616
receiver1: send message 1
receiver1: send message 1
receiver1: send message 1
receiver1: send message 2
receiver1: send message 2
receiver1: send message 2
receiver1: send message 3
receiver1: send message 3
receiver1: send message 3

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(中间件)