ActiveMQ入门

       1.JMS规范概念

       JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。   

       从百度中查询得知: JMS对象模型包含如下几个要素:

       1)连接工厂。连接工厂(ConnectionFactory)是由管理员创建,并绑定到JNDI树中。客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。
       2)JMS连接。JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。
       3)JMS会话。JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。
       4)JMS目的。JMS目的(Destination),又称为消息队列,是实际的消息源。
       5)JMS生产者和消费者。生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。
       6)JMS消息通常有两种类型
       ① 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。
       ② 发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。

       7)JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
       · StreamMessage -- Java原始值的数据流
       · MapMessage--键-值对
       · TextMessage--一个字符串对象
       · ObjectMessage--一个序列化的 Java对象
       · BytesMessage--一个未解释字节的数据流

       2.ActiveMQ下载与安装

       在写本篇文章的时候,ActiveMQ目前的最新版本是5.14.4版本,下面的入门案例中也是以5.14.4版本进行编写,若想要下载ActiveMQ的话,可以根据http://activemq.apache.org/download.html下载最新的版本。觉得到官网下载速度慢的话,也可以点击下activemq5.14.4载笔者上传到csdn的activemq5.14.4版本。

       下载下来解压之后进入bin目录,会看到以下文件:

       

        根据电脑的位数情况选择对应的activemq.bat批处理文件,运行之后结果如下:

   

     能看到上面这些信息表示已经成功启动了ActiveMQ,如果在启动过程中出现闪退或者异常信息,请检查一下:

     1.JDK安装与配置是否有问题

     2.启动的activemq.bat批处理文件是否正确,如果是xp系统的话,直接使用bin目录下的即可。

     3.自行百度异常。

    关闭activemq:ctrl+shift+c 之后再提示中输入Y确认关闭;

     启动成功之后打开浏览器输入:http://localhost:8161/admin进入控制台配置页面;登陆之后会要求你输入用户名和密码,默认的用户名和密码是:admin/admin。如果你想修改用户名和密码的话,在conf/jetty-realm.properties中修改即可。输入用户名密码登陆之后首页如下:

     

切换到Queue视图:


       上图列表的意思大概如下:

可以自行新增一个队列,比如NewQueue;在session.createQueue(QueueName)中指定一个队列。


      3.ActiveMQ案例

      先说明几个需要注意的地方:

      1.为了模拟activemq实现消息传送的过程,我们开启两个myeclipse,分别为发送端和接收端。

      2.在发送端和接收端中都如要导入对activemq-all-5.14.4.jar包的引用,这个jar包在apache-activemq-5.14.4目录下。

      3.发送端和接收端的jre版本需要为1.6以上,不然会报错。笔者使用的是jdk1.8

      发送端:

package yzr;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Sender {
	//发送消息数量
    private static final int SEND_NUMBER = 5;

    public static void main(String[] args) {
        ConnectionFactory connectionFactory;
        Connection connection = null;
        Session session;
        Destination destination;
        MessageProducer producer;
        String user=ActiveMQConnection.DEFAULT_USER;//默认用户名是admin
        String password=ActiveMQConnection.DEFAULT_PASSWORD;//默认密码是admin
        String url="tcp://localhost:61616";//tcp协议连接
        connectionFactory = new ActiveMQConnectionFactory(user,password,url);
        try {
            //得到连接对象
            connection = connectionFactory.createConnection();
            connection.start();
            // 获取操作连接
            session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            // 指定队列的消息源
            destination = session.createQueue("TestQueue");
            // 消息发送者对象
            producer = session.createProducer(destination);
            // 设置传说模式为不持久化
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            // 发送消息
            sendMessage(session, producer);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != connection)
                    connection.close();
            } catch (Throwable ignore) {
            }
        }
    }

    public static void sendMessage(Session session, MessageProducer producer)
            throws Exception {
        for (int i = 1; i <= SEND_NUMBER; i++) {
        	// 发送文本消息
            TextMessage message = session
                    .createTextMessage("ActiveMq " + "MessageContent " + i);
            //控制台输出发送信息内容
            System.out.println("发送消息:" + "ActiveMq " + "MessageContent " + i);
            producer.send(message);
        }
    }
}
         接收端:

package yzr;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Receiver {
    public static void main(String[] args) {
        ConnectionFactory connectionFactory;
        Connection connection = null;
        Session session;
        Destination destination;
        //消息接收者
        MessageConsumer consumer;
        connectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD,
                "tcp://localhost:61616");
        try {
            connection = connectionFactory.createConnection();
            connection.start();
            session = connection.createSession(Boolean.FALSE,
                    Session.AUTO_ACKNOWLEDGE);
            //队列消息源
            destination = session.createQueue("TestQueue");
            consumer = session.createConsumer(destination);
            while (true) {
                //设置接收者接收文本消息的时间
                TextMessage message = (TextMessage) consumer.receive(100000);
                if (null != message) {
                    System.out.println("收到消息:" + message.getText());
                } else {
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != connection)
                    connection.close();
            } catch (Throwable ignore) {
            }
        }
    }
}

启动发送端进行发送消息:


      这时看到控制台的Queue视图:

如果此时activemq服务器关闭了,那么消息会清零,因为在发送端中指定了发送模式为不持久化。如果需要持久化,选择发送的模式为持久化模式即可。

启动接收端每一百秒从activemq中获取一次消息数据:



案列源代码点击下载案列代码


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值