JMS学习入门及activemq简单实例

1. JMS基本认识

jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。(百度百科) 
从这个介绍可以看出, jms就是用来进行消息服务和通信的。 
更多关于JMS概念的东西可以百度、google

1.1 JMS的使用场景

关于JMS的使用场景,去个简单的例子,我们通常见到的站内信息,很多就是用JMS实现, 使用消息队列来实现,由于是异步的接受消息,发送消息之后就不用一直等待回信。 一个不太恰当的比喻,就像我们发送短息给别人一样,不用管他是否开机或者怎么的,等他收到信息,我们就是有提示。类似吧。 
在java 中,java消息队列使用的场景可参考下面这为大神的总结,

java消息队列使用场景

1.2 JMS的技术选型

实现JMS的规范的中间件有很多, 在项目和实际开发中使用何种中间件呢,这个就要看自己的需求和团队的情况了,关于技术选型,请看下面这位大神

消息队列中间件的技术选型分析

2. 如何使用

明白了JMS是什么,能用来干什么,什么情况下用什么之后, 就该看看是如何来使用的了

这里就一activeMQ为例,本人自己学习的时候主要是学习的activeMQ,想到这里也感谢网上的朋友无私奉献自己的学习成果,才使得我对这个知识点能够有些了解。

2.1 ActiveMQ的几种通信方式

在activeMQ中主要有两种通讯方式:

  1. P2P(Point to Point,点对点模式)
  2. publish-subscribe(发布订阅模式)
  3. 使用对生产者和消费者的改造,实现request-response 请求相应模式

在p2p模式中主要是创建消息队列,一条消息被一个消费消费之后就不能再被选其他的消费者消费了, 
使用session.createQueue() 器模型为(以下模型图片均出自 http://shmilyaw-hotmail-com.iteye.com/blog/1897635 版权归此链接文章的作者所有,如要了解详细分析,可查看原文) 
这里写图片描述

发布订阅模式,这个过程中主要是创建一个Topic,一个Topic可以被多个的消息消费这接受,使用seesion.createTopic()模型如下: 
这里写图片描述

第三种的话,就是如果需要实现请求响应的方式的话, 把生产和消费者进行改造来实现,模型如下: 
这里写图片描述 
在JMS里面,如果要实现请求/应答的方式,可以利用JMSReplyTo和JMSCorrelationID消息头来将通信的双方关联起来。另外,QueueRequestor和TopicRequestor能够支持简单的请求/应答过程。

2.2 activeMQ实现实例

activeMQ,在我写这个笔记的时候已经发布到 5.11.0版本了,这个版本要求使用的JDK版本为1.7,我在官网看了下, 大概在5.7之后的版本都要求1.7的JDK才可以的。下面下说下activeMQ的使用步骤

  1. 在官方网站现在activemq后安装
  2. 按找doc文件夹里面的方式,命令行启动activemq
cd /安装目录/bin

activemq.bat start
  • 1
  • 2
  • 3

执行者两条命令。启动服务器,在浏览器中查看消息控制台,输入: 
http://127.0.0.1:8161/admin

3.实现消息生产者和消费者的代码

2.2.1 代码实现

按照JMS的规范,我们首先需要获得一个JMS connection factory.,通过这个connection factory来创建connection.在这个基础之上我们再创建session, destination, producer和consumer,具体步骤:

导入activemq的包获得JMS connection factory. 通过我们提供特定环境的连接信息来构造factory利用factory构造JMS connection通过connection创建JMS sessionJMS destination创建JMS producer或者创建JMS message并提供destination创建JMS consumer或注册JMS message listener发送和接收JMS message关闭所有JMS资源,包括connection, session, producer, consumer等运行测试

一个简单代码如下: 
Producer

package fun.activemq;

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 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;

        connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,
                "tcp://localhost:61616");
        try {
            connection = connectionFactory.createConnection();
            connection.start();

            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

            destination = session.createQueue("FirstQueue");

            producer = session.createProducer(destination);

            SendMsg(session, producer);

            session.commit();

        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if(null!= connection)
                connection.close();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }


    }

    public static void SendMsg(Session session,MessageProducer producer) throws Exception{
        for (int i = 1; i <= SEND_NUMBER; i++) {
            TextMessage message = session
                    .createTextMessage("ActiveMq 发送的消息" + i);
            // 发送消息到目的地方
            System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
            producer.send(message);
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

Consumer

package fun.activemq;

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 Reciver {
    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(true, Session.AUTO_ACKNOWLEDGE);

            destination = session.createQueue("FirstQueue");

            consumer = session.createConsumer(destination);

            while(true){
                TextMessage textMassage = (TextMessage) consumer.receive(100000);
                if(null != textMassage){
                    System.out.println("收到消息:"+textMassage.getText());
                }else{
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if(null!=connection){
                    connection.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

以上是一个点对点的实例,点启动reciver,然后运行sender就可以进行测试

第一部分笔记就这些,下一部分摸索下activemq和spring的整合

本文参考: 
http://shmilyaw-hotmail-com.iteye.com/blog/1897635

http://blog.163.com/sir_876/blog/static/11705223201332444647261/

http://blog.csdn.net/nightelve/article/details/16827465

感谢这些朋友的分享,文中引用到上面作者的内容的地方,版权归上述文章作者所有

ActiveMQ安装 : 1.下载:http://activemq.apache.org/download.html 最新Windows版本 2.配置jdk环境,解压ActiveMQ到本地 3.启动ActiveMQ服务器: 32位机 : 直接运行\bin\win32\activemq.bat 64位机 : 直接运行\bin\win64\activemq.bat 4.打开ActiveMQ消息管理后台系统 http://localhost:8161/admin/ 参考文章为 : HelloWorld : http://blog.csdn.net/baggio7095586/article/details/5708519 进阶 :http://haohaoxuexi.iteye.com/blog/1893038 helloworld阶段 : 一个发送消息的程序,一个接收消息的程序..实现最简单JMS交流... 监听器阶段 : ⑴MessageListener,最简单的监听器..只是拿来监听接收信息的 ⑵SessionAwareMessageListener,有个session的参数..可以拿来对接收到的信息再做响应.. ⑶MessageListenerAdapter,将消息委托交给一个普通的java类来处理.. 转化器阶段 : 实现MessageConverter接口来转换JMS对象与java对象.. 其实在使用MessageListenerAdapter时,Spring默认为我们提供了SimpleMessageConverter转换器.. 事务(无代码): 在Spring整合JMS的应用中,如果我们要进行本地的事务管理的话非常简单,只需要在定义对应的消息监听容器时指定其sessionTransacted属性为true,如: <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="queueDestination" /> <property name="messageListener" ref="consumerMessageListener" /> <property name="sessionTransacted" value="true"/> </bean> 该属性值默认为false,这样JMS在进行消息监听的时候就会进行事务控制,当在接收消息时监听器执行失败时JMS就会对接收到的消息进行回滚, 对于SessionAwareMessageListener在接收到消息后发送一个返回消息时也处于同一事务下,但是对于其他操作如数据库访问等将不属于该事务控制。 数据库跟JMS挂钩的事务先别理..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值