JMS消息中间件

JMS(目前Spring框架整合的Spring-jms 使用最稳定最新的版本是5.1.3)**

JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS是一种与厂商无关的 API,用来访问收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。

消息中间件:
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色有Producer(生产者)、Consumer(消费者)

**常见的消息中间件框架**

(1)ActiveMQ(支持的协议最多,持久化支持数据库,万级,唯一支持标准JMS规范的框架)

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。我们在本次课程中介绍 ActiveMQ的使用。

(2)RabbitMQ(万级)

AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。

(3)ZeroMQ(万级)

史上最快的消息队列系统,ZeroMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演这个服务器角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果宕机,数据将会丢失。其中,Twitter的Storm 0.9.0以前的版本中默认使用ZeroMQ作为数据流的传输(Storm从0.9版本开始同时支持ZeroMQ和Netty作为传输模块)。

(4)Kafka(唯一吞吐量10万级,兼容zookeeper)

Apache下的一个子项目 。特点:高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统。适合处理海量数据。

(5) Jafka(kafka的升级版本性能比kafka还高,但语言只支持java,不适合大数据项目)

Jafka是一个开源的、高性能的、跨语言分布式消息系统,使用GitHub托管。

Jafka 最早是由Apache孵化的Kafka(由LinkedIn捐助给Apache)克隆而来。

jms的消息类型种类

1.TextMessage–一个字符串对象

2·MapMessage–一套名称-值对

3·ObjectMessage–一个序列化的 Java 对象

4· BytesMessage–一个字节的数据流

5· StreamMessage – Java 原始值的数据流

1.创建一个TextMessage

TextMessage message;

message = session.createTextMessage();

2.解包一个TextMessage

去解包一个TextMessage类型的消息,客户端可以使用Message.getText方法:

String stockInfo;

stockInfo = message.getText();

3.创建一个BytesMessage

byte[] stockData;

BytesMessage message;

message = session.createBytesMessage();

message.writeBytes(stockData);

4.解包一个BytesMessage

当接收到一个ByteMessage时,可以使用下面的方式来解包:

byte[] stockInfo;

int length;
length = message.readBytes(stockData);
消息体被拷贝到字节数组,客户端程序可以读取这个树组来解释数据。

5.创建一个MapMessage

MapMessage message;

message = session.createMapMessage();
…其他代码
message.setString(“Name”, “CN-Java”);

message.setDouble(“Value”, stockValue);

message.setLong(“Time”, stockTime);

message.setDouble(“Diff”, stockDiff);
message.setString(“Info”, “Recent server announcement causes market interest”);

6.解包一个MapMessage

stockName = message.getString(“Name”);

stockDiff = message.getDouble(“Diff”);

stockValue = message.getDouble(“Value”);

stockTime = message.getLong(“Time”);
如果你想得到整个元素的列表,可以使用MapMessage.getMapNames方法来获得。

7.创建一个StreamMessage

和MapMessage相似,一个应用程序可以按序列发送多个字段到一个消息中,这些字段都是原始类型的,要做这些,你可以使用一个StreamMessage,

message.writeString(stockName);

message.writeDouble(stockValue);

message.writeLong(stockTime);
message.writeDouble(stockDiff);
message.writeString(stockInfo);

8.解包一个StreamMessage

StreamMessage中的元素必须按照被写入的顺序读出:

stockName = message.readString();

stockValue = message.readDouble();

stockTime = message.readLong();

stockDiff = message.readDouble();

stockInfo = message.readString();

9.创建一个ObjectMessage

ObjectMessage message;

message = session.createObjectMessage();

message.setObject(stockObject);

10.解包ObjectMessage

去解包ObjectMessage,使用ObjectMessage.getObject得到对象,一但对象被取出来,客户端程序使用Java造型语句将对象还原成原始对象。
StockObject stockObject;
stockObject = (StockObject)message.getObject();

jms消息传递类型

**点对点(Paoint to Point PTP)**
		**producer -queue-consumer**
		一个生产者对应一个消费者
		类似私信发信息的人和收信息的人是一对一的关系,只有收信息的人可以获取所发送的信息

发布/订阅(Publish/subscribe)
	producer-topic-consumer
	一个生产者产生消息并行发送后,可以由多个消费者进行接收
	类似群聊只要是''订阅''被加进群的人,都可以收到某一个群成员所发送的群消息是一对所有的.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值