SPRING整合JMS进行网络通信
什么是JMS?
jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS的优势
当前,CORBA、DCOM、RMI等RPC中间件技术已广泛应用于各个领域。但是面对规模和复杂度都越来越高的分布式系统,这些技术也显示出其局限性:
(1)同步通信:客户发出调用后,必须等待服务对象完成处理并返回结果后才能继续执行;
(2)客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程 都必须正常运行;如果由于服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常;
(3)点对点通信:客户的一次调用只发送给某个单独的目标对 象。
面向消息的中间件(Message Oriented Middleware,MOM)较好的解决了以上问题。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接 收者。这种模式下,发送和接收是异步的,发送者无需等待;二者的生命周期未必相同:发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行; 一对多通信:对于一个消息可以有多个接收者。
已有的MOM系统包括IBM的MQSeries、Microsoft的MSMQ和BEA的MessageQ等。由于没有一个通用的标准,这些系统很难实现 互操作和无缝连接。
Java Message Service(JMS)是SUN提出的旨在统一各种MOM系统接口的规范,它包含点对点(Point to Point,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。JMS并不是一个产品而是一个规范,JMS的出现是一个巨大变革。
满足大量应用的需求,运行于多种硬件和操作系统平台,支持分布式计算,支持标准接口和协议。开发人员通过调用中间件提供的大量API,实现异构环境的通信,从而屏蔽异构系统中复杂的操作系统和网络协议。
由于标准接口对于可移植性和标准协议对于互操作性的重要性,中间件已成为许多标准化工作的主要部分。分布式应用软件借助中间件可以在不同的技术之间共享资源。
总的来说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少了程序设计的复杂性,将注意力集中与自己的业务上,不必再为程序在不同软件系统上的移植而重复工作,从而大大减少了技术上的负担。
Take in Action
在理解了什么是JMS后,在实践阶段Dreamforce会向你介绍在Spring中整合JMS,同时结合Apache ActiveMQ来实现一个模拟聊天器的功能。
来务场景: A在输入端输入相应消息,消息会异步发送到ActiveMQ,B端会监听这个队列,如果有新数据入队,则接收此消息。
根据本实例,你可以通过简单的修改实现双人或多人自由聊天功能。
在本例中,使用Apache 的ActiveMQ来作为JMS中间件,这是一款相当成熟且开源的产品,得到了许多业内人士的好评。
开发采用Spirng Maven集成开发环境,所有的Jar包通过Maven进行管理 , 如果对Spring Maven集成开发环境配置不熟悉的,可以先看这里:http://dreamforce.me/archives/87
新建一个ApplicationContext-JMS.xml
定义JMS连接工厂
<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616" /> </bean>
定义JMS Template
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsFactory" /> </bean>
<bean id="dreamDestination" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="dream.force" /> </bean>
<bean id="myTextListener" class="com.darcy.jms.TextListener"> </bean>
<bean id="jmsTopic" class="org.apache.activemq.command.ActiveMQTopic" autowire="constructor"> <constructor-arg value="STOCKS.Dreamforce.jms" /> </bean>
<bean id="javaConsumer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="jmsFactory" /> <property name="destination" ref="chartDestination" /> <property name="messageListener" ref="myTextListener" /> </bean>
<bean id="publisher" class="com.darcy.jms.SpringPublish"> <property name="template"> <ref local="jmsTemplate" /> </property> <property name="destinations" ref="chartDestination" /> </bean>
JAVA核心代码一般由三个部分组成: 监听器(Listener),发布端(Publisher), 消息生产者(Creator)
监听器:
package com.darcy.jms; import java.util.Date; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; import org.apache.activemq.command.ActiveMQMapMessage; public class TextListener implements MessageListener{ public void onMessage(Message message) { ActiveMQMapMessage msg = null; System.out.println("ONMessage-----------------"+message.toString()); try { if (message instanceof ActiveMQMapMessage) { msg = (ActiveMQMapMessage) message; String sentDate = msg.getString("date"); String reMessage = msg.getString("message"); int sentCount = msg.getInt("count"); System.out.println("-------------New Message Arrival-----------"+new Date()); System.out.println("It's "+sentCount+" time From Darcy: "+reMessage+" ---Send time :" + sentDate); } } catch (JMSException e) { System.out.println("JMSException in onMessage(): " + e.toString()); } catch (Throwable t) { System.out.println("Exception in onMessage():" + t.getMessage()); } } }
发布端:
package com.darcy.jms; import java.util.HashMap; import java.util.Scanner; import javax.jms.Destination; import org.springframework.jms.core.JmsTemplate; public class SpringPublish { private JmsTemplate template; private Destination[] destinations; public void chart(){ boolean chart = true; int count = 0; while(chart){ count ++; Scanner cin=new Scanner(System.in); System.out.println("输入聊天内容,输入N停止聊天"); String text=cin.nextLine(); if(text.equals("N")) { chart = false; } System.out.println("我:"+text); sendChartMessage(count,text); } } protected void sendChartMessage(int count , String strMessage) { MyMessageCreator creator = new MyMessageCreator(count,strMessage); template.send(destinations[0], creator); } public JmsTemplate getTemplate() { return template; } public void setTemplate(JmsTemplate template) { this.template = template; } public Destination[] getDestinations() { return destinations; } public void setDestinations(Destination[] destinations) { this.destinations = destinations; } }
消息生产者:
package com.darcy.jms; import java.util.Date;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.jms.core.MessageCreator;
public class MyMessageCreator implements MessageCreator {
private int msgNo;
private String strMessage;
public MyMessageCreator(int no,String paramMessage) {
this.msgNo = no;
this.strMessage = paramMessage;
}
public Message createMessage(Session session) throws JMSException {
MapMessage message = session.createMapMessage();
message.setString("date", new Date().toString());
message.setString("message", strMessage);
message.setInt("count", msgNo);
return message;
}
}
完成上述的代码,聊天器的功能已经实现了,现在开始写一个TestCase来运行以上的代码
本例的TestCase用例是基于Spring的集成测试环境,同时你要保证将applicationContext-jms.xml纳入Spring的管理。
如果还不清楚如何搭建Spring集成测试环境的童鞋,请移步到这里 搭建Spring集成测试环境
package test.JSM;
import com.darcy.common.BaseTestCase;
import com.darcy.jms.SpringPublish;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
public class SpringJmsTestMain extends BaseTestCase {
private SpringPublish publisher;
private DefaultMessageListenerContainer javaConsumer;
public SpringPublish getPublisher(){
return publisher;
}
public void setPublisher(SpringPublish publisher){
this.publisher = publisher;
}
public void testJMS(){
javaConsumer.start();
publisher.chart();
}
public void setJavaConsumer(DefaultMessageListenerContainer javaConsumer) {
this.javaConsumer = javaConsumer;
}
public DefaultMessageListenerContainer getJavaConsumer() {
return javaConsumer;
}
}
下载地址:http://activemq.apache.org/download.html
解压后,进入Conf目录,打开ActiveMQ.xml编辑
<transportConnectors>
<transportConnector name="openwire" uri="tcp://localhost:61616"/>
</transportConnectors>
上面的代码是JMS通信地址,这里需要和Spring配置地址一致启动ActionMQ, 运行bin目录里的ActionMQ.bat.
同时你也可以进入WEB Console, 默认访问地址为:http://localhost:8161/admin/
运行TestCase,开始聊天吧~~~嘿嘿,不可上面的代码只支持单人聊天模式,接受端只是从JMS获取消息并输出。
附录:
Maven相关Denpendency(JMS
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>3.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jms_1.1_spec</artifactId> <version>1.1</version> </dependency>
相关推荐
在Spring整合JMS的过程中,我们通常会使用`DefaultMessageListenerContainer`或`SimpleMessageListenerContainer`类来消费消息。这些容器提供了与JMS提供者(如ActiveMQ、RabbitMQ等)的连接管理,并且支持事务性...
综上所述,Spring整合JMS和ActivemQ提供了一套完整的解决方案,帮助开发者轻松地在应用中实现消息的发送和接收。通过这种方式,可以构建出高可用、松耦合、可扩展的分布式系统,提高系统的稳定性和响应速度。在实际...
Spring集成JMS是Java消息服务(Java Message Service)与Spring框架的结合,它提供了一种在分布式系统中高效处理异步消息传递的方式。Spring通过其强大的IoC(Inversion of Control,控制反转)和AOP(Aspect ...
总结来说,Spring整合JMS和ActiveMQ的过程包括:配置ConnectionFactory,定义Destination,创建MessageListener容器,以及使用JmsTemplate发送消息。通过这种方式,你可以构建一个健壮的、异步的消息传递系统,提高...
Spring整合JMS与ActiveMQ深度解析 一、JMS概览与原理 Java Message Service (JMS) 是Java平台中的消息服务应用接口,为应用程序之间的通信提供消息传递机制。JMS支持两种通信模型:点对点(Point-to-Point, PTP)...
Spring整合JMS基于ActiveMQ实现是一项常见的企业级应用开发任务,它涉及到Spring框架、Java消息服务(JMS)以及ActiveMQ消息中间件的使用。在本文中,我们将深入探讨这三个关键概念,以及如何将它们有效地结合在一起...
总结,Spring整合JMS中的MessageConverter是实现数据在Java对象和JMS消息间转换的关键。正确地选择和配置MessageConverter,能有效提高系统通信的效率和灵活性,同时降低开发复杂度。在实际应用中,根据业务需求选择...
【ActiveMQ和Spring整合JMS】的文档主要介绍了消息中间件的基本概念,特别是重点讨论了ActiveMQ和JMS的相关知识。消息中间件是用于不同分布式系统之间数据交流的工具,通过消息传递机制来扩展进程间的通信。ActiveMQ...
Spring框架作为一个强大的企业级应用开发框架,提供了对JMS的全面支持,使得开发者能够方便地在Spring应用中集成JMS,实现异步消息处理和高可用性。 一、JMS简介 JMS是一种API,用于在分布式环境中发送、接收和管理...
Spring-JMS是Spring框架的一部分,专门用于处理Java消息服务(JMS)的集成。它提供了一个简单的API,使得开发者能够方便地在应用中使用消息传递功能。本文将深入探讨Spring-JMS的基础知识,包括它的核心概念、配置...
5. **事务管理**:Spring提供了集成JMS事务的能力,可以在发送消息时开启事务,确保消息的原子性和一致性。 6. **测试与运行**:项目中的“完整可运行”意味着包含了运行所需的全部资源,包括配置文件、源代码、...
Spring JMS(Java Message Service)是Spring框架的一部分,专门用于集成JMS消息传递系统,以实现异步通信和解耦应用程序组件。在这个入门级实例中,我们将探讨如何使用Maven、Spring和ActiveMQ来构建一个简单的...
1. Spring集成JMS的配置文件,如`applicationContext.xml`或`application.yml`,配置`ActiveMQConnectionFactory`、`JmsTemplate`等。 2. 使用`@JmsListener`注解的消息消费者类,处理从队列或主题接收到的消息。 3....
Spring 整合 JMS 实现同步收发消息(基于 ActiveMQ 的实现) Spring 整合 JMS 实现同步收发消息是指在 Spring 框架下使用 JMS(Java Message Service)协议来实现消息的同步收发。JMS 是一个基于 Java 的消息服务 ...
综上所述,Spring JMS 4.3.4.RELEASE为开发者提供了一套完整的JMS集成方案,通过抽象和封装JMS API,使得消息处理更加简单且易于维护。配合Spring Framework的其他模块,如Spring JDBC、Spring AOP等,可以构建出...
通过这些库文件和正确的配置,Spring可以帮助开发者轻松地集成JMS,实现可靠的消息传递,提升系统的可扩展性和容错性。同时,Spring的声明式事务管理可以确保消息传递的一致性,使得在整个系统中实现高可用和健壮的...
Spring-JMS是Spring框架的一部分,专门用于处理Java消息服务(JMS)的集成。这个jar包,即`spring-jms-3.1.1.RELEASE.jar`,包含了Spring对JMS API的抽象和扩展,使得在Spring应用中使用JMS变得更加简单和灵活。 **...
Spring JMS 是一个强大的框架,它极大地简化了Java企业级消息处理。它通过提供一套抽象和模板类,使得开发者能够更加便捷地使用Java消息服务(JMS),并与各种JMS提供者,如IBM的WebSphere MQ进行集成。本文将深入...