055、JMS

Par @Martin dans le
Tags :

我们仅了解下有这么个东西就行, 后面的 Kafka 才是我们要学的 (JMS 常用在 JavaEE 里, 而大数据领域多是用 Kafka).

概念

JMS 即 Java 消息服务 (Java Message Service) 应用程序接口, 是一个 Java 平台中关于面向消息中间件 (MOM) 的 API, 用于在两个应用程序之间, 或分布式系统中发送消息, 进行异步通信. 它便于消息系统中的 Java 应用程序进行消息交换, 并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发. Java 消息服务是一个与具体平台无关的 API, 绝大多数 MOM 提供商都对 JMS 提供支持.

JMS 由以下元素组成:

  • JMS 提供者 provider: 连接面向消息中间件, JMS 接口的一个实现. 提供者可以是 Java 平台的 JMS 实现, 也可以是非 Java 平台的面向消息中间件的适配器.
  • JMS 客户: 生产或消费基于消息的 Java 的应用程序或对象.
    • JMS 生产者: 创建并发送消息的 JMS 客户.
    • JMS 消费者: 接收消息的 JMS 客户.
  • JMS 消息: 包括可以在 JMS 客户之间传递的数据的对象
  • JMS 队列: 一个容纳那些被发送的等待阅读的消息的区域. 与队列名字所暗示的意思不同, 消息的接受顺序并不一定要与消息的发送顺序相同. 一旦一个消息被阅读, 该消息将被从队列中移走.
  • JMS 主题: 一种支持发送消息给多个订阅者的机制.

ActiveMQ

介绍

ActiveMQ 是一个完全支持 JMS 1.1 和 J2EE 1.4 规范的 JMS Provider 实现.

目前比较流行的 4 个消息队列中间件产品: ActiveMQ、RabbitMQ、Kafka 和 Redis

RabbitMQ 是一个Advanced Message Queuing Protocol (AMQP) 的开源实现, 由以高性能、可伸缩性出名的 Erlang 写成. 关于 JMS 和 AMQP 的对比参见: JMS AMQP 对比表, 简单的理解, JMS 是针对 Java 专门提出的解决方案, 而 AMQP 是通用的解决方案.

Kafka 是一种分布式的, 基于发布/订阅的消息系统. Kafka 开发语言为 Scala, 支持跨平台. 其设计主要目标如下: 以时间复杂度为 O(1) 的方式提供消息持久化能力、高吞吐率、支持 Kafka Server 间的消息分区, 及分布式消费, 同时保证消息顺序传输、支持离线数据处理和实时数据处理、支持在线水平扩展.

Redis 是一个高性能的 key-value 内存数据库, 它的出现很大程度补偿了 memcached 这类 key-value 存储的不足. 虽然它是一个数据库系统, 但本身支持 MQ 功能, 完全可以当做一个轻量级的队列服务器使用.

Java 消息服务应用程序结构支持两种模型:

  • 点对点或队列模型
    • 一个生产者向一个特定的队列发布消息, 一个消费者从该队列中读取消息
  • 发布者/订阅者模型
    • 发布者/订阅者模型支持向一个特定的消息主题发布消息, 多个消费者可以获得消息

跟 redis 的消息队列差不多的概念.

使用

ActiveMQ 解压后, 配置文件在 conf/activemq.xml 下, 其中 transportConnector 标签定义了 ActiveMQ 的通信方式.

客户端与代理 (Client-to-Broker) 之间的通信连接器称为传输连接器 (transport connectors), 用于接收和监听客户端的请求.

通过 transportConnector 来定义单个连接器, ActiveMQ 中可以使用多种协议的在不同端口上进行监听;

URI 属性定义网络协议和可选的参数, 通过 URI 将 ActiveMQ 的连接暴露给外部客户端或者其他代理进行链接.

在默认的 conf/activemq.xml 中可以看到 TCP 连接端口是 61616, 双击 bin/activemq.bat 启动 activemq 服务, 然后通过查看该端口的信息可以测试 ActiveMQ 是否成功启动 netstat -an|find "61616".

ActiveMQ 默认启动时, 启动了内置的 jetty 服务器, 提供一个用于监控 ActiveMQ 的 admin 应用: 用户名和密码都是 admin

后面怎么针对 ActiveMQ 用 Java 编程就不提了, 还是那句话: 仅了解下有这么个东西就行, 后面的 Kafka 才是我们要学的 (JMS 常用在 JavaEE 里, 而大数据领域多是用 Kafka).