ActiveMQ学习小结

本文深入介绍了ActiveMQ,一个流行的开源消息中间件。内容包括ActiveMQ的适用场景、不适合场景、JMS API介绍,以及Queue(点到点)和Topic(发布/订阅)两种模式的详细示例。进一步探讨了ActiveMQ的集群配置,包括Broker集群和主从集群,分析了其工作机制和优缺点。最后,文章提供了学习体会和相关代码示例。
摘要由CSDN通过智能技术生成

 

ActiveMQ简介

   Activemq是众多开源消息中间件的一种,支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,和J2EE1.4容器无缝结合。它是apache基金会的一个项目,而且经过多年发展,有了很高的稳定性。目前被很多知名项目使用,比如Apache serviceMix、FuseESB

适用场景

 消息中间件一般被用在异步消息通信、整合多个系统的场景,比如你注册CSDN论坛,你填写完注册信息点提交时,它会发一份验证邮箱的验证邮件给到你,这封邮件就可以通过消息中间异步发送给你。再举一个场景,原先有一个客户购买我们的工作管理平台,他用该平台模拟公司整个行政办公,业务流程,前提是把他原先的财务系统相关数据以单据的形式也要在我们的平台上走流程。这就涉及到数据整合问题了,当然解决方法有很多种,一种方法是可以通过在财务系统开发一个webservice接口,然后管理平台去访问该接口,也可以直接通过quartz做一个计划,不定时的去取相关数据,当然也可以在管理平台与财务系统之间弄一个消息总线,财务系统产生数据时,发送一份到消息中间件,然后管理平台去取。用消息中间件的好处是不仅数据实时性高,而且让管理平台与财务系统之间解耦了,将来生管系统有什么数据要走流程,也可以这样做,呵呵

不适合场景

  如果系统生态环境很单一,无需跟其他第三方进行通信,或是虽然要简单的通信但是数据量不大,业务不太复杂,其实个人认为是无需用MQ这种重量级的解决方案的,直接暴露接口就好了,总之就是一个权衡了,呵呵

API介绍

用 ActiveMQ 最好还是了解下 JMS

JMS 公共

点对点域

发布/订阅域

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

Queue

Topic

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicPublisher

MessageConsumer

QueueReceiver

TopicSubscriber

JMS 定义了两种方式:Queue(点对点);Topic(发布/订阅)。

·ConnectionFactory 是连接工厂,负责创建Connection。

·Connection 负责创建 Session。

·Session 创建 MessageProducer(用来发消息) 和 MessageConsumer(用来接收消息)。

·Destination 是消息的目的地。

详细的可以网上找些 JMS 规范(有中文版),本文对这两种方式都会有讲解。

 

Queue(点到点)模式

在点对点的传输方式中,消息数据被持久化,每条消息都能被消费,没有监听QUEUE地址也能被消费,数据不会丢失,一对一的发布接受策略,保证数据完整。

创建MAVEN项目

点击下一步,填写grupId为me.czp,artifactId为example-mq,name为exampleMq,点完成

然后在Package Explorer看到example-mq项目,如下:

创建生产者

package mq.p2p;

import java.util.Date;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.Destination;

import javax.jms.JMSException;

import javax.jms.MapMessage;

import javax.jms.MessageProducer;

import javax.jms.Session;

import org.apache.activemq.ActiveMQConnection;

importorg.apache.activemq.ActiveMQConnectionFactory;

public class Producer {

         publicstatic void main(String[] args) {

                   Stringuser = ActiveMQConnection.DEFAULT_USER;

                   Stringpassword = ActiveMQConnection.DEFAULT_PASSWORD;

                   Stringurl = ActiveMQConnection.DEFAULT_BROKER_URL;

                   Stringsubject = "test.queue";

                   ConnectionFactorycontectionFactory = new ActiveMQConnectionFactory( user, password, url);

                   try{

                            Connectionconnection = contectionFactory.createConnection();

                            connection.start();

                            Sessionsession = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);

                            Destinationdestination = session.createQueue(subject);

                            MessageProducerproducer = session.createProducer(destination);

                            for(int i = 0; i <= 20; i++) {

                                     MapMessagemessage = session.createMapMessage();

                                     Datedate = new Date();

                                     message.setLong("count",date.getTime());

                                     Thread.sleep(1000);

                                     producer.send(message);

                                     System.out.println("--发送消息:" +date);

                            }

                            Thread.sleep(2000);

                            session.commit();

                            session.close();

                            connection.close();

                   }catch (JMSException e) {

                            e.printStackTrace();

                   }catch (InterruptedException e) {

                            e.printStackTrace();

                   }

         }

}

创建消费者

package mq.p2p;

import java.util.Date;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.Destination;

import javax.jms.JMSException;

import javax.jms.MapMessage;

import javax.jms.Message;

import javax.jms.MessageConsumer;

import javax.jms.MessageListener;

import javax.jms.Session;

import org.apache.activemq.ActiveMQConnection;

import org.apache.activemq.ActiveMQConnectionFactory;

 

public classCustomer {

    public static void main(String[] args) {

        Stringuser = ActiveMQConnection.DEFAULT_USER;

        Stringpassword = ActiveMQConnection.DEFAULT_PASSWORD;

        Stringurl = ActiveMQConnection.DEFAULT_BROKER_URL;

        Stringsubject = "test.queue";

        ConnectionFactoryconnectionFactory = new ActiveMQConnectionFactory( user, password, url);

        Connectionconnection;

        try {

            connection= connectionFactory.createConnection();

            connection.start();

            final Session session =connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);

            Destinationdestination = session.createQueue(subject);

            MessageConsumermessage = session.createConsumer(destination);

            message.setMessageListener(new MessageListener() {

                publicvoid onMessage(Message msg){

                    MapMessagemessage = (MapMessage) msg;

                    try {

                        System.out.println("--收到消息:" +new Date());

                        session.commit();

                    }catch(JMSException e) {

                        e.printStackTrace();

                    }

                }

            });

            Thread.sleep(30000);

            session.close();

            Thread.sleep(30000);

            connection.close();

            Thread.sleep(30000);

        }catch(JMSException e) {

            e.printStackTrace();

        }catch(InterruptedException e) {

            e.printStackTrace();

        }

    }

}

 

package mq.p2p;

 

import java.util.Date;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.Destination;

import javax.jms.JMSException;

import javax.jms.MapMessage;

import javax.jms.Message;

import javax.jms.MessageConsum

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值