在Java EE 平台中,应用往往需要使用JMS进行通信。为了发送和接收JMS消息,必须执行如下任务:
1-在一个消息代理上创建一个JMS连接工厂。
2-创建一个JMS消息的目的地,可以是一个消息或者一个主题
3-从连接工厂打开一个JMS连接
4-从JMS连接中获取一个JMS会话
5-使用消息生产这或者消息消费者发送或者接受一个JMS消息
6-关闭JMS会话和连接
正如上面所列的那样,发送或者接受一个简单的jms消息需要许多编码。事实上这些步骤大多数都是样板式的。
Spring JMS 可以帮助我们简化JMS的开发。
注意: 首先需要下载ActiveMq ,在 bin文件夹下有activemq.bat .运行activemq
首先在maven的POM文件中添加如下依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>spring</groupId> <artifactId>JMS</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>JMS</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>3.1.4.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.8.0</version> </dependency> </dependencies> </project>
分别有两个测试方法:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:beans.xml") public class BackOfficeTest { @Autowired private BackOffice backOffice; @Test public void testReceiveMail() { System.out.printf("Receive:%s%n",backOffice.receiveMail()); } }
package spring.JMS.post; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:beans.xml") public class FrontDeskTest { @Autowired private FrontDesk frontDesk; @Test public void testSendMail() { Mail m = new Mail(); m.setCountry("CHN"); m.setMailId("12132"); m.setWeight(0.09); System.out.printf("Start send the mail:%s%n",m); frontDesk.sendMail(m); } }
以及一个测试集合
package spring.JMS.post; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses(value = { FrontDeskTest.class, BackOfficeTest.class }) public class SendAndReceiveTest { } 运行附件中的测试集合可以看到如下信息: 写道 log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Start send the mail:Mail [mailId=12132, country=CHN, weight=0.09] Receive:Mail [mailId=12132, country=CHN, weight=0.09] ----------------------------------------------------------------------------------------------------------------------------------------------- 这样可以实现了一个简单的JMS消息的发送和接收,但是你在代码中会发现有这样一个问题: 写道 jmsTemplate.send(destination, new MessageCreator() { public Message createMessage(Session session) throws JMSException { MapMessage message = session.createMapMessage(); message.setString("mailId", mail.getMailId()); message.setString("country", mail.getCountry()); message.setDouble("weight", mail.getWeight()); return message;
发送的时候需要指定目的地,一般我们都默认是想一个目的地发送的,这样每次都写很麻烦。这个问题应该如何解决呢?
可以在配置文件中陪一个默认地址
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="defaultDestination" ref="mailDestination"/> </bean>
这样就可以向默认目的地发送消息了。
在Spring中还提供了这样一个类 JmsGatewaySupport 类,通过扩展这个类可以是我们的代码更加简单明了
转换消息也是一件很麻烦的事情,此时你可以实现MessageConverter接口
package spring.JMS.post; import javax.jms.JMSException; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.Session; import org.springframework.jms.support.converter.MessageConversionException; import org.springframework.jms.support.converter.MessageConverter; public class MailMessageConverter implements MessageConverter { public Object fromMessage(Message arg) throws JMSException, MessageConversionException { MapMessage mapMessage = (MapMessage) arg; Mail mail = new Mail(); mail.setMailId(mapMessage.getString("mailId")); mail.setCountry(mapMessage.getString("country")); mail.setWeight(mapMessage.getDouble("weight")); return mail; } public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException { Mail mail = (Mail) object; MapMessage message = session.createMapMessage(); message.setString("mailId", mail.getMailId()); message.setString("country", mail.getCountry()); message.setDouble("weight", mail.getWeight()); return message; } }
这样发送和接收的代码就很简单了
public void sendMail(final Mail mail) { getJmsTemplate().convertAndSend(mail); } public Mail receiveMail() { return (Mail) getJmsTemplate().receiveAndConvert(); }
相关推荐
**10: 发送和接收邮件** - **邮件发送:** 解释了如何使用 Spring Integration 发送电子邮件。 - **邮件接收:** 讨论了如何接收电子邮件并将其转化为消息流的一部分。 - **邮件集成示例:** 提供了一个实际的邮件...
” ——Jack Herrington,Code Generation in Action的作者 ----总共8部分rar下载完后解压 ----- Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文...
” ——Jack Herrington,Code Generation in Action的作者 ----总共8部分rar下载完后解压 ----- Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文...
” ——Jack Herrington,Code Generation in Action的作者 ----总共8部分rar下载完后解压 ----- Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文...
Spring 3.0版本引入了许多新的功能和增强,包括对Java EE 6的支持、对RESTful Web服务的全面支持、增强的AOP(面向切面编程)功能、对JMS(Java消息服务)和JMX(Java管理扩展)的改进,以及对动态语言的支持等。...
《Spring in Action 第二版》是一本专注于Spring框架实战的权威指南,于2007年8月出版。这本书深入浅出地介绍了Spring的核心概念、关键特性以及在实际开发中的应用,是Java开发者掌握Spring技术的重要参考资料。标签...
9. **消息处理**:Spring框架也支持消息传递,如JMS,用于实现异步通信和解耦。 10. **Cloud Native开发**:随着微服务架构的普及,Spring Cloud为开发者提供了构建分布式系统的服务发现、配置中心、负载均衡等工具...
在Spring框架中,还有对消息传递的支持,例如与JMS(Java消息服务)的集成。这使得异步处理和解耦通信成为可能。此外,Spring Security提供了全面的安全解决方案,包括认证、授权和访问控制,确保应用的安全性。 书...
Spring大大简化了使用接口开发的复杂性,并且加快和简化了应用系统的开发。使用简单JavaBean就可以得到EJB的强大功能。 本书介绍了Spring背后的原理,引领你迅速进入对框架的体验之中。结合简短代码片断和贯穿全书的...
《Spring in Action》是Spring框架领域的一本经典著作,中文版的第四版为读者提供了深入理解和实践Spring框架的详尽指南。这本书旨在帮助Java开发者掌握Spring框架的核心概念和实际应用,提升开发效率和代码质量。...
” ——Jack Herrington,Code Generation in Action的作者 ----总共8部分rar下载完后解压 ----- Spring in Action. 中文版.part1.rar Spring in Action. 中文版.part2.rar Spring in Action. 中文...
《Spring Batch in Action》是一本深入探讨Spring Batch框架的书籍,由Arnaud Cogoluègnes、Thierry Templier、Gary Gregory和Olivier Bazoud共同编写,Manning出版社出版。这本书旨在帮助读者理解和掌握如何使用...
例如,你可以学习如何实现文件系统的交互,包括上传、下载和监控文件,以及如何处理邮件发送和接收。 此外,Spring Integration还提供了强大的数据转换和路由功能。书中会讲解如何使用Message Transformer来转换...
根据提供的信息,我们可以推断出这是一本关于Spring框架的专业书籍——《Spring in Action》英文原版。本书由Craig Walls和Ryan Breidenbach撰写,并由Manning Publications出版。以下是基于书名、描述、标签以及...
10.2 协同使用JMS和Spring 10.2.1 处理冗长失控的JMS代码 10.2.2 使用JMS模板 10.2.3 转换消息 10.2.4 将Spring的网关支持类应用于JMS 10.3 创建消息驱动POJO 10.3.1 创建消息监听器 10.3.2 编写纯POJO MDP ...
《Spring Source Spring Integration in Action》是一本专注于Spring Integration框架的实战指南,旨在帮助读者深入理解和应用这个强大的系统集成工具。Spring Integration是Spring框架家族的一部分,它提供了一种...