ActiveMQ学习3-Spirng集成ActiveMQ/Spirng boot集成ActiveMQ


  

18 Spring 集成 ActiveMQ

18.1 点对点同步接收

1、加入Spring集成jms依赖

<dependencies>
  <!-- JMS规范的jar依赖 -->
        <dependency>
            <groupId>javax.jms</groupId>
            <artifactId>javax.jms-api</artifactId>
            <version>2.0.1</version>
        </dependency>

        <!-- activeMQ对jms具体实现的jar依赖 -->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-client</artifactId>
            <version>5.15.8</version>
        </dependency>

        <!--slf4j日志的简易实现-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
        </dependency>
        
        <!--spring-jms依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>
</dependencies>

2、创建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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--导入jms配置文件-->
    <import resource="applicationContext-jms.xml"></import>

</beans>
<?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"
       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">

    <!--扫描service包,将service对象注入到spring容器中-->
    <context:component-scan base-package="com.activemq.service.sender"></context:component-scan>

    <!-- 配置一个连接工厂 -->
    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">

        <property name="brokerURL" value="tcp://192.168.64.128:61616"/>

        <!--<property name="userName" value="system"/>-->
        <!--<property name="password" value="A123456"/>-->
    </bean>

    <!-- 配置JmsTemplate -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestinationName" value="mySpringQueue" />
    </bean>
    <!--在spring中配置jms和配置Redis非常相似-->
</beans>

3、创建消息发送类

@Service
public class MessageSendService {

    @Autowired
    JmsTemplate jmsTemplate;

    /**
     * 发送消息
     */
    public void sendMessage(){
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage("Hello-Spring-ActiveMQ");
            }
        });
    }
}

4、创建消息接受类

@Service
public class MessageReciveService {

    @Autowired
    JmsTemplate jmsTemplate;

    public void reciveMessage(){

        //同步接收,阻塞方法,没有接收到消息就等待,接到了消息就返回
        Message message = jmsTemplate.receive();

        if(message instanceof TextMessage){
            try {
                String text = ((TextMessage) message).getText();

                System.out.println("接收到的消息为:" + text);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }

    }
}

5、测试类

public class MessageSendTest {

    public static void main(String[] args) {
        //加载spring容器
       ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
       //获得serviceBean对象
        MessageSendService messageSendService = (MessageSendService) ac.getBean("messageSendService");
        //调用发消息的方法
        messageSendService.sendMessage();
    }
}

18.2 点对点异步接收

1、创建maven工程,加入相关依赖(同上)
2、创建spring配置文件(同上)
3、创建jms配置文件

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

    <!-- 配置一个连接工厂 -->
    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://192.168.187.128:61616"/>
    </bean>

    <!-- 配置JmsTemplate 无法实现异步接收 -->
    <!--<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestinationName" value="springQueue" />
    </bean>-->

    <!--在spring下集成jms 与spring集成redis 非常相似-->

    <!--实现异步接收消息-->

    <!-- 配置一个sping监听器的容器 -->
    <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destinationName" value="springQueue"/>
        <!--消息监听器-->
        <property name="messageListener" ref="myMessageListener" />
    </bean>

    <!--自定义的一个消息监听器-->
    <bean id="myMessageListener" class="com.activemq.listener.MyMessageListener"/>

</beans>

4、创建消息监听器

public class MyMessageListener implements MessageListener {

    /**
     * 是spring中的监听器容器监听到消息后自动回调该onMessage方法,并且将监听到的消息传给该方法
     *
     * @param message
     */
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            String text = null;
            try {
                text = ((TextMessage) message).getText();
            } catch (JMSException e) {
                e.printStackTrace();
            }
            //可以进行业务的处理(省略业务处理,比如插入数据库,更新状态等都属于业务处理)
            System.out.println("异步->接收到的消息为:" + text);
        }
    }
}

5、发送与接收测试

18.3 发布订阅同步接收

<!-- 配置JmsTemplate -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestinationName" value="mySpringQueue" />

        <!--订阅模式 默认 为false(点对点)-->
        <property name="pubSubDomain" value="true"/>

    </bean>

18.4 发布订阅异步接收

<!--实现异步接收消息-->

    <!-- 配置一个sping监听器的容器 -->
    <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destinationName" value="springQueue"/>
        <!--消息监听器-->
        <property name="messageListener" ref="myMessageListener" />

		<!--false为点对点-->
		<property name="pubSubDomain" value="true"/>
    </bean>

19 Spring boot 集成 ActiveMQ

19.1 点对点同步接收

1、创建Springboot项目添加相关依赖

<!--springboot集成activemq的起步依赖-->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

2、配置springboot核心配置文件

#activemq的连接地址
spring.activemq.broker-url=tcp://192.168.64.128:61616

#消息的目的地
spring.jms.template.default-destination=springbootQueue

#退出main方法的主程序
spring.jms.cache.enabled=fals

3、消息发送类

@Service
public class SendMessageService {

    /**
     * JmsTemplate是springboot框架自动帮我们配置的,我们可以直接注入使用
     *
     * springboot自动配置前提条件:
     * 1、加入spring-jms,activemq相关的jar包依赖
     * 2、application.properties配置了相关连接信息
     */
    @Autowired
    private JmsTemplate jmsTemplate;

    /**
     * 发送消息
     *
     */
    public void sendMessage () {
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                //创建消息
                return session.createTextMessage("Hello Spring ActiveMQ....");
            }
        });
    }
}

4、消息接收类

@Service
public class ReceiveMessageService {

    @Autowired
    private JmsTemplate jmsTemplate;

    /**
     * 接收消息
     *
     */
    public void receiveMessage () {
        //同步接收
        Message message = jmsTemplate.receive();
        if (message instanceof TextMessage) {
            try {
                String text = ((TextMessage) message).getText();
                System.out.println("接收到的消息是:" + text);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

5、测试类

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        //run方法运行后会启动一个spring容器
        ApplicationContext context = SpringApplication.run(Application.class, args);

        //从spring容器中获取发送消息的service的bean
        SendMessageService sms = context.getBean("sendMessageService", SendMessageService.class);

        //调用bean中的发送消息的方法实现消息发送
        sms.sendMessage();

	   //接收消息的service
	   //ReceiveMessageService rms = context.getBean("receiveMessageService", ReceiveMessageService.class);

		//接收消息
		//rms.receiveMessage();
    }
}

19.2 点对点异步接收

1、第一种实现方式

@Component
public class MessageReceiveService {
    /**
     * 实现异步接收消息
     * JmsTemplate无法实现异步接收
     * 使用@JmsListener注解的方法,就是一个监听器方法,可以实现消息的异步接收
     */
    @JmsListener(destination="${spring.jms.template.default-destination}")
    public void receiveMessage (Message message) {
        if (message instanceof TextMessage) {
            try {
                String text = ((TextMessage) message).getText();
                System.out.println("@JmsListener注解实现异步接收消息:" + text);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

2、第二种方式

@Component
public class MyMessageListener implements MessageListener {

    /**
     * 是spring中的监听器容器监听到消息后自动回调该onMessage方法,并且将监听到的消息传给该方法
     *
     * @param message
     */
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            String text = null;
            try {
                text = ((TextMessage) message).getText();
            } catch (JMSException e) {
                e.printStackTrace();
            }
            //可以进行业务的处理(省略业务处理,比如插入数据库,更新状态等都属于业务处理)
            System.out.println("springboot异步->接收到的消息为:" + text);
        }
    }
}

2、配置类

@Configuration // 该注解相当于是原来一个spring的xml配置文件
public class ActiveMQConfig {

    /**
     *     <!-- 配置一个连接工厂 -->
     *     <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
     *         <property name="brokerURL" value="tcp://192.168.187.128:61616"/>
     *     </bean>
     *
     *     该bean的配置在springboot框架下是自动配置好的,不需要我们手动配置
     */
    @Autowired
    private ConnectionFactory connectionFactory;

    @Value("${spring.jms.template.default-destination}")
    private String destination;

    @Autowired
    private MyMessageListener myMessageListener;

    /**
     *     <!--实现异步接收消息-->
     *
     *     <!-- 配置一个sping监听器的容器 -->
     *     <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
     *         <property name="connectionFactory" ref="connectionFactory"/>
     *         <property name="destinationName" value="springTopic"/>
     *         <!--消息监听器-->
     *         <property name="messageListener" ref="myMessageListener" />
     *         <!--pubSubDomain=false表示点对点消息,true表示发布订阅消息,默认是false-->
     *         <property name="pubSubDomain" value="true"/>
     *     </bean>
     */
    @Bean
    public DefaultMessageListenerContainer defaultMessageListenerContainer () {
        DefaultMessageListenerContainer defaultMessageListenerContainer = new DefaultMessageListenerContainer();
        defaultMessageListenerContainer.setConnectionFactory(connectionFactory);
        defaultMessageListenerContainer.setDestinationName(destination);
        defaultMessageListenerContainer.setMessageListener(myMessageListener);
        return defaultMessageListenerContainer;
    }

    /**
     *     <!--自定义的一个消息监听器-->
     *     <bean id="myMessageListener" class="com.activemq.listener.MyMessageListener"/>
     *
     *     该配置通过注解已经实现了
     */
}

19.3 发布订阅同步接收

#activemq的连接地址
spring.activemq.broker-url=tcp://192.168.64.128:61616

#消息的目的地
spring.jms.template.default-destination=springbootQueue

#退出main方法的主程序
spring.jms.cache.enabled=fals

#开启订阅模式,默认是点对点
spring.jms.pub-sub-domain=true

19.4 发布订阅异步接收

```java
@Component
public class MyMessageListener implements MessageListener {

    /**
     * 是spring中的监听器容器监听到消息后自动回调该onMessage方法,并且将监听到的消息传给该方法
     *
     * @param message
     */
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            String text = null;
            try {
                text = ((TextMessage) message).getText();
            } catch (JMSException e) {
                e.printStackTrace();
            }
            //可以进行业务的处理(省略业务处理,比如插入数据库,更新状态等都属于业务处理)
            System.out.println("springboot异步->接收到的消息为:" + text);
        }
    }
}

2、配置类

@Configuration // 该注解相当于是原来一个spring的xml配置文件
public class ActiveMQConfig {

    /**
     *     <!-- 配置一个连接工厂 -->
     *     <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
     *         <property name="brokerURL" value="tcp://192.168.187.128:61616"/>
     *     </bean>
     *
     *     该bean的配置在springboot框架下是自动配置好的,不需要我们手动配置
     */
    @Autowired
    private ConnectionFactory connectionFactory;

    @Value("${spring.jms.template.default-destination}")
    private String destination;

    @Value("${spring.jms.pub-sub-domain}")
    private boolean pubSubDomain;

    @Autowired
    private MyMessageListener myMessageListener;

    /**
     *     <!--实现异步接收消息-->
     *
     *     <!-- 配置一个sping监听器的容器 -->
     *     <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
     *         <property name="connectionFactory" ref="connectionFactory"/>
     *         <property name="destinationName" value="springTopic"/>
     *         <!--消息监听器-->
     *         <property name="messageListener" ref="myMessageListener" />
     *         <!--pubSubDomain=false表示点对点消息,true表示发布订阅消息,默认是false-->
     *         <property name="pubSubDomain" value="true"/>
     *     </bean>
     */
    @Bean
    public DefaultMessageListenerContainer defaultMessageListenerContainer () {
        DefaultMessageListenerContainer defaultMessageListenerContainer = new DefaultMessageListenerContainer();
        defaultMessageListenerContainer.setConnectionFactory(connectionFactory);
        defaultMessageListenerContainer.setDestinationName(destination);
        defaultMessageListenerContainer.setMessageListener(myMessageListener);
        //发布订阅模式true,点对点模式false
        defaultMessageListenerContainer.setPubSubDomain(pubSubDomain);
        return defaultMessageListenerContainer;
    }

    /**
     *     <!--自定义的一个消息监听器-->
     *     <bean id="myMessageListener" class="com.activemq.listener.MyMessageListener"/>
     *
     *     该配置通过注解已经实现了
     */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值