Java Message Service是java ee的规范之一,可以用来发送异步消息,在某些场景下,可以作为不同系统,或者不同模块之间的集成方式。
可以类比为通过数据库来集成的方式,模块A完成逻辑以后,往数据库插入一条记录,模块B定时轮询数据库,如果查到相应的记录,就进行处理。jms集成实际上思路是差不多的,只是功能更强,并且提供了标准的API支持,而且也可以避免反复轮询数据库或者读取文件的I/O操作,对系统的整体性能可能会有提升
其主要优点,首先是可以使2个系统或模块实现松耦合,模块A不需要直接调用模块B,只需要往jms provider上发送一条约定格式的消息,模块B收到这条消息,进行后续的业务处理
其次,jms方式是异步的,意味着模块A发送消息之后,不需要等待模块B或者jms provider的响应,自身的业务逻辑可以继续
jms技术对应的规范是jsr914,规范的实现称为jms provider,常见的实现有ActiveMQ、JBoss MQ、IBM Websphere MQ等。本文以ActiveMQ举例
一、ActiveMQ使用
ActiveMQ(其他的jms provider也差不多)安装之后,目录结构是这样的:
运行bin目录下的activemq.bat,会根据默认配置,启动一个broker。各种jms实现,好像都有broker的概念
启动之后,会占用至少2个端口,默认的是61616和8161
61616是等待jms client的连接,8161是ActiveMQ自带的一个web应用
http://localhost:8161/demo,可以看到各种官方提供的例子
http://localhost:8161/admin,是ActiveMQ的管理控制台
这里可以对队列进行各种操作,比如发送消息,查看消息,清空队列等等
ActiveMQ即使在不编程的情况下,也可以通过这种方式来使用,包括我之前的公司,是用Websphere MQ,有时也不编程,直接通过Websphere MQ,在两地进行消息传输。当然,大部分情况,还是需要针对jms client进行编程的
二、jms基本概念
前面说过,jms的实现,称为jms provider,可以认为是jms的服务器
jms的客户端,需要开发人员自行开发,称为jms client
jms的消息机制有2种模型,一种是Point to Point,表现为队列的形式。发送的消息,只能被一个接收者取走
另一种是Topic,可以被多个订阅者订阅,类似于群发
ConnectionFactory,用于jms client获取与jms provider的连接。不同的jms产品,对这个接口有不同的实现,比如说ActiveMQ,这个接口的实现类是ActiveMQConnectionFactory
Connection,是由ConnectionFactory产生的,表示jms client与jms provider的连接
Session,是由Connection产生的,表示一个会话。Session是关键组件,Message、Producer/Consumer、Destination都是在Session上创建的
Message,这个组件很好理解,就是传输的消息,里面包括head、properties、body,其中head是必选的
Destination,是消息源,对发送者来说,就是消息发到哪里;对接收者来说,就是从哪里取消息。Destination有2个子接口,Queue和Topic,分别对应上面提到的2种模型
Message Producer,是消息发送者,创建这个组件的代码类似:
可以类比为通过数据库来集成的方式,模块A完成逻辑以后,往数据库插入一条记录,模块B定时轮询数据库,如果查到相应的记录,就进行处理。jms集成实际上思路是差不多的,只是功能更强,并且提供了标准的API支持,而且也可以避免反复轮询数据库或者读取文件的I/O操作,对系统的整体性能可能会有提升
其主要优点,首先是可以使2个系统或模块实现松耦合,模块A不需要直接调用模块B,只需要往jms provider上发送一条约定格式的消息,模块B收到这条消息,进行后续的业务处理
其次,jms方式是异步的,意味着模块A发送消息之后,不需要等待模块B或者jms provider的响应,自身的业务逻辑可以继续
jms技术对应的规范是jsr914,规范的实现称为jms provider,常见的实现有ActiveMQ、JBoss MQ、IBM Websphere MQ等。本文以ActiveMQ举例
一、ActiveMQ使用
ActiveMQ(其他的jms provider也差不多)安装之后,目录结构是这样的:
运行bin目录下的activemq.bat,会根据默认配置,启动一个broker。各种jms实现,好像都有broker的概念
启动之后,会占用至少2个端口,默认的是61616和8161
61616是等待jms client的连接,8161是ActiveMQ自带的一个web应用
http://localhost:8161/demo,可以看到各种官方提供的例子
http://localhost:8161/admin,是ActiveMQ的管理控制台
这里可以对队列进行各种操作,比如发送消息,查看消息,清空队列等等
ActiveMQ即使在不编程的情况下,也可以通过这种方式来使用,包括我之前的公司,是用Websphere MQ,有时也不编程,直接通过Websphere MQ,在两地进行消息传输。当然,大部分情况,还是需要针对jms client进行编程的
二、jms基本概念
前面说过,jms的实现,称为jms provider,可以认为是jms的服务器
jms的客户端,需要开发人员自行开发,称为jms client
jms的消息机制有2种模型,一种是Point to Point,表现为队列的形式。发送的消息,只能被一个接收者取走
另一种是Topic,可以被多个订阅者订阅,类似于群发
ConnectionFactory,用于jms client获取与jms provider的连接。不同的jms产品,对这个接口有不同的实现,比如说ActiveMQ,这个接口的实现类是ActiveMQConnectionFactory
Connection,是由ConnectionFactory产生的,表示jms client与jms provider的连接
Session,是由Connection产生的,表示一个会话。Session是关键组件,Message、Producer/Consumer、Destination都是在Session上创建的
Message,这个组件很好理解,就是传输的消息,里面包括head、properties、body,其中head是必选的
Destination,是消息源,对发送者来说,就是消息发到哪里;对接收者来说,就是从哪里取消息。Destination有2个子接口,Queue和Topic,分别对应上面提到的2种模型
Message Producer,是消息发送者,创建这个组件的代码类似: