Sping整合ActiveMQ(二.Spring 对JMS的支持 )
Spring提供了一个用于简化JMS API使用的抽象框架,用户利用Spring使用JMS可以不用关心connection factory,session等资源的管理.类似于对JDBC的抽象,Spring提供了一个JmsTemplate类,抽象了操作JMS都必须做的公共步骤,留下了callback方法给用户去实现,如提供消息的真正内容等.
本文主要讲解一下怎么使用Spring来发送消息,接受消息和异步接受消息(MessageListener).
一,发送消息:
1,通过JmsTemplate的
send方法和提供一个MessageCreator的实现的最简单应用:
JAVA类(用配置文件中配置的默认的queue):
- public class JMSsenderBean {
- private JmsTemplate jmsTemplate;
- public void simpleSend() {
- this.jmsTemplate.send(new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- return session.createTextMessage("hello queue world");
- }
- });
- }
配置:(本例在weblogic上配置了JMS服务)
- <beans>
- <bean id="JMSsenderBean" class="com.test.spring.jms.JMSsenderBean">
- <property name="jmsTemplate">
- <ref local="jmsTemplate"></ref>
- </property>
- <property name="queue">
- <ref local="destination1"></ref>
- </property>
- </bean>
- <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName">
- <value>jms/jmsconf</value>
- </property>
- <property name="jndiTemplate">
- <ref local="jndiTemplate"></ref>
- </property>
- </bean>
- <bean id="destination1" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName">
- <value>jms/jmsq1</value>
- </property>
- <property name="jndiTemplate">
- <ref local="jndiTemplate"></ref>
- </property>
- </bean>
- <bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName">
- <value>jms/jmsq</value>
- </property>
- <property name="jndiTemplate">
- <ref local="jndiTemplate"></ref>
- </property>
- </bean>
- <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
- <property name="connectionFactory">
- <ref local="connectionFactory" />
- </property>
- <property name="defaultDestination">
- <ref local="destination" />
- </property>
- </bean>
- <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
- <property name="environment">
- <props>
- <prop key="java.naming.factory.initial">
- weblogic.jndi.WLInitialContextFactory
- </prop>
- <prop key="java.naming.provider.url">
- t3://localhost:7001
- </prop>
- <!--
- <prop key="java.naming.security.authentication"> weblogic </prop>
- <prop key="java.naming.security.credentials"> security </prop>
- -->
- </props>
- </property>
- </bean>
- </beans>
2,在发送的时候指定Queue:(配置同上)
- public void withQSend() {
- this.jmsTemplate.send(queue, new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- return session.createTextMessage("hello queue world to jmsq1");
- }
- });
- }
3,通过JmsTemplate的
convertAndSend方法和提供一个MessageConverter的实现来将传入的对象转成message:
- public void convertAndSend(MsgObject object) {
- this.jmsTemplate.setMessageConverter(new MyMessageConverter());
- this.jmsTemplate.convertAndSend(object);
- }
- public class MyMessageConverter implements MessageConverter{
- public Object fromMessage(Message message) throws JMSException, MessageConversionException {
- TextMessage msg = (TextMessage)message;
- MsgObject obj = new MsgObject();
- obj.setName("from message");
- return obj;
- }
- public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
- MsgObject obj = (MsgObject)object;
- return session.createTextMessage("from Object MsgObject " + obj.getName() + " " + obj.getAge());
- }
- }
4,实现SessionCallback,利用
JmsTemplate的execute方法来对session进行操作,可以发送和接受消息.
- public void sessionCbkSend() {
- this.jmsTemplate.execute(new MySessionCallback(this.jmsTemplate));
- }
- public class MySessionCallback implements SessionCallback{
- private JmsTemplate jmsTemplate;
- public MySessionCallback(JmsTemplate jmsTemplate) {
- this.jmsTemplate = jmsTemplate;
- }
- public Object doInJms(Session session) throws JMSException {
- jmsTemplate.send(new MessageCreator() {
- public Message createMessage(Session session) throws JMSException {
- System.out.println("..............");
- return session.createTextMessage("message from session back");
- }
- });
- System.out.println("..............");
- return null;
- }
- }
二,接受消息
- public void receiveMsg() {
- TextMessage msg = (TextMessage)this.jmsTemplate.receive();
- try {
- System.out.println(msg.getText());
- } catch (JMSException e) {
- e.printStackTrace();
- }
- }
三,异步接受消息:实现MessageListener,配置listenerContainer,默认情况下,Spring容器启动后,Listener就会启动.
- public class ExampleListener implements MessageListener {
- public void onMessage(Message message) {
- if (message instanceof TextMessage) {
- try {
- System.out.println(((TextMessage) message).getText());
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- } catch (JMSException ex) {
- throw new RuntimeException(ex);
- }
- } else {
- throw new IllegalArgumentException("Message must be of type TextMessage");
- }
- }
- }
配置
- <bean id="messageListener" class="com.test.spring.jms.ExampleListener">
- </bean>
- <bean id="jmsContainer"
- class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="connectionFactory" />
- <property name="destination" ref="destination" />
- <property name="messageListener" ref="messageListener" />
- </bean>
通过listenerContainer的stop和shutdown方法停止服务.
jmsContainer.stop();
jmsContainer.shutdown();
对listener的事务管理:
如果是本地事务,只需要设置listenerContainer的sessionTransacted就可以了.
- <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- ...
- <property name="sessionTransacted" value="true"/>
- </bean>
如果在onMessage中还有对其他资源,如数据库的操作,需要使用JTA来控制全局事务.
- <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
- <bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- ...
- <property name="transactionManager" ref="transactionManager" />
- </bean>
相关推荐
Spring框架提供了对多种消息中间件的支持,包括ActiveMQ,通过其`spring-jms`模块,我们可以方便地创建消息生产者和消费者。ActiveMQ作为消息队列,负责存储和转发消息,确保消息的可靠传输,同时提供高并发和负载...
Spring还提供了对JMS的支持,可以方便地在Spring应用中配置和使用消息代理。 **ActiveMQ** ActiveMQ是Apache软件基金会的一个开源项目,它是JMS的实现,作为一个消息中间件,它允许应用程序之间通过消息进行通信。...
这个压缩包提供了MyBatis和Spring整合所需的基本依赖,可以直接导入到项目中使用,从而快速搭建起一个支持MyBatis与Spring集成的环境。开发者在实际使用时,还需根据项目需求调整相关配置,并编写具体的Mapper接口和...
7. **消息传递**:Spring还支持企业级的消息传递,如JMS(Java Message Service),相关接口和类位于`org.springframework.jms`包下。 8. **国际化**:Spring通过`ResourceBundleMessageSource`类支持国际化和本地...
1. **Reactive编程支持**:Spring 5引入了对Reactor和Project Reactor的支持,允许开发非阻塞、反应式应用程序,以应对现代高并发场景。 2. **Java 11支持**:5.3.x系列开始支持Java 11,为开发者提供了最新的语言...
【标题】"activemq-example spring maven" 涉及到的是一个使用ActiveMQ、Spring框架和Maven构建的入门示例项目。这个项目旨在帮助开发者了解如何在Java环境中集成这三个关键技术来实现消息队列的功能。 【activemq...
可以使用 Spring 提供的 TestContext 框架,结合 JUnit 或 TestNG,对 Service 和 DAO 层进行测试。 10. **最佳实践**:在实际项目中,为了提高性能和可维护性,通常会采用 MyBatis 或 JPA 作为更轻量级的数据访问...
在Spring框架中,`spring.jar`是核心库,包含了大部分Spring的功能,而`commons-logging.jar`则是一个日志抽象层,用于支持多种日志实现。 1. **Spring.jar**: - **依赖注入(Dependency Injection, DI)**:...
6. 改进的测试框架:Spring Test模块提供了更强大的测试支持,包括对Spring Boot应用程序的集成测试,以及对Spring MVC的模拟测试工具。 二、优势 1. 依赖注入:Spring 4.x的依赖注入特性允许开发者声明性地管理...
spring-jms-3.2.12.RELEASE.jar spring-orm-3.2.12.RELEASE.jar spring-oxm-3.2.12.RELEASE.jar spring-struts-3.2.12.RELEASE.jar spring-test-3.2.12.RELEASE.jar spring-tx-3.2.12.RELEASE.jar spring-web-3.2.12...
8. **反应式编程支持**:Spring 5引入了对Reactor和其他反应式流库的支持,为构建非阻塞、高并发的现代应用程序提供了工具。 9. **测试支持**:Spring提供了丰富的测试工具和框架,如`@SpringBootTest`注解,便于...
Spring整合MyBatis是Java开发中常见的数据访问技术组合,它允许我们利用Spring的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)特性来管理MyBatis的SQL映射和数据访问。...
Spring框架在Java应用程序中管理数据库连接的方式有很多种,本篇文章将详细介绍Spring配置数据源的四种常见方法,以Oracle 10g为例。 1. 使用Spring自带的`DriverManagerDataSource` `DriverManagerDataSource`是...
7. **WebSocket支持**:Spring4X增强了对WebSocket协议的支持,使得实时双向通信成为可能,适用于实时数据更新和聊天应用等场景。 8. **Cloud support**:Spring Cloud提供了微服务相关的工具集,如服务发现、配置...
在本教程中,我们将深入探讨如何使用Spring MVC、Spring和Hibernate三大框架进行全注解的整合开发。这个视频教程系列的第11部分,重点可能是建立在前几部分的基础之上,进一步深化对这三个核心技术的理解和实践。 ...
整合Spring和RestEasy,可以利用Spring的依赖注入机制管理RestEasy的组件,以及利用Spring的AOP支持实现更高级的服务行为。 **3. 源码结构分析** 在"resteasy-spring-test"源码中,我们可以看到以下主要部分: - ...
spring-webmvc-5.0.8.RELEASE.jar
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,主要用来解决传统面向对象编程中的横切关注点问题。在Java应用中,这些横切关注点通常包括日志记录、事务管理、权限...
#### 二、Spring整合ibatis配置步骤 ##### 1. 配置数据源 数据源是连接数据库的重要组件,用于管理数据库连接池。在Spring中配置数据源通常采用Apache Commons DBCP库中的`BasicDataSource`类。 ```xml ...
4. **数据序列化与反序列化**:AMF是一种高效的二进制格式,用于在Flex和Spring之间传输数据。需要确保Java对象和Flex对象之间有对应的映射关系。 5. **测试与调试**:通过发送Flex客户端的请求并观察Spring服务器...