是什么?
JMS(java消息服务)是规范,它定义了一些规则,一些接口。具体实现由各种做这个产品的厂家或开源组织来实现。
为什么?
在JMS还没有诞生前,每个企业都会有自己的一套内部消息系统,比如项目组A需要调用到项目组B的系统,项目组B也有可能会调用到项目组C的系统。这样每个公司都有自己的一套实现。很不规范。
怎么办?
Java定义了消息服务的规范,不管哪个厂商做的消息服务的中间件,我们应用程序开发的时候都一样的去拿消息、读消息、生成消息。是一种与厂商无关的API,用来访问消息收发系统消息,类似于JDBC。
由以下元素组成:
JMS提供者:连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。
JMS客户:生产或消费基于消息的Java的应用程序或对象。
JMS生产者:创建并发送消息的JMS客户。
JMS消费者:接收消息的JMS客户。
JMS消息:包括可以在JMS客户之间传递的数据的对象
JMS队列:一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。一旦一个消息被阅读,该消息将被从队列中移走。
JMS主题:一种支持发送消息给多个订阅者的机制。
JMS应用程序结构支持两种模型:
、点对点或队列模式:一对一的,我发过去消息,你就接受。生产者指定那个队列去生产的,消费者也是指定那个队列去接受的
2、发布者/订阅者模式:类似微博里面,我订阅了一个主题,我们订阅了那个主题的人都可以看到订阅的更新
Activemq简单介绍:
1、Activemq是一个软件,是一个服务器,要启动起来,我们的程序作为生产者和消费者。
2、当activemq重启的时候,之前发的message都不见了,是因为activemq没有做持久化处理。
3、Activemq是单机的,在大数据领域使用kafka,kafka是分布式的,相当于大的缓冲池,数据有快有慢,在点击量大的时候,数据量非常大,如果不经过中间缓存,之间发送给strom处理的话,就会过载,因为一台服务器的处理能力有限,速度就匹配不上。Activemq和kafka本质上的工作差不多。
4、Activemq消息服务支持跨语言,意味着我的应用程序可以是java、php、c++、c,那两者
之间的通信就得通过跨语言协议来做。
<transportConnectors>
<transportConnector name="openwire" uri="tcp://localhost:61616"/>
<transportConnector name="ssl" uri="ssl://localhost:61617"/>
<transportConnector name="stomp" uri="stomp://localhost:61613"/>
<transportConnector uri="http://localhost:8081"/>
<transportConnector uri="udp://localhost:61618"/>
</transportConnectors>
Openwire、ssl、stomp就是activemq支持的协议。其中最通用的是stomp。