Java一分钟之-JMS:Java消息服务

本文涉及的产品
大数据开发治理平台 DataWorks,不限时长
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
简介: 【6月更文挑战第11天】Java消息服务(JMS)是企业应用中实现组件解耦和异步通信的标准API。它包含点对点(P2P)和发布/订阅(Pub/Sub)两种消息模型。常见问题包括混淆消息模型、忽略事务管理和资源泄露。解决方法包括明确业务需求选择模型、使用事务确保消息可靠性以及正确关闭资源。文中提供了使用ActiveMQ的P2P模型的生产者和消费者代码示例,强调理解基础概念、避免问题以及实践是使用JMS的关键。

在现代企业应用中,组件间的解耦与异步通信至关重要,而Java消息服务(Java Message Service,简称JMS)正是为此而生。JMS提供了一套标准的API,允许应用程序创建、发送、接收和读取消息。本文将带你快速了解JMS的基本概念、常见问题、易错点及如何避免,并通过一个简单的代码示例加深理解。
image.png

JMS基础

JMS定义了两种消息模型:点对点(Point-to-Point, P2P)和发布/订阅(Publish/Subscribe, Pub/Sub)。在P2P模型中,消息从一个生产者发送到一个特定的队列,然后由一个或多个消费者接收。而在Pub/Sub模型中,消息被发布到一个主题,所有订阅了该主题的消费者都能收到消息。

常见问题与易错点

1. 混淆消息模型

开发者常混淆P2P与Pub/Sub模型,导致消息传递逻辑错误。例如,在需要广播信息的场景下误用了P2P模型,导致消息只能被单个消费者接收。

避免方法:明确业务需求,选择合适的消息模型。若需一对多通信,应采用Pub/Sub模型;若需一对一且确保消息被消费,则选择P2P模型。

2. 忽略事务管理

未正确处理事务可能导致消息丢失或重复消费。例如,生产者发送消息后系统崩溃,但消息已被发送,导致消息状态不一致。

避免方法:利用JMS的事务特性或ACK机制保证消息的可靠传输。确保在业务逻辑成功执行后才提交事务或确认消息。

3. 资源泄露

忘记关闭连接、会话或消息生产者/消费者,会导致资源无法释放,长期运行可能耗尽系统资源。

避免方法:使用try-with-resources语句或在finally块中确保资源被正确关闭。

示例代码

下面是一个使用ActiveMQ作为消息代理,实现P2P模型的简单示例。

生产者代码

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;

public class JMSProducer {
   
   
    public static void main(String[] args) throws Exception {
   
   
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        try (Connection connection = factory.createConnection();
             Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
             MessageProducer producer = session.createProducer(session.createQueue("MyQueue"))) {
   
   
            connection.start();
            TextMessage message = session.createTextMessage("Hello, JMS!");
            producer.send(message);
            System.out.println("Message sent.");
        }
    }
}

消费者代码

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;

public class JMSConsumer {
   
   
    public static void main(String[] args) throws Exception {
   
   
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        try (Connection connection = factory.createConnection();
             Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
             MessageConsumer consumer = session.createConsumer(session.createQueue("MyQueue"))) {
   
   
            connection.start();
            while (true) {
   
   
                Message message = consumer.receive();
                if (message instanceof TextMessage) {
   
   
                    TextMessage textMessage = (TextMessage) message;
                    System.out.println("Received: " + textMessage.getText());
                } else {
   
   
                    break;
                }
            }
        } catch (JMSException e) {
   
   
            System.err.println("Error receiving message: " + e.getMessage());
        }
    }
}

结论

JMS是构建高可用、可扩展的企业应用的重要工具。通过理解其基本概念、注意常见问题与易错点,并通过实践掌握正确的使用方式,开发者可以有效提升系统的灵活性和稳定性。记住,选择合适的消息模型、妥善管理事务与资源,是使用JMS的关键。希望本文能帮助你在Java消息服务的探索之路上更进一步。

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
消息中间件 存储 Java
Java从入门到精通:3.1.1掌握EJB、JPA、JMS等Java EE核心技术
Java从入门到精通:3.1.1掌握EJB、JPA、JMS等Java EE核心技术
|
消息中间件 SQL XML
ActiveMQ系列:详细讲讲JMS(Java Messaging Service)
一条持久性的消息:应该被传送“一次仅仅一次”,这就意味者如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。一条非持久的消息:最多会传送一次,这意味这服务器出现故障,该消息将永远丢失。
185 0
ActiveMQ系列:详细讲讲JMS(Java Messaging Service)
|
消息中间件 网络协议 Java
|
Web App开发 消息中间件 Java
轻松搞定RabbitMQ开篇:Java消息队列与JMS的诞生
Java 帝国之消息队列 原创: 刘欣 码农翻身 2017-02-06 张家村的历史 Java 帝国的张家村正在迎来一次重大的变革。
|
消息中间件 Java 网络协议
java之JMS
  一、简介:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
1201 0
|
消息中间件 Java API
三:JMS消息服务规范
一:JMS是什么?--->JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API--->用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
1300 0