SpringBoot使用JMS(activeMQ)的两种方式 队列消息、订阅/发布

刚好最近同事问我activemq的问题刚接触所以分不清,前段时间刚好项目中有用到,所以稍微整理了一下,仅用于使用

1.下载ActiveMQ 

地址:http://activemq.apache.org/download.html

2.启动ActiceMQ

windows版本直接双击启动bin/win64/activemq.bat

linux版本也是下载解压在bin/linux-x86-64或者linux-x86-32下 

cd apache-activemq-5.14.1/bin/linux-x86-64/

  

./activemq start

启动完成之后,浏览器输入:http://localhost:8161/admin 会显示如下界面就证明成功了

浏览器输入:http://localhost:8161/admin/queues.jsp 需要输入账户密码默认:admin/admin

则会显示消息队列主题等信息

3.Springboot配置ActiveMQ

加入activemq 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

配置连接属性:

 如果是properties后缀文件

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=false

如果是yml后缀文件

spring:
  profiles : dev
  application:
    name: user-service
  activemq:
    broker-url: tcp://localhost:61616
    user: admin
    password: admin
    in-memory: true
    pool:
      enabled: true
      max-connections: 500

4.消息队列的使用

 生产者、消费者模式

创建生产者

package org.tfkf.minsurance.jms.activemq;

import javax.jms.Destination;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;

/**
 *
 * @Author zyt
 * @Date 2018/3/15 17:39
 */
@Component
public class Producer {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    /**
     * 消息发送
     * @param destinationName
     * @param message
     * @return
     */
    public boolean sendMessage(final String message,String destinationName) {
        boolean result = true;
        try {
            Destination destination = new ActiveMQQueue(destinationName);
            jmsMessagingTemplate.convertAndSend(destination, message);
        } catch (Exception e) {
            e.printStackTrace();
            result = false;
        }
        return result;
    }
}

创建消费者,@JmsListener注解,在java7及以下版本jdk中,可以使用@JmsListeners代替它。

    @JmsListener(destination = "name.msg")
    public void receive(String message){
        System.out.println("name.msg消费者:"+message);
    }

我们封装一个调用例子

 

调用实例

 返回结果

5.发布/订阅模式

先发布一个话题

package org.tfkf.minsurance.jms.activemq;

import javax.jms.Destination;

import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;

/**
 *
 * @Author zyt
 * @Date 2018/3/15 17:40
 */
@Component
public class Producer {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    /**
     * 发布者 发布topic
     * @param destinationName
     * @param message
     * @return
     */
    public boolean publish(String destinationName, final String message) {
        boolean result = true;
        try {
            Destination destination = new ActiveMQTopic(destinationName);
            jmsMessagingTemplate.convertAndSend(destination, message);
        } catch (Exception e) {
            e.printStackTrace();
            result = false;
        }
        return result;
    }
}

 订阅者

package org.tfkf.minsurance.jms.activemq;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

/**
 *
 * @Author zyt
 * @Date 2018/3/15 17:41
 */
@Component
public class Consumer {

    @JmsListener(destination = "login.topic",containerFactory = "myJmsContainerFactory")
    public void subscribe(String message){
        System.out.println("login.topic订阅者一:"+message);
    }

    @JmsListener(destination = "login.topic",containerFactory = "myJmsContainerFactory")
    public void subscribe1(String message){
        System.out.println("login.topic订阅者二:"+message);
    }
}

在pub/sub模式中,对消息的监听需要对containerFactory进行以下配置

package org.tfkf.minsurance.user.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import javax.jms.ConnectionFactory; @Configurationpublic class ConfigBase{ /** * 在pub/sub模式中,对消息的监听需要对containerFactory进行以下配置 * @param connectionFactory * @return */ @Bean public JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory){ SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPubSubDomain(true); return factory; } }

封装调用

调用实例

返回结果

两种模式实践就ok了

猜你喜欢

转载自www.cnblogs.com/zhouyantong/p/9400158.html