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

点对点队列API

发布-订阅API
消息的生产
使用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();
使用
ConnectionFactory创建连接Connection。Connection connection = connFactory.createConnection();
注意:调用结束后调用
connection.close()关闭所有已经创建的连接。使用
Connection对象创建Session。这些Session将一组发送和接收合并到一个原子单元内,并提供事务上下文。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
createSession()方法有两个参数:第一个表示session是否使用事务,第二个表示session在成功收到消息后自动确认。使用
JNDI查找Destination对象,或者直接实例化Destination。客户端使用
Destination对象来指定它消费的消息的来源或者它生产的消息的目标。在point to point消息传递中,Destination为Queue,在消息传递的发布/订阅模型中,为Topic。
JNDI方式:Destination dest = (Queue) ctx.lookup("jms/SomeQueue");
直接实例化:
Queue q = new com.sun.messaging.Queue("world");
通过
Session和Destination创建MessageProducer,MessageProducer用来发送消息。下面的代码中没有说明Destination的使用,但是每一个消息必须指定Destination。MessageProducer producer = session.createProducer(SomeQueue OR SomeTopic);
完成生产者创建之后,就可以使用生产者发送消息
producer.send(message);
消息的消费
1.2.3.4 同Producer
消息的消费分为同步消费和异步消费两种。同步消费是使用receive()方法,而异步消费则使用消息监听器,MessageListner。
通过
Session和Destination创建MessageConsumer,MessageProducer用来接收消息。MessageConsumer consumer = session.createConsumer(SomeQueue or SomeTopic);
如果是一个发布/订阅模式的消费者,可以使用
Session.createDurableSubscriber()创建一个持久的topic订阅者。和
Producer同样,创建之后可以使用其功能,不同的是MessageConsumer不是主动模式,而是被动模式。在启动连接之前,消息不会传递,必须先启动连接,才能接收消息。connection.start();
Message msg = consumer.receive();
consumer.receive()可传入一个long型参数来指定超时时间,单位是ms。注意:使用
receive()方法是同步消费,异步消费需要使用消息监听器。如果需要异步通信,需要实例化
MessageListener并在MessageConsumer中注册这个监听器。MessageListener listener = new MyListener();
consumer.setMessageListener(listener);
为了避免丢失消息,注册监听器后,调用连接的
start()方法,当消息开始传递,JMS会自动调用监听器的onMessage()接收消息。
JMS Java消息服务(Java Message Service)的更多相关文章
- asp.net core 阿里云消息服务(Message Service,原MQS)发送接口的实现
最近在后台处理订单统计等相关功能用到了大力的mqs,由于官方没有实现asp.net core的sdk,这里简单实现了发送信息的功能,有兴趣的可以参考实现其他相关功能 using System;usin ...
- java消息服务学习之JMS概念
JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. ...
- Java消息服务
什么是消息? 消息是可编程实现两端通信的机制.通常的一些消息技术如:TCP/IP Sockets.管道.文件.共享存储. Java消息服务 Java消息服务,即Java Message Service ...
- Java消息服务初步学习(基于Spring In Action的整理)
几个名词 Java消息服务(Java Message Service)是一个Java标准,定义了使用消息代理的通用API. 消息代理(message broker):类似于邮局的作用,确保消息被投递到 ...
- JMS(Java消息服务)与消息队列ActiveMQ基本使用(一)
最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢.最近几天研究了下,把自己所有看下来的文档和了解总结一下. 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:JMS即Java消 ...
- 【转载】JAVA消息服务JMS规范及原理详解
转载:https://www.cnblogs.com/molao-doing/articles/6557305.html 作者: moyun- 一.简介 JMS即Java消息服务(Java Messa ...
- JAVA消息服务JMS规范及原理详解
JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...
- JMS(Java消息服务)
JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM:指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来 ...
- ActiveMQ学习总结(5)——Java消息服务JMS详解
JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互. JMS的编程过程很简单,概 ...
随机推荐
- vmware:Could not open /dev/vmmon: No such file or directory.
Q: Could not open /dev/vmmon: No such file or directory. Please make sure that the kernel module `vm ...
- linux查看硬盘详细信息
最近公司新进了一批设备,为了弄清楚厂家有没有忽悠我们,分配给我一个任务 查看磁盘是不是二手的,window上有鲁大师啥的那么linux有什么软件吗? 答案是有的! 叫做smart 具体请查看: htt ...
- Python常用模块-摘要算法(hashlib)
Python常用模块-摘要算法(hashlib) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MD5算法参数详解 1.十六进制md5算法摘要 #!/usr/bin/env p ...
- Intellij-idea 如何编译maven工程
小编最近效应项目的要求,学习在idea上编写项目.作为一个新手遇到问题也算是正常的,重要的是把它解决,get新技能. 编写过maven工程的小伙伴们应该都知道怎么在eclipse中编译maven工程: ...
- 使用WebHelper调用Asp.net WebAPI
1.WebHelper using System; using System.Collections.Generic; using System.Collections.Specialized; us ...
- H5 Day2 练习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jQuery中Animate进阶用法(三)
progressType: Function( Promise animation, Number progress, Number remainingMs )每一步动画完成后调用的一个函数,无论动画 ...
- Linux - awk 文本处理工具三
AWK 文件打印匹配 格式示例 awk '/Tom/' file # 打印匹配到得行 awk '/^Tom/{print $1}' # 匹配Tom开头的行 打印第一个字段 awk '$1 !~ /ly ...
- RabbitMq简单应用
服务端: <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => ...
- 第9月第12天 lua_push lua_to luaL_check stack quick
1. c代码中通过lua_push 把数据压入堆栈,lua调用c函数得到数据.luaL_check是对lua_to的封装,从堆栈中获取lua代码中函数调用的数据. static int lread(l ...