zoukankan      html  css  js  c++  java
  • Java之JMS学习

    消息中间件

    关注与消息的发送和接收,利用高效可靠的异步消息传递机制,集成分布式系统的软件。

    JSM概念

    JMS(JAVA Message Service)java消息服务, 是一个java平台中关于面向消息中间件的API,用于在两个应用程序之间或分布式系统中发送消息, 进行异步通信。注:它仅仅是一种规范。JMS允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。在J2EE架构模式中,有消息服务者模式,用于实现消息与应用直接的解耦。

    JMS优势

    JMS天生就是异步的,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端。
    JMS保证消息只会递送一次。大家都遇到过重复创建消息问题,而JMS能帮你避免该问题。

    JMS消息传递模型

    消息模型:在JMS标准中,有两种消息模型P2P(Point to Point),Pub/Sub(publish/subscribe)。
    P2P模式:

    P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。

    P2P的特点:
    每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)。
    发送者和接收者之间在时间上没有依赖性,当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列。
    接收者在成功接收消息之后需向队列应答成功 ,如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式。

    Pub/Sub模式:

    包含主题(Topic),发布者(Publisher),订阅者(Subscriber),多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

    Pub/Sub的特点:
    每个消息可以有多个消费者。
    发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
    为了消费消息,订阅者必须保持运行的状态。为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

    消息消费

    在JMS中,消息的产生和消费都是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。

    同步:订阅者或接收者通过receive方法来接收消息,receive方法在接收到消息之前将一直阻塞;
    异步:订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。

    消息头

    我们可以给消息设置自定义属性,这些属性主要是提供给应用程序的。对于实现消息过滤功能,消息属性非常有用,JMS API定义了一些标准属性,JMS服务提供者可以选择性的提供部分标准属性。JMS消息头预定义了若干字段用于客户端与JMS提供者之间识别和发送消息。

    消息体

    消息体中,JMS API定义了五种类型的消息格式,不同的消息类型如下:
    Text message: javax.jms.TextMessage:表示一个文本对象。
    Object message : javax.jms.ObjectMessage:表示一个JAVA对象。
    Bytes message : javax.jms.BytesMessage:表示字节数据。
    Stream message : javax.jms.StreamMessage:表示java原始值数据流。
    Map message : javax.jms.MapMessage:表示键值对。

    JMS消息监听器

    JMS消息监听器是消息的默认事件处理者,他实现了MessageListener接口,该接口包含一个onMessage方法,在该方法中需要定义消息达到后的具体动作。通过调用setMessageListener方法我们给指定消费者定义了消息监听器。

    JMS提供者

    要使用Java消息服务,你必须要有一个JMS提供者,管理会话和队列。现在既有开源的提供者也有专有的提供者。
    开源的提供者包括:ActiveMQ、Kafka、阿里的RocketMQ等。

  • 相关阅读:
    Docker 学习笔记
    Docker 镜像加速器(如何加速下载)
    Simple-DQN代码的理解笔记
    c语言NULL和0区别及NULL详解
    C 语言的 const 指针,指针的const有什么不同
    Edge和Level触发的中断
    尚硅谷设计模式笔记-适配器模式
    nginx服务器部署dist文件夹
    nginx服务器部署dist文件夹
    Jexl表达式引擎-根据字符串动态执行JAVA.md
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/11014759.html
Copyright © 2011-2022 走看看