JSM

JSM学习笔记(只是为了记录just for 随记)

一、jsm:(java message service )java 消息服务,用于两个应用程序之间或者分布式系统之间进行消息的异步收发,是一个与具体平台无关的API,类似于JDBC(java database connectivity)。

二、点对点模型(pint to point)和发布订阅模型(publish/subscribe)
点对点模型:
这里写图片描述

发布订阅模型:
这里写图片描述

三、point to point 点对点消息模型特点:每条消息只能被一个消费者消费,当消费者消费消息之后需要向消息队列做应答即收到了消息这样这条消息就会在队列中消失,别的消费者就不能再消费这条消息了;publish/subscribe发布订阅的特点:每条消费者可以有多个消费者,即每条消息可以被多个消费者订阅;

四、消费消息的方式:
(同步消费):订阅者或者消费者调用receive方法来接收消息,receive方法在接收到消息之前将一直是阻塞的;
(异步消费):订阅者或者消费者注册一个消息监听器,当消息到达之后系统自动调用监听器的onmessage方法;

应用程序A将消息发送到服务器,然后应用程序B从服务中获取消息。
这里写图片描述

五、开始进行demo之路:
1、消息中间件activeMQ(MQ:MessageQueue 消息队列)的安装,下载zip解压即可
消息中间件的用途和特点:
1、建立网络通道,消息的可靠传输(不重复不丢失),实现跨平台。
activeMQ下载官方地址:http://activemq.apache.org/
我下载的activeMQ版本是5.15.2

这里写图片描述

目录的:
bin 存放脚本文件
conf 存放基本配置文件
data 存放的是日志文件
docs 存放说明文档
examples 存放简单的实例
lib 存放activeMQ所需的jar包
webapps 存放项目的目录
activemq-all-5.15.2.jar是在项目中用到activemq的时候直接将这个jar包导入就可以了

2、启动activeMQ
打开bin目录下可以看到有win32 和win64 两个文件夹,根据你电脑的操作系统来选择,打开文件夹,双击 activemq.bat
这里写图片描述

图中有我们activemq的按装地址 和浏览器访问的地址localhost:8191 账号:admin 密码:admin

activeMQ的tcp连接端口是61616 可以在dows命令行的执行netstat -ano|findstr “61616”看是都启动成功

这里写图片描述

在浏览器输入localhost :8161 点击broker输入用户名和密码看到下面皆可以了

这里写图片描述

3、一个简单point to point 的activeMQ 的demo

使用eclipse建立一个java项目:在项目中导入activeMQ的依赖包在我们下在的activeMQ解压包里可以找到
这里写图片描述

JSMProducer.java

package com.zrr.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;
import org.apache.activemq.camel.component.ActiveMQComponent;

/**
 * 生产者(发送消息)
 * @author Admin
 *
 */
public class JSMProducer {

    //默认连接用户名
    private  static final String userName=ActiveMQConnection.DEFAULT_USER;
    //默认连接密码
    private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;
    //默认连接地址
    private static final String brokerUrl = ActiveMQConnection.DEFAULT_BROKER_URL;
    //发送消息数量
    private static final int sendNum = 5;

    public static void main(String[] args){
        //连接工厂
        ConnectionFactory connectionFactory;
        //连接
        Connection connection = null;
        //会话 消息发送或者接收的线程
        Session session;
        //消息的目的地
        Destination destination;
        //消息生产者
        MessageProducer messageProducer;
        //实例化连接工厂
        connectionFactory = new  ActiveMQConnectionFactory(userName, password, brokerUrl);

        try{
            //通过连接工厂获取连接
            connection = connectionFactory.createConnection();
            //启动连接
            connection.start();
            //创建session
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            //创建一个名为HelloWorld的消息列队
            destination = session.createQueue("point_demo");
            //消息生产者
            messageProducer = session.createProducer(destination);

            //发送消息
            sendMessage(session,messageProducer);
            //
            session.commit();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(connection !=null){
                try {
                    connection.close();
                } catch (JMSException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 发送消息
     * @param session
     * @param messageProducer 消息生产者
     * @throws JMSException 
     */
    public static void sendMessage(Session session,MessageProducer messageProducer) throws JMSException{
        for(int i=0 ;i<sendNum;i++){
            //创建一条文本信息
            TextMessage message = session.createTextMessage("ActiveMQ 生产者发送消息"+i);
            //打印生产者发送的消息
            System.out.println("打印发送消息: activemq发送消息"+i);
            //通过消息生产者发送消息
            messageProducer.send(message);
        }
    }
}

JSMComsumer

package com.zrr.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;

/**
 * 消费者(消息的接收者)
 * @author Admin
 *
 */
public class JSMConsumer {

    private static  String userName = ActiveMQConnection.DEFAULT_USER;//默认用户名
    private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;//默认密码
    private static final String brokerUrl = ActiveMQConnection.DEFAULT_BROKER_URL;//默认连接地址



    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ConnectionFactory connectionFactory;//链接工厂

        Connection connection;//连接

        Session session;//会话(接收者或者发送者的消息线程)

        Destination destination;//消息目的地

        MessageConsumer messageConsumer;//消息消费者

        //实例化连接工厂
        connectionFactory = new ActiveMQConnectionFactory(userName, password, brokerUrl);

        try{
            //通过连接工厂获取连接
            connection = connectionFactory.createConnection();
            //启动连接
            connection.start();
            //创建会话
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            //创建一个连接HelloWorld的消息列队 这里连接 的消息列队必须和消息生产者的消息列队是一样的不然消费者是找不到消息队列的
            destination = session.createQueue("point_demo");

            //创建消息消费者
            messageConsumer = session.createConsumer(destination);

            while(true){
                TextMessage textMessage = (TextMessage) messageConsumer.receive(100000);
                if(textMessage != null){
                    System.out.println("打印收到的消息:" + textMessage.getText());
                }else {
                    break;
                }
            }

        }catch(Exception e){
            e.printStackTrace();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值