JMS

在一些场景下RPC的同步方式可能不太适合业务逻辑的处理,并且这种方式在某些场景下会导致业务的紧耦合

基于异步交互模型的JMS解决了RPC产生的紧耦合问题,它提供了一个可以通过网络访问的抽象消息队列。

结构

JMS应用由以下几个部分组成:

  • A JMS provider: A messaging system that implements the JMS specification.
  • JMS clients: Java applications that send and receive messages.
  • Messages: Objects that are used to communicate information between JMS clients.
  • Administered objects: Preconfigured JMS objects that are created by an administrator for the use of JMS clients.

消息传输模型

JMS支持两种消息模型

  • point to point (queuing)

  • publish-subscribe (topic)

消息体组成

JMS应用中,一个消息由三部分组成:headerpropertiesbody

  • header(required) 消息头,必填,包含了路由信息和标识信息。
  • properties(optional) 属性,可选,由key-value对构成,可以看做是对header的扩展。
  • body(optional) 消息体,可选,包含真正要传递的数据。JMS规范定义了JMS Provider必须要支持的六种消息类型:
    • Message:没有消息正文的消息。
    • StreamMessage:包含java基础类型的流,按顺序读写。
    • MapMessage:消息体为键值对,不定义顺序。
    • TextMessage:文本消息,消息体为字符串,例如XML消息。
    • ObjectMessage:消息体为一个序列化的java对象。
    • ByteMessage:字节消息,正文为未解释的字节。

消息的生产和消费-编程模型



点对点队列API



发布-订阅API

消息的生产

  1. 使用JNDI找到ConnectionFactory对象,或者直接实例化一个ConnectionFactory,最终得到一个QueueConnectionFactory或者TopicConnectionFactory的实例,通过这个实例为生产者创建连接。

    使用JNDI查找连接工厂对象:

    Context ctx = new InitialContext();
    ConnectionFactory cf1 =(ConnectionFactory)ctx.lookup("jms / QueueConnectionFactory");
    ConnectionFactory cf2 = (ConnectionFactory) ctx.lookup("/jms/TopicConnectionFactory");

    直接实例化连接工厂:

    ConnectionFactory connFactory = new com.sun.messaging.ConnectionFactory();
  2. 使用ConnectionFactory创建连接Connection

    Connection connection = connFactory.createConnection();

    注意:调用结束后调用connection.close()关闭所有已经创建的连接。

  3. 使用Connection对象创建Session。这些Session将一组发送和接收合并到一个原子单元内,并提供事务上下文。

    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    createSession()方法有两个参数:第一个表示session是否使用事务,第二个表示session在成功收到消息后自动确认。

  4. 使用JNDI查找Destination对象,或者直接实例化Destination

    客户端使用Destination对象来指定它消费的消息的来源或者它生产的消息的目标。在point to point消息传递中,DestinationQueue,在消息传递的发布/订阅模型中,为Topic

    JNDI方式:

    Destination dest = (Queue) ctx.lookup("jms/SomeQueue");

    直接实例化:

    Queue q = new com.sun.messaging.Queue("world");
  5. 通过SessionDestination创建MessageProducerMessageProducer用来发送消息。下面的代码中没有说明Destination的使用,但是每一个消息必须指定Destination

    MessageProducer producer = session.createProducer(SomeQueue OR SomeTopic);

    完成生产者创建之后,就可以使用生产者发送消息

    producer.send(message);

消息的消费

1.2.3.4 同Producer

消息的消费分为同步消费和异步消费两种。同步消费是使用receive()方法,而异步消费则使用消息监听器,MessageListner

  1. 通过SessionDestination创建MessageConsumerMessageProducer用来接收消息。

    MessageConsumer consumer = session.createConsumer(SomeQueue or SomeTopic);

    如果是一个发布/订阅模式的消费者,可以使用Session.createDurableSubscriber()创建一个持久的topic订阅者。

    Producer同样,创建之后可以使用其功能,不同的是MessageConsumer不是主动模式,而是被动模式。在启动连接之前,消息不会传递,必须先启动连接,才能接收消息。

    connection.start();
    Message msg = consumer.receive();

    consumer.receive()可传入一个long型参数来指定超时时间,单位是ms

    注意:使用receive()方法是同步消费,异步消费需要使用消息监听器。

  2. 如果需要异步通信,需要实例化MessageListener并在MessageConsumer中注册这个监听器。

    MessageListener listener = new MyListener();
    consumer.setMessageListener(listener);

    为了避免丢失消息,注册监听器后,调用连接的start()方法,当消息开始传递,JMS会自动调用监听器的onMessage()接收消息。

JMS Java消息服务(Java Message Service)的更多相关文章

  1. asp.net core 阿里云消息服务(Message Service,原MQS)发送接口的实现

    最近在后台处理订单统计等相关功能用到了大力的mqs,由于官方没有实现asp.net core的sdk,这里简单实现了发送信息的功能,有兴趣的可以参考实现其他相关功能 using System;usin ...

  2. java消息服务学习之JMS概念

    JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. ...

  3. Java消息服务

    什么是消息? 消息是可编程实现两端通信的机制.通常的一些消息技术如:TCP/IP Sockets.管道.文件.共享存储. Java消息服务 Java消息服务,即Java Message Service ...

  4. Java消息服务初步学习(基于Spring In Action的整理)

    几个名词 Java消息服务(Java Message Service)是一个Java标准,定义了使用消息代理的通用API. 消息代理(message broker):类似于邮局的作用,确保消息被投递到 ...

  5. JMS(Java消息服务)与消息队列ActiveMQ基本使用(一)

    最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢.最近几天研究了下,把自己所有看下来的文档和了解总结一下. 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:JMS即Java消 ...

  6. 【转载】JAVA消息服务JMS规范及原理详解

    转载:https://www.cnblogs.com/molao-doing/articles/6557305.html 作者: moyun- 一.简介 JMS即Java消息服务(Java Messa ...

  7. JAVA消息服务JMS规范及原理详解

    JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...

  8. JMS(Java消息服务)

    JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM:指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来 ...

  9. ActiveMQ学习总结(5)——Java消息服务JMS详解

    JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互. JMS的编程过程很简单,概 ...

随机推荐

  1. ASP.NET MVC 此安装不支持该项目类型解决方法

    http://www.cnblogs.com/younggun/archive/2011/03/03/1969498.html ASP.NET MVC  此安装不支持该项目类型解决方法 打开 .csp ...

  2. C++原型模式和模板模式

    DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.其中有一个词很重要,那就是拷贝.可以说,拷贝是原型模式的精髓所在.举个现实中的例子来介绍原型模式.找工作的时候,我们需 ...

  3. SQL优化:索引的重要性

    开篇小测验 下面这样一个小SQL 你该怎么样添加最优索引 两个表上现在只有聚集索引 bigproduct 表上已经有聚集索引 ProductID bigtransactionhistory 表上已经有 ...

  4. UVALive 2218 Triathlon

    https://vjudge.net/problem/UVALive-2218 题意: 铁人三项比赛,每项比赛长度未定,已知每个选手每项比赛的平均速度. 设计每项比赛的长度,让其中某个特定选手获胜. ...

  5. js 隐藏代码生成工具

    昨天写了篇<js 奇葩技巧之隐藏代码>,今天来写个工具方便大家生成吧.在昨天算法基础上优化了解码算法,采用立即函数运行.有两种模式可供选择: 1. eval  全局模式,比如你定义的 va ...

  6. Javascript你不知道的那些事!(数字计算篇-变态篇)无意中聊天发现的一些奇怪的事情

    javascript:alert(0.1 + 0.2) 如果看到这样一道题你会怎么思考了!大家肯定第一反应0.3,但是考虑到我已经这样问了!那么幼稚的答案我会专门写篇文章吗 然后人就开始折磨自己了会不 ...

  7. ASP.NET实现二维码(QRCode)的创建和读取

    一.项目引用QRCode的DLL文件(ThoughtWorks.QRCode.dll)   二.ASPX页面(两个jquery的js文件请自行去官网下载):   [html]  <html xm ...

  8. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  9. CodeForces Contest #1114: Round #538 (Div. 2)

    比赛传送门:CF #1114. 比赛记录:点我. 又 FST 了. [A]Got Any Grapes? 题意简述: 有三个人,第一个人需要吃绿色葡萄至少 \(a\) 个,第二个人需要吃绿色和紫色葡萄 ...

  10. spring事务详解(一)初探讨

    一.什么是事务 维基百科:数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成.理解:事务(Transaction)是数据库区别于文件系统的重要特性之一.传 ...