ActiveMQ(十二)--ActiveMQ结合Spring开发

spring提供了对JMS的支持,需要添加spring支持jms的包:

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

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
    <version>5.9.0</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.0</version>
</dependency>

applicationContext.xml

<?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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
       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-4.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.ken">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <aop:aspectj-autoproxy proxy-target-class="true"/>

    <bean id="jmsFactory" class="org.apache.activemq.jms.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="connectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL">
                    <value>tcp://192.168.25.128:61616</value>
                </property>
            </bean>
        </property>
        <property name="maxConnections" value="100"/>
    </bean>

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsFactory"/>
        <property name="defaultDestination" ref="destination"/>
        <property name="messageConverter">
            <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
        </property>
    </bean>

    <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="spring-queue"/>
    </bean>

</beans>

队列生产者:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

@Service
public class QueueSender {

    @Autowired
    private JmsTemplate jmsTemplate;

    public static void main(String[] args) throws JMSException, InterruptedException {

        //jmsTemplate帮我们创建好了session,不要一步一步的去创建,又去关闭。
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        QueueSender queueSender = (QueueSender) ac.getBean("queueSender");
        queueSender.jmsTemplate.send(new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage msg = session.createTextMessage("spring msg==");
                return msg;
            }
        });
    }
}

队列消费者:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

import javax.jms.JMSException;

@Service
public class QueueReceiver {

    @Autowired
    private JmsTemplate jmsTemplate;

    public static void main(String[] args) throws JMSException {

        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        QueueReceiver queueReceiver = (QueueReceiver) ac.getBean("queueReceiver");

        String msg = (String) queueReceiver.jmsTemplate.receiveAndConvert();
        System.out.println("msg==" + msg);
    }
}

如果topic的话,首先需要修改spring的配置

先添加topic的配置,当然,需要修改jmsTemplate配置里面的defaultDestination,如果不想修改这个配置,那么直接把Destination注入程序,在程序里面选择发送的Destination也可以:

<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
    <constructor-arg index="0" value="spring-topic"/>
</bean>

其他的客户端发送和接收跟队列基本一样。

topic sender

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

@Service
public class SpringTopicSender {

    @Autowired
    private JmsTemplate jmsTemplate;

    public static void main(String[] args) throws JMSException, InterruptedException {

        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        SpringTopicSender springTopicSender = (SpringTopicSender) ac.getBean("springTopicSender");
        springTopicSender.jmsTemplate.send(new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage msg = session.createTextMessage("spring topic msg==");
                return msg;
            }
        });
    }

}

topic receiver

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

import javax.jms.JMSException;

@Service
public class SpringTopicReceiver {

    @Autowired
    private JmsTemplate jmsTemplate;

    public static void main(String[] args) throws JMSException {

        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        SpringTopicReceiver springTopicReceiver = (SpringTopicReceiver) ac.getBean("springTopicReceiver");

        String msg = (String) springTopicReceiver.jmsTemplate.receiveAndConvert();
        System.out.println("msg==" + msg);
    }
}

通过运行发现,这种情况下,是非持久化的模式。

如果想要在spring中配置消费者的话,就不需要再启动接收的客户端了,配置如下:

在容器启动的时候,就会加载jmsContainer,也就加载了messageListener,也就是注册了监听器。

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class MyMessageListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
        TextMessage txtMsg = (TextMessage) message;
        try {
            System.out.println("receive txt msg==" + txtMsg.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

这样一来,只要运行生产者,消费者就自动了接收消息了。

猜你喜欢

转载自blog.csdn.net/csdn_kenneth/article/details/82106850
今日推荐