Centos7下安装ActiveMQ并集成springboot实现远程访问

  • 简介:介绍ActiveMQ5.x消息队列基础特性和本地快速安装
            特点:
                1)支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各种跨语言客户端和协议
                2)支持许多高级功能,如消息组,虚拟目标,通配符和复合目标
                3) 完全支持JMS 1.1和J2EE 1.4,支持瞬态,持久,事务和XA消息
                4) Spring支持,ActiveMQ可以轻松嵌入到Spring应用程序中,并使用Spring的XML配置机制进行配置
                5) 支持在流行的J2EE服务器(如TomEE,Geronimo,JBoss,GlassFish和WebLogic)中进行测试
                6) 使用JDBC和高性能日志支持非常快速的持久化
                ...
  • 去官网下载适合自己系统的版本:下载地址:官网 http://activemq.apache.org/activemq-5153-release.html

     如果是centos系统可以直接命令下载

wget http://archive.apache.org/dist/activemq/5.15.3/apache-activemq-5.15.3-bin.tar.gz

           

  • 下载完成之后,解压
tar -zxvf apache-activemq-5.15.3-bin.tar.gz
  • 进入到bin目录下,选择适合自己系统位数的linux-x86-64(我的是64位的)

  • 进入之后,执行启动命令
 ./activemq start

启动成功之后界面如下

查看启动状态

 ./activemq  status

停止启动

 ./activemq  stop

遇到的报错

启动ActiveMQ异常:java.net.URISyntaxException: Illegal character in hostname at index

首先翻译一下这个异常,就是:主机名中包含非法字符,那么非法字符是什么呢?是“_”下划线;

那么解决办法就很简单了,改主机名:

1、方法一使用hostnamectl命令

hostnamectl set-hostname  主机名

2、方法二:修改配置文件  /etc/hostname 保存退出

修改完成之后重启即可,这里我使用的是方法一:

hostnamectl set-hostname  activemq

重启后效果:

然后启动ActiveMQ并查看状态:


 

  • 本地浏览器输入IP:8161(管理端)

PS:如果是在阿里云中部署的ActiveMQ,记得将8161端口号开放

点击Manage ActiveMQ broker 进行登录,默认账号密码是admin/admin

登录之后,界面如下。到此ActiveMQ的安装就完成了,接下来让我们实现与springboot的集成

  • 首先pom文件中引入相应的jar包依赖
         <!-- 整合消息队列ActiveMQ -->
		 <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-activemq</artifactId>
	    </dependency>
		<!-- 如果配置线程池则加入 -->
		<dependency>
			<groupId>org.apache.activemq</groupId>
			<artifactId>activemq-pool</artifactId>
		</dependency>
  • 然后application.properties配置文件中加入如下配置
##=========ActiveMQ配置=========
#整合jms测试,安装在别的机器,防火墙和端口号记得开放61616是服务端口8161是管理端口
spring.activemq.broker-url=tcp://IP:61616
#集群配置
#spring.activemq.broker-url=failover:(tcp://localhost:61616,tcp://localhost:61617)
spring.activemq.user=admin
spring.activemq.password=admin
#下列配置要增加依赖
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=100

PS:spring.activemq.broker-url=tcp://IP:61616配置项中的端口号位服务端的端口号,在阿里云服务器中也要开放此端口号

消息中间件的应用场景是在多个应用之间的,为了方便起见本次的例子是在同一个应用之间操作的

  • 在Application启动类中加入注解@EnableJms。用于开启Jms

通过@Bean注解的形式将Queue方法添加到Spring中管理

/**
	 *  添加到到spring中管理,方便后续使用。默认的queue通常使用比较多,在此注入之后,后续使用不用重复new对象
	 * @return
	 */
	@Bean
	public Queue queue(){
		return new ActiveMQQueue("common.queue");
	}
  • 创建ProducerService.java接口类
import javax.jms.Destination;

/**
 * @Author:Lyd
 * @Date 2020/1/13 16:15
 * @Description  消息生产者,实际应用消息的生产者和消费者会在不同的项目中,就像webservices的服务端和客户端一样
 */
public interface ProducerService {
    /**
     * 功能描述:指定消息队列,还有消息
     * @param destination
     * @param message
     */
     void sendMessage(Destination destination, final String message);

    /**
     * 功能描述:使用默认消息队列, 发送消息
     * @param message
     */
     void sendMessage( final String message);

 

}

实现ProducerService.java接口类

import com.lyd.service.ProducerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;

import javax.jms.Destination;
import javax.jms.Queue;
import javax.jms.Topic;


/**
 * @Author:Lyd
 * @Date 2020/1/13 16:28
 * @Description
 */
@Service
public class ProducerServiceImpl implements ProducerService {
    /**
     * 用来发送消息到broker的对象
     */
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    private Queue queue;
    /**
     * 发送消息,destination是发送到的队列,message是待发送的消息
     * @param destination
     * @param message
     */
    @Override
    public void sendMessage(Destination destination, String message) {

        jmsMessagingTemplate.convertAndSend(destination, message);

    }
    /**
     * 发送消息使用默认的消息队列,message是待发送的消息
     * @param message
     */
    @Override
    public void sendMessage(final String message) {
        jmsMessagingTemplate.convertAndSend(this.queue,message);
    }
}
  • 创建controller层ActiveMqController.java类
import com.lyd.pojo.JsonData;
import com.lyd.service.ProducerService;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.jms.Destination;

/**
 * @Author:Lyd
 * @Date 2020/1/13 16:56
 * @Description ActiveMQ调用层
 */
@RestController
@RequestMapping("/api/v1/activeMq")
public class ActiveMqController {
    @Autowired
    private ProducerService producerService;

    /**
     * 给指定的queue发送消息
     * @param msg
     * @return
     */
    @GetMapping("sendMessage")
    public Object sendMessage(String msg) {
        Destination destination = new ActiveMQQueue("common.queue");
      
         producerService.sendMessage(destination, msg);
        
        return JsonData.buildSuccess();
    }

    /**
     * 给默认的queue发送消息
     * @param msg
     * @return
     */
    @GetMapping("sendCommonMessage")
    public  Object sendCommonMessage(String msg){
        producerService.sendMessage(msg);
        return  JsonData.buildSuccess();
    }
}

PS:我根据网上视频写了一个方法执行消息类JsonData.java用于显示方法执行是否成功以及相关信息的类

/**
 * @Author:Lyd
 * @Date 2019/12/27 20:03
 * @Description
 */
import java.io.Serializable;

public class JsonData implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    private Integer code; // 状态码 0 表示成功,1表示处理中,-1表示失败
    private Object data; // 数据
    private String msg;// 描述

    public JsonData() {
    }

    public JsonData(Integer code, Object data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }

    // 成功,传入数据
    public static JsonData buildSuccess() {
        return new JsonData(0, null, null);
    }

    // 成功,传入数据
    public static JsonData buildSuccess(Object data) {
        return new JsonData(0, data, null);
    }

    // 失败,传入描述信息
    public static JsonData buildError(String msg) {
        return new JsonData(-1, null, msg);
    }

    // 失败,传入描述信息,状态码
    public static JsonData buildError(String msg, Integer code) {
        return new JsonData(code, null, msg);
    }

    // 成功,传入数据,及描述信息
    public static JsonData buildSuccess(Object data, String msg) {
        return new JsonData(0, data, msg);
    }

    // 成功,传入数据,及状态码
    public static JsonData buildSuccess(Object data, int code) {
        return new JsonData(code, data, null);
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "JsonData [code=" + code + ", data=" + data + ", msg=" + msg
                + "]";
    }

}
  • 启动项目并访问
    http://localhost:8080/api/v1/activeMq/sendMessage?msg=测试0

       执行成功以后页面显示 {"code":0,"data":null,"msg":null}

       此时查看管理端,界面如下。表示消息发送成功

面板字段解释:   
        Name:队列名称。
        Number Of Pending Messages:等待消费的消息个数。
        Number Of Consumers:当前连接的消费者数目
        Messages Enqueued:进入队列的消息总个数,包括出队列的和待消费的,这个数量只增不减。
        Messages Dequeued:已经消费的消息数量。

  • 消息发送之后,需要添加消费者去消费

创建ActiveMqConsumer.java用于模拟消费

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

/**
 * @Author:Lyd
 * @Date 2020/1/13 21:48
 * @Description ActiveMQ消息消费类
 */
@Component
public class ActiveMqConsumer {
    @JmsListener(destination = "order.queue")
    public  void receiveQueue(String text){
        System.out.println("收到的ActiveMQ消费消息为:"+text);
    }
    @JmsListener(destination = "common.queue")
    public  void receiveCommonQueue(String text){
        System.out.println("收到的ActiveMQ默认消费消息为:"+text);
    }

}

此时再启动项目,会自动去消费待消费的消息。如下图表示消息已经被消费。

此时再次查看管理页面

以上是简单的springboot集成ActiveMQ,楼主也在不断学习中,后续持续更新相关技术博文。需要源码的小伙伴,加我qq1465585760。

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪头的彩虹糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值