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

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 Serializable 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>
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

// creates an JNDI Context and combine resources
SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
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);

jmsDemo.send("testQueue",new object());
时间: 2024-11-10 21:29:44

SpinrgFramework4系列之SpringJMS:(一)搭建JMS-注解加XML版的相关文章

SpringFramework4系列之SpringJMS:(五)Jms namespace的使用

Spring jms 的命名空间 xmlns:jms="  xsi:schemaLocation=" http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd" Spring jms 的命名空间元素 SpringJMS 提供了 三种 命名空间元素 <jms:annotation-drive> <jms:listener-

SpringFramework4系列之SpringJMS:(四)异步接收消息 2.构建监听器

构建实现接口的监听器 编写监听器类并且实现监听器接口 public class ListenerDemo implements MessageListener {     public void onMessage(Message message) {         System.out.println(message.toString());     } } 注册MDP <!-- this is the Message Driven POJO (MDP) --> <bean id=&

DNS系列- 2.dns服务搭建(bind编译安装)

DNS系列- 2.dns服务搭建(bind编译安装) 目录     一.安装bind         1.yum安装         2.编译安装     二.服务搭建         1.编辑DNS主配置文件         2.添加解析     三.测试         1.正向解析测试         2.反向解析测试 一.安装bind Bind(kerkeley Internet Name Deamon) 是现今互联网使用最广泛的DNS服务器软件,使用BIND作为服务器软件的DNS服务器

SpringMVC学习系列(9) 之 实现注解式权限验证

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MVC中的action拦截器我们可以实现注解式的权限验证. 一.首先介绍一下action拦截器: HandlerInterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,HandlerInterceptor 的内容如下: public interface Handl

openstack icehouse系列之网络节点搭建

我们接着上一篇博文openstack icehouse系列之控制节点搭建继续往下开始搭建下面是环境介绍. 网络节点:ml2.openvswitch.DHCP.l3.metadata 控制节点:mysql.keystone.glance.nova.neutron.dashboard.cinder 计算节点:nova-compute.qemu-kvm.openvswitch.ml2 keystone:验证 glance:镜像 nova:计算 neutron:网络 Network setup (网络节

SpringMVC环境搭建---xml版及注解版

一.建立 JavaWeb 项目(基于Intellij 14.0.3搭建) 1.建立一个 Java 项目,在项目下新建一个文件夹 webapp ,然后在该文件夹下新建一个 WEB-INF 文件夹: 2.在 WEB-INF文件夹下建立 web.xml 文件,从 tomcat 安装路径 /conf/web.xml 中拷贝基本的文档结构,修改相应编码为 utf-8: 3.在 WEB-INF 下建立 jsp 文件夹,用来存放相关jsp 文件(MVC 中的 V): 4.在 WEB-INF 下建立 lib 文

openstack Juno系列之控制节点搭建

openstack Juno系列之控制节点搭建 controller控制节点搭建 安装keystone ------------- 所有主机hosts: 取消其中127.0.0.1 10.0.0.11  controller 10.0.0.21  neutron 10.0.0.31  compute to configure prerequisites: apt-get install python-software-properties add-apt-repository cloud-arc

openstack Juno系列之网络节点搭建

openstack Juno系列之网络节点搭建 neutron节点搭建 ------------------ 添加转发 vi  /etc/sysctl.conf net.ipv4.ip_forward=1 net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.default.rp_filter=0 刷新下 sysctl -p 安装neutron各模块服务 apt-get install neutron-plugin-ml2 neutron-plugin-open

openstack Juno系列之计算节点搭建

openstack Juno系列之计算节点搭建 nova-compute安装配置 -------------------- apt-get install nova-compute sysfsutils 编辑配置文件 vi /etc/nova/nova.conf [DEFAULT] verbose = True rpc_backend = rabbit rabbit_host = controller rabbit_password = RABBIT_PASS auth_strategy = k