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();
        }
    }
}
Classes contained in javax.jms.jar: javax.transaction.xa.XAResource.class javax.jms.BytesMessage.class javax.jms.Message.class javax.jms.JMSException.class javax.jms.Destination.class javax.jms.DeliveryMode.class javax.jms.Connection.class javax.jms.Session.class javax.jms.ConnectionMetaData.class javax.jms.ExceptionListener.class javax.jms.ServerSessionPool.class javax.jms.ConnectionConsumer.class javax.jms.Topic.class javax.jms.MapMessage.class javax.jms.ObjectMessage.class javax.jms.StreamMessage.class javax.jms.TextMessage.class javax.jms.MessageListener.class javax.jms.MessageProducer.class javax.jms.MessageConsumer.class javax.jms.Queue.class javax.jms.TopicSubscriber.class javax.jms.QueueBrowser.class javax.jms.TemporaryQueue.class javax.jms.TemporaryTopic.class javax.jms.ServerSession.class javax.jms.ConnectionFactory.class javax.jms.MessageNotReadableException.class javax.jms.MessageNotWriteableException.class javax.jms.QueueConnection.class javax.jms.QueueSession.class javax.jms.QueueReceiver.class javax.jms.QueueSender.class javax.jms.QueueConnectionFactory.class javax.jms.QueueRequestor.class javax.jms.TopicConnection.class javax.jms.TopicSession.class javax.jms.TopicPublisher.class javax.jms.TopicConnectionFactory.class javax.jms.TopicRequestor.class javax.jms.XAConnection.class javax.jms.XASession.class javax.jms.XAConnectionFactory.class javax.jms.XAQueueConnection.class javax.jms.XAQueueSession.class javax.jms.XAQueueConnectionFactory.class javax.jms.XATopicConnection.class javax.jms.XATopicSession.class javax.jms.XATopicConnectionFactory.class javax.jms.MessageEOFException.class javax.jms.TransactionRolledBackException.class javax.jms.MessageFormatException.class javax.jms.IllegalStateException.class javax.jms.JMSSecurityException.class javax.jms.ResourceAllocationException.class javax.jms.TransactionInProgressException.class javax.jms.InvalidDestinationException.class javax.jms.InvalidClientIDException.class javax.jms.InvalidSelectorException.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值