文档章节

SpringFramework4系列之SpringJMS:(一)搭建JMS-注解加XML版

Garrry
 Garrry
发布于 2015/07/06 15:54
字数 816
阅读 2979
收藏 21

Maven dependency

maven的dependency用着 隐形的依赖传递性,如果只是用到 JMS这部分功能 引用一下Maven坐标即可

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>${project.dependency.spring.core}</version>
</dependency>

依赖传递关系,可见SpringJMS 会隐形的导入其他的依赖包

Spring Namespace

Spring-config.xml 支持 Spring-jms的命名空间,使用namespace 可以简化spring的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jms="http://www.springframework.org/schema/jms"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd   
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd         
            http://www.springframework.org/schema/jms 
            http://www.springframework.org/schema/jms/spring-jms.xsd">    
            
            <!-- bean definitions here -->
</beans>

Spring beans

使用 Spring JMS 最基本的需要构建2个类, 一个是JMS Template 一个是JMS 客户端

  • JMS Template: 是Spring 自身提供,只需向Spring 容器内 注册这个类即可

  • JMS 客户端 : 这个是需要自己编写的, 会使用到JMS Template类,如果需要 spring 托管 也需要向容器内 注册

构建JMS 客户端类

使用@Service 注解将 类注册到spring 容器中, 使用Autowire注解 自动装填 JMS Template。

定义 JmsTemplate的setter方法 主要是为了解耦,脱离spring 容器的时候 需要自行set 一个 JMS template 实例

@Service("JMSDemo")
public class JMSDemo{    
    
    private JmsTemplate jmsTemplate;

    @Autowired
    public void setJmsTempalte(JmsTemplate jmsTemplate){
        this.jmsTemplate = jmsTemplate;
    }
    
    public void send(final String argQueueName, final String argObject) throws JMSException {
       
        jmsTemplate.send(argQueueName, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createObjectMessage(argObject);
            }
        });
    }

    public Message consumee(String queueName) throws JMSException {
        Message message = jmsTemplate.receive(queueName);
        return message;
    }
}

Spring Config

spring的配置文件中 首先需要 componet-scan 去扫描package 将带有@component @Service 等注解的类 注册到spring的容器中。

<!-- =============================================== -->
<!--             component Scanning                  -->
<!-- =============================================== -->
<context:component-scan base-package="com.*"/>

其次需要需要定义 Jms template Bean

Jms Template 需要额外配置 connectionFactory 和defaultDestination 属性   messageConverter 是可选项,后面后续的系列会提到。

这里使用了 spring的 cacheConnectionFactory去池化connection。

最终 我们需要向spring 提供 2个实现类 分别是  connectionFacotry和defaultDestination

<!-- =============================================== -->
<!--             JMS Template                        -->
<!-- =============================================== -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="cachingConnectionFactory"/>
    <property name="defaultDestination" ref="jmsDestination"/>
    <property name="messageConverter">
        <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
    </property>
</bean>
<!-- Pooled Spring connection factory -->
<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="jmsConnectionFactory" />
</bean>


如果需要到 JNID 里面去寻找 JMS 供应, 使用 jee:jndi-lookup 去寻找即可

前提是 需要加上 jee 的name space

xmlns:jee=" 
xsi:schemaLocation="
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee.xsd"
<jee:jndi-lookup id="jmsConnectionFactory" jndi-name="amqConnectionFactory" />
<jee:jndi-lookup id="jmsDestination" jndi-name="amqDestination" />

如果需要到 自己定义实现类 需要额外定义 connectFactory 的实际类(各供应商可能各不相同),这里以ActiveMQ为例

<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <!-- brokerURL, You may have different IP or port -->
    <property name="brokerURL" value="tcp://localhost:61616" />
</bean>
<bean id="defaultDestination" class="org.apache.activemq.command.ActiveMQQueue">
    <!--<property name="compositeDestinations" value="testQueue"/>-->
    <constructor-arg index="0" value="testQueue" />
</bean>

测试

简单测试 发送消息到队列

准备工作需要 引入依赖包 ActiveMq ,Spring-test 和 开启 JMS服务器 。

参考: ActiveMQ get Started

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>${project.dependency.apache.activemq}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${project.dependency.spring.core}</version>
    <scope>test</scope>
</dependency>
public static void main(String[] arg){
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

    // creates an JNDI Context and combine resources
    SimpleNamingContextBuilder builder = null;
    try {
        builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
    } catch (NamingException e) {
        e.printStackTrace();
    }
    builder.bind("amqConnectionFactory", connectionFactory);
    builder.bind("amqDestination", new ActiveMQQueue("testQueue") );

    // Initialize Spring Context
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    JMSDemo jmsDemo = context.getBean(JMSDemo.class);

    try {
        jmsDemo.send("testQueue","Test");
    } catch (JMSException e) {
        e.printStackTrace();
    }
}


© 著作权归作者所有

Garrry
粉丝 27
博文 46
码字总数 48703
作品 0
浦东
技术主管
私信 提问
SpringFramework4系列之SpringJMS:(四)异步接收消息 2.构建监听器

在Spring中,构建监听器 有三种方式: 实现监听器接口 适配器托管 注解监听器 其中,实现接口和注解监听器 都需要一个监听器容器的支持。 构建实现接口的监听器 编写监听器类并且实现监听器接...

Garrry
2015/07/07
1K
2
SpringFramework4系列之整合Resteasy

对于和jboss as7的集成不需要做任何工作,jboss默认集成了resteasy,只需要对业务pojo做一些jax-rs的注解标注即可。 对于非Jboss的Servlet容器 Spring和resteasy集成,主要有三种方式, 运行...

Garrry
2015/07/21
1K
0
SpringFramework4系列之SpringJMS:(五)Jms namespace的使用

Spring jms 的命名空间 xmlns:jms=" xsi:schemaLocation="http://www.springframework.org/schema/jmshttp://www.springframework.org/schema/jms/spring-jms.xsd" Spring jms 的命名空间元素......

Garrry
2015/07/07
1K
0
SpringMVC+Spring4.0+Hibernate 简单的整合

学习的初始 一个 Hello World。 1、搭建好环境 工欲善其事,必先利其 这是需要的jar 简单的说下 : standard.jar 这个jar包是我们在jsp中使用JSTL标签的时候用到的。你也可以使用SpringEL 。 ...

Jeremy_pan
2014/08/30
45.3K
13
Spring MVC入门

核心类与接口: 先来了解一下,几个重要的接口与类。现在不知道他们是干什么的没关系,先混个脸熟,为以后认识他们打个基础。 DispatcherServlet -- 前置控制器 HandlerMapping接口 -- 处理请...

为梦而来
2014/01/25
3.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

学习记录 java面试题(一)

1. JDK和JRE的区别 JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库。通过JDK开发人员将源码 文件(java文件)编译成字节码文件(class文件)。 JRE是Java运行环境,...

Pole丶逐
37分钟前
8
0
springboot 部署到外部tomcat

入口类继承SpringBootServletInitializer 并重写protected SpringApplicationBuilder configure(SpringApplicationBuilder builder)方法 如下 import org.springframework.boot.SpringApplic......

雷开你的门
43分钟前
5
0
hashCode和equals方法的关系

equals相等,hashcode必相等; hashCode()在哈希表中起作用,如HashSet、HashMap等。 当我们向哈希表(如HashSet、HashMap等)中添加对象object时,首先调用hashCode()方法计算object的哈希码,...

无名氏的程序员
47分钟前
7
0
技术分享 | MySQL 慢查询记录原理和内容解析

作者:高鹏 文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。 源码版本:percona 5.7.14 本文为学习记录,可能有误请谅解,也提供了一些...

爱可生
56分钟前
5
0
elementui 树型节点

节点选择时,勾选节点。 提交给后端时,传递 this.$refs.menuTree.getCheckedKeys(); 半选父节点 getHalfCheckedKeys() 不需要提交。...

东东笔记
56分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部