zoukankan      html  css  js  c++  java
  • 01_JMS概述

    【以前的通信技术的局限性】

    在大规模和复杂的分布式系统中,传统的RMI、DCOM等中间件通信技术逐渐有了局限性,如下:

    1.同步通信:客户发出调用后,必须等待服务对象完成处理并返回结果才能继续执行。

    2.客户和服务对象的生命周期紧密耦合:客户端进程和服务对象进程都必须正常运行;由于服务对象崩溃或者网络故障导致客户的请求不可达,客户端接收异常。

    3.点对点通信:客户的一次调用只能发送给单独的某个某个目标。

    【面向消息的中间件】

    面向对象的中间件(Message Oriented Middleware ,MOM )较好地解决了以上问题。

    发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接受者。

    这种模式的特点:

    1.发送和接收是异步的,发送者无需等待;

    2.二者的生命周期未必相同:发送消息的时候接受者不一定运行,接收消息的时候,发送者不一定运行。

    3.一对多通信:对于一个消息,可以有多个接收者。

    【JMS】

    java消息服务(JMS)定义了java中访问消息中间件的接口。JMS只是接口,并没有给予实现,实现JMS接口的消息中间件成为JMS Provider,已有的消息中间件有ActiveMQ、RocketMQ、RabbitMQ等等。

    【JMS中的术语】

    [ JMS ]                     实现JMS接口的i中间件

    [ Provider ]               生产者(MessageProvider)

    [ Consumer ]            消费者( MessageConsumer )

    [ PTP ]                      点对点的消息模型(Point TO Point)

    [ Pub/Sub ]               发布/订阅的消息模型(Publish/Subscribe)

    [ Queue ]                   队列目标

    [ Topic ]                    主题目标

    [ ConnectionFactory ]  连接工厂,JMS用它创建连接

    [ Connection ]            JMS客户端到JMS Provider 的连接

    [ Desitination ]           消息的目的地

    [ Session ]                 会话,一个发送或接收消息的线程

    【JMS术语详细介绍】

    [ ConnectionFactory接口(连接工厂) ]

    用户用来创建到JMS提供者的连接的被管对象。JMS客户通过可移植性的接口访问连接,这样当下层的实现改变时候,代码不需要修改。

    管理员在JNDI名字空间中配置连接工厂,这样JMS客户才能查找到他们,根据消息类型的不同,用户将使用队列连接工厂或者主题连接工厂。

    [ Connection接口(连接) ] 

    连接代表了应用程序和消息服务器之间的通信链路。在获得了连接工厂后,就可以创建一个与JMS提供者的连接。

    根据不同的连接类型,连接允许用户创建会话,以发送和接收 队列(Queue)或主题(Topic)到目标。

    [ Desination接口(目标) ]

    目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题。

    JMS管理员创建这些对象,然后用户通过JNDI发现它们,和连接工厂一样,管理员可以创建两种类型的目标:点对点(PTP)的队列 或 发布者/订阅者模型的主题。

    [ MessageProducer 接口(消息生产者) ]

    由会话(session)创建的对象,用于发送消息到目标。用户可以创建某个目标的发送者,也可以创建一个通用的发送者,在发送消息时指定目标。

    [ MessageConsumer接口(消息消费者) ]

    由会话创建的对象,用于接收发送到目标的消息。消费者可以同步地(阻塞模式),或异步(非阻塞)接收队列或主题类型的消息。

    [ Message接口(消息) ]

    在消息消费者和消息生产者之间传送的对象,也就是说从一个应用程序传送到另一个应用程序。

    消息接口非常灵活,并提供了许多方式来定制消息内容。

    一个消息主要由三部分组成:

    1. 消息头 (必须):包含用于识别和为消息寻找路由的操作设置。

    2.一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。

    3.一个消息体(可选):允许用户创建五种类型的消息(文本消息、映射消息、字节消息、流消息、对象消息)

    [ Session接口(会话) ]

    表示一个单线程的上下文,用于发送和接收消息。

    由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的,会话的好处是它支持事务,如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才会发送这些消息。

    在提交事务之前,用户可以使用回滚操作取消这些消息。

    一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接收消息。

    【消息的格式定义】

    JMS定义了五中不同的消息正文格式,以及调用的消息类型,允许你发送并接受一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

    1. StreamMessage : Java原始值的数据流

    2. MapMessage : 一套名称-值对

    3.TextMessage : 一个字符串对象

    4.ObjectMessage : 一个序列化的Java对象

    5.BytesMessage : 一个未解释字节的数据流

  • 相关阅读:
    AcWing 125. 耍杂技的牛
    AcWing 148. 合并果子
    AcWing 907. 区间覆盖
    AcWing 908. 最大不相交区间数量
    AcWing 906. 区间分组
    AcWing 905. 区间选点
    AcWing 285. 没有上司的舞会
    AcWing 1049. 大盗阿福
    AcWing 901. 滑雪
    AcWing 91. 最短Hamilton路径
  • 原文地址:https://www.cnblogs.com/HigginCui/p/6617007.html
Copyright © 2011-2022 走看看