前言
Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
Java消息服务的规范包括两种消息模式,点对点和发布者/订阅者。许多提供商支持这一通用框架。因此,程序员可以在他们的分布式软件中实现面向消息的操作,这些操作将具有不同面向消息中间件产品的可移植性。
Java消息服务支持同步和异步的消息处理,在某些场景下,异步消息是必要的,而且比同步消息操作更加便利。
Java消息服务支持面向时间的方法接收消息,时间驱动的程序设计现在被广泛认为是一种富有成效的程序设计范例。
在应用系统开发时,Java消息服务可以推迟选择面对消息中间件产品,也可以在不同的面对消息中间件切换。
JMS的独立使用
本文以Java消息服务的开源实现产品ActiveMQ为例来进行Spring整合消息服务功能的实现分析。
尽管大多数的Java消息服务的使用都会跟Spring相结合,但是,我们还是非常有必要了解消息的独立使用方法,这对于我们了解消息的实现原理以及后续的与Spring整合实现分析都非常重要。当然在消息服务的使用前,需要我们先开启消息服务器,如果是Windows系统下可以直接双击ActiveMQ安装目录bin下的activemq.bat文件来启动消息服务器。
消息服务的使用除了要开启消息服务器外,还需要构建消息的发送端与接收端,发送端主要用来将包含业务逻辑的消息发送至消息服务器,而消息接收端则用于将服务器中的消息提取并进行相应的处理。
安装及测试ActiveMQ
Windows:
(1)下载zip压缩包
下载地址:
在此地址下,选择自己要使用的版本,进入到指定的文件夹下,选择zip压缩包,下载;
由于我使用Spring版本的原因,我使用如下activemq版本:
(2) 将压缩包放到指定目录下,解压。
(3) 启动
打开cmd,进入到%ACTIVEMQ_HOME%\bin目录下,使用命令:
activemq start //打开服务
打开后有如下提示,即已正确启动:
(4)测试
浏览器进入到127.0.0.1:8161,activemq控制台,可查看activemq中的各消息信息;
用户名:admin
密码:admin
用户名和密码在%ACTIVEMQ_HOME%\conf中的jetty-realm.properties中配置。如下:
使用示例
(1)发送端实现
发送端主要用于发送消息到消息服务器,以下为发送消息测试,尝试发送三条信息到消息服务器。
import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;public class Sender { public static void main(String[] args) throws Exception { ConnectionFactory factory = new ActiveMQConnectionFactory(); Connection connection = factory.createConnection(); Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("myQueue"); MessageProducer producer = session.createProducer(destination); for (int i = 0;i < 3;i++){ TextMessage message = session.createTextMessage("大家好,这是一个测试!"); Thread.sleep(3000); producer.send(message); } session.commit(); session.close(); connection.close(); }}
上面的代码很容易让我们联想到数据库的实现,在代码开始需要一系列冗余但是又必不可少的用于连接的代码,而其中真正用于发送消息的代码其实很简单。
(2)接收端实现
接收端主要用于连接消息服务器并接收服务器上的消息。
import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;public class Receiver { public static void main(String[] args) throws Exception { ConnectionFactory factory = new ActiveMQConnectionFactory(); Connection connection = factory.createConnection(); connection.start(); final Session session =connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("myQueue"); MessageConsumer consumer = session.createConsumer(destination); int i = 0; while (i < 3){ i++; TextMessage message = (TextMessage) consumer.receive(); session.commit(); System.out.println("收到消息:" + message.getText()); } session.close(); connection.close(); }}
(3)先开启服务端
log4j:WARN No appenders could be found for logger (org.apache.activemq.thread.TaskRunnerFactory).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
发现是一致Run状态的。
(4)启动客户端
log4j:WARN No appenders could be found for logger (org.apache.activemq.thread.TaskRunnerFactory).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.收到消息:大家好,这是一个测试!收到消息:大家好,这是一个测试!收到消息:大家好,这是一个测试!
发现接收到消息,测试成功。
注意:
(1)需要将ActiveMQ服务启动后才能成功。
(2)引入activemq-all-5.10.2.jar(与自己相对应的jar包)。在ActiveMQ的安装目录中。
参考:《Spring源码深度解析》 郝佳 编著: