01 JMS基本概念

JMS是什么?

JMS Java Message Service,Java消息服务,是java EE 的一种技术
JMS规范
JMS定义了java中访问消息中间件的接口,并没有给予实现,实现JMS接口的消息中间件称为JMS provider,例如ActiveMQ

JMS provider:实现JMS接口和规范的消息中间件
JMS message:JMS的消息,JMS消息由一下三部分组成
1:消息头:每个消息头字段都有相应的getter和setter方法
2:消息属性:如果需要除消息头字段以外的值,那么可以使用消息属性
3:消息体:封装具体的消息数据
JMS producer:消息生产者,创建和发送JMS消息的客户端应用。
JMS consumer:消息消费者,接收和处理JMS消息的客户端应用。
消息的消费者可以采用以下两种方法之一:
1.同步消费:通过调用消费者的receive方法从目的地中显式提取消息,receive 方法可以一直阻塞到消息到达
2.异步消费:客户可以为消费者注册一个消息监听器,以定义在消息到达时所采取的动作
JMS domains:消息传递域,JMS规范中定义了两种消息传递域:点对点(PTP)消息传递域和发布/订阅消息传递域(publish/subscribe)简写(pub/sub)
1.PTP消息传递域特点如下:

1。每个消息只能有一个消费者。
2。消息的生产者和消费者之间没有时间上的相关性,无论消费者在生产者发送消息的时候是否处于运行状态,他都可以提取消息。

2.发布/订阅消息传递域特点如下:

1。每个消息可以有多个消费者。
2。生产者和消费者有时间上的相关性,订阅一个主题的消费者只能消费自他订阅之后的消息。JMS规范允许客户创建持久订阅,在一定程度上放松了时间上相关性要求,持久订阅允许消费者消费他在未处于激活状态时发送的消息。
3,。在点对点消息传递域中,目的地被称为队列(queue),在发布/订阅消息传递域中,目的地被称为主题。这里写图片描述

话不多说,上代码:
PTP消息传递域:

package com.java.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;
/**
 * 生产者
 * @author zzg
 *
 */
public class JMSProducer {

    private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
    private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
    private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;

    private static int SENDNUM=10;//发送的消息数量

    public static void main(String[] args) throws JMSException {
        ConnectionFactory factory;
        Connection conn;
        Session session;
        Destination destination;//消息目的地
        MessageProducer messageProducer;//消息生产者
        factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
        conn = factory.createConnection();//创建连接
        conn.start();//启动连接
        session = conn.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
        destination = session.createQueue("first queue 1");//创建消息队列
        messageProducer = session.createProducer(destination);//创建消息生产者
        sendMessage(session, messageProducer);//开始发送消息
        session.commit();//提交事物
        conn.close();//关闭连接
    }

    /**
     * 发送消息
     * @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);
        }
    }
}
package com.java.activemq;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * 消息监听
 * @author zzg
 *
 */
public class Listener implements MessageListener{

    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("收到的消息:"+ ((TextMessage)message).getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

}
package com.java.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

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

/**
 * 消费者
 * @author zzg
 *
 */
public class JMSConsumer {
    private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
    private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
    private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;

    public static void main(String[] args) throws JMSException {

        ConnectionFactory factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
        Connection conn = factory.createConnection();// 创建连接
        conn.start();//启动连接
        Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);//创建session
        Destination destination = session.createQueue("first queue 1");//消息目的地
        MessageConsumer messageConsumer = session.createConsumer(destination);//创建消费者
        while(true){
            TextMessage textMessage = (TextMessage)messageConsumer.receive(100000);
            if(textMessage != null){
                System.out.println("接收到的消息:"+textMessage.getText());
            }else{
                break;
            }
        }
    }
}
package com.java.activemq;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

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

/**
 * 消费者
 * 第二种方式:常用
 * 使用监听方式
 * @author zzg
 *
 */
public class JMSConsumer2 {
    private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
    private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
    private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;

    public static void main(String[] args) {
        ConnectionFactory factory;
        Connection conn;
        Session session;
        Destination destination;//消息目的地
        MessageConsumer consumer;
        factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
        try {
            conn = factory.createConnection();
            conn.start();
            session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue("first queue 1");
//          Destination destination;//消息目的地
            consumer = session.createConsumer(queue);
            consumer.setMessageListener(new Listener());//注册监听
        } catch (JMSException e) {
            e.printStackTrace();
        }


    }
}

发布/订阅消息传递域

package com.java.activemq2;

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 javax.jms.Topic;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
 * 发布者-一对多
 * 测试顺序:先订阅、再发布(先启动两个consumer ,在启动producer)
 * @author zzg
 *
 */
public class JMSProducer {

    private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
    private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
    private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;

    private static int SENDNUM=10;//发送的消息数量

    public static void main(String[] args) throws JMSException {
        ConnectionFactory factory;
        Connection conn;
        Session session;
        Destination destination;
        MessageProducer producer;
        factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
        conn = factory.createConnection();
        conn.start();
        session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);
        destination = session.createTopic("first topic 1");
        producer = session.createProducer(destination);
        sendMessage(session, producer);
        session.commit();
        conn.close();

    }

    /**
     * 发送消息
     * @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);
        }
    }
}
package com.java.activemq2;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * 消息监听
 * @author zzg
 *
 */
public class Listener1 implements MessageListener{

    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("订阅者一收到的消息:"+ ((TextMessage)message).getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

}
package com.java.activemq2;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;

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

/**
 * 订阅者一
 * @author zzg
 *
 */
public class JMSConsumer1 {
    private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
    private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
    private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;

    public static void main(String[] args) {
        ConnectionFactory factory;
        Connection conn;
        Session session;
        Destination destination;//消息目的地
        MessageConsumer consumer;
        factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
        try {
            conn = factory.createConnection();
            conn.start();
            session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            destination = session.createTopic("first topic 1");
            consumer = session.createConsumer(destination);
            consumer.setMessageListener(new Listener1());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/waei08/article/details/79542081