一、概念

JMS即Java消息服务(baiJava MessageService)应用程序接口是一个Java平台du中关于面向消息中间件(MOM)的API,用于zhi在两个dao应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
  JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于JDBC(Java Database
Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商都支持 JMS,包括 IBM 的 MQSeries、BEAWeblogicJMS service和 Progress 的 SonicMQ,这只是几个例子。

JMS使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,
它们分别携带:

  • 简单文本(TextMessage)
  • 可序列化的对象 (ObjectMessage)
  • 属性集合 (MapMessage)
  • 字节流 (BytesMessage)
  • 原始值流 (StreamMessage)
  • 还有无有效负载的消息 (Message)。

二、消息生产者编码

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import javax.jms.Connection;
import javax.jms.JMSException;

public class JMSProduce {

    public static final String ACTIVEEMQ_URL = "tcp://192.168.56.10:61617";
    public static final String QUEUE_NAME = "queue01";

    public static void main(String[] args) throws JMSException {
        //创建连接工厂,按照指定的URL地址,采取默认的用户名密码
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVEEMQ_URL);

        //获取连接connecion并启动访问
        Connection connection = connectionFactory.createConnection();
        connection.start();
        //创建会话session
        //两个参数,第一个事务、第二个签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //创建目的地(queue/topic)
        Queue queue = session.createQueue(QUEUE_NAME);

        //创建生产者,传入地址
        MessageProducer producer = session.createProducer(queue);
        //创建消息
        for(int i=1;i<3;i++){
            Message message = session.createTextMessage("message"+i);
            //生产者发送消息
            producer.send(message);

        }
        System.out.println("success");


        //关闭资源
        producer.close();
        session.close();
        connection.close();

    }
}

java如何使用jms java jms使用_java如何使用jms


java如何使用jms java jms使用_java如何使用jms_02

三、消息消费者编码

package T1;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;


public class JMSConsumer1 {
    public static final String ACTIVEEMQ_URL = "tcp://192.168.56.10:61617";
    public static final String QUEUE_NAME = "queue01";

    public static void main(String[] args) throws JMSException {
        System.out.println("queue01");
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ACTIVEEMQ_URL);


        Connection connection = connectionFactory.createConnection();
        connection.start();
        //创建服务对象session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //创建目的地Destination  --->ActiveMQ的接收点
        Queue queue =  session.createQueue(QUEUE_NAME);


        //创建生产者
        MessageConsumer messageConsumer = session.createConsumer(queue);
        while (true){
            TextMessage  message = (TextMessage) messageConsumer.receive();
            if (message != null){
                System.out.println("consumer消息接收"+message.getText());
            }else {
                break;
            }
        }
        messageConsumer.close();
        session.close();
        connection.close();
    }

}

java如何使用jms java jms使用_java_03


java如何使用jms java jms使用_System_04


依赖导入

<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all -->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>5.15.12</version>
</dependency>

两种接收消息的方式:

1.receive() 方法

同步阻塞方式,订阅者或接收者调用MessageConsumer的receive()方法来接收消息,receive在能够接收到消息之前(或超时之前)将一直阻塞

  • 无参数设置

    如图显示一直处于在线状态
  • 设置等待时延

    等待3秒后就下线了

2.通过监听的方式来接收消息

订阅者或接收者通过MessageConsumer的setMessageListenere(MessageListener
listener)注册一个消息监听器,当消息到达之后,系统自动调用监听器MessageListener的onMessage的onMessage(Message
message)方法

//监听的方式接收消息MessageListener()

         messageConsumer.setMessageListener(new MessageListener() {
             public void onMessage(Message message) {
                 if( null != message && message instanceof TextMessage){
                     TextMessage textMessage = (TextMessage) message;
                     try {
                         System.out.println("consumer消息接收"+textMessage.getText());
                     }
                     catch (Exception e){
                         e.printStackTrace();
                     }

                 }
             }
         });
         //保证控制台一直在线
        System.in.read()

java如何使用jms java jms使用_java_05

消费者消费的三种情况

1、生产者先生产 之后启动消费者1 可以消费

java如何使用jms java jms使用_java_06


java如何使用jms java jms使用_activemq_07

2、生产者先生产 之后启动消费者1 可以消费

2号消费者不能再接着消费

生产者生产

java如何使用jms java jms使用_java_08


消费者1

java如何使用jms java jms使用_java_09


消费者2

java如何使用jms java jms使用_activemq_10

3、启动2个消费者,生产6条消息

消费者1和消费者2均分消息

java如何使用jms java jms使用_java_11


java如何使用jms java jms使用_java_12

小结:JMS开发基本步骤

1.创建一个Connection factory
2.通过conneciton factory 来创建JMS connection
3.启动JMS connection
4.通过connection创建JMS session
5.创建JMS destination
6.创建JMS producer 或者创建JMS message并设置destination
7.创建JSM consumer或者是注册一个JMS message listener 8,发送或者接收JMS message(s)
9.关闭所有JMS资源

点对点消息传递域的特点:

  • 点对点的消息传递域中。目的地称为队列
  • 每个消息只能有一个消费者,类似于1对1的关系,
  • 消息的生产者和消费者之间的没有时间上的相关性,无论消费者在生产者发送消息的时候是否处于运行状态,消费者都可以提取消息。
  • 消息被消费后队列中不会存储,所以消费者不会消费到已经被消费掉的消息