ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springboot-消息中间件:ActiveMQ和RabbitMQ

2021-05-29 20:01:15  阅读:206  来源: 互联网

标签:springboot ll springframework RabbitMQ org import ActiveMQ


文章目录


1 消息中间件介绍

1.两个重要的规范JMS和AMQP

JMS(Java Message Service),java通信的规范,统一java api层面的标准,规范写法。
AMQP,不是从api层面去规范的,是从协议的层面去规范发消息和解析消息,不管什么语言,只要遵守这个规范,就可以使用AMQP。比较有代表的是RabbitMQ。

2.什么是消息中间件

消息中间件是一种跨线程通信的方式

3.优点

能够很好地实现服务的调用者和消费者的解耦
发邮件是一个耗时的操作,是单线程,发完邮件后不可能等着发成功后响应,对于系统而言,有很多个模块都需要发邮件,可以把邮件服务抽取出来,单独做一个项目,从消息中间件中提取数据。哪个模块想发邮件,就往消息中间件发一条信息,另一个模块自动从消息中间件中读取信息发送邮件。
如果采用多线程的话,发邮件就跟服务绑定在了一起,不好扩展。

2 JMS之ActiveMQ

1.准备工作

1.ActiveMQ下载

ActiveMQ下载

2.启动

在bin目录下输入activemq start命令启动

F:\activemq\apache-activemq-5.16.2\bin>activemq start

3.访问网址

8161是管理客户端的端口号,61616是通信的端口号
http://localhost:8161/
默认用户名和密码都是:admin
在这里插入图片描述

2.springboot中使用ActiveMQ

1.创建springboot项目

依赖选择web和ActiveMQ5
在这里插入图片描述

2.在application.yml中配置相关参数

spring:
  activemq:
    broker-url: tcp://127.0.0.1:61616  # 61616是通信端口号
    packages:
      trust-all: true  # 信任所有的包
    user: admin  # 客户端的账户
    password: admin  # 客户端的密码

3.在springboot的main方法所在类定义一个消息队列

package com.ll;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import javax.jms.Queue;

@SpringBootApplication
public class JmsApplication {

	public static void main(String[] args) {
		SpringApplication.run(JmsApplication.class, args);
	}

	// 消息队列
	@Bean
	Queue queue(){
		return new ActiveMQQueue("ll-Queue");
	}

}

4.创建JMS的组件

package com.ll.config;

import com.ll.model.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;

import javax.jms.Queue;

// 在组件里实现消息的发送和接收
@Component
public class JmsComponent {
    // springboot已经帮我们做了自动化配置,所以在这里面直接注入消息发送模板
    @Autowired
    JmsMessagingTemplate jmsMessagingTemplate;
    @Autowired
    Queue queue;

    // 发信息
    public void sendMessage(Message message){
        // 发到哪里去queue,发送内容message
        jmsMessagingTemplate.convertAndSend(queue,message);
    }

    // 接收信息
    // JmsListener会时刻监听消息队列,一旦,队列里有消息就会打印出来
    @JmsListener(destination = "ll-Queue") // 确定该消息是接收信息的
    public void receive(Message message){
        System.out.println("msg:" +message);
    }
}

4.发送邮件

先运行一个项目
再运行一个发送邮件的单元测试,当发送邮件后,前一个项目的控制台会打印出信息

package com.ll;

import com.ll.config.JmsComponent;
import com.ll.model.Message;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@SpringBootTest
class JmsApplicationTests {
	@Autowired
	JmsComponent jmsComponent;

	@Test
	void contextLoads() {
		Message message = new Message();
		message.setContent("哈哈哈哈哈哈哈哈哈哈");
		message.setDate(new Date());
		jmsComponent.sendMessage(message);
	}
}

5.该例子的完整项目代码

jmsgithub链接

3 AMQP之RabbitMQ

1.准备工作

1.使用 Docker 安装 RabbitMQ

网址

2.在linux服务器上安装Docker

# 首先安装 Docker
yum -y install docker

# 然后启动 Docker 服务
service docker start

# 测试安装是否成功
docker -v

3.在安装Docker的linux上,安装RabbitMQ

查看仓库里的RabbitMQ
docker search rabbitmq

安装RabbitMQ
docker pull rabbitmq

启动RabbitMQ
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq

先执行docker ps 拿到当前的镜像ID
进入容器
安装插件
ctrl+p+q退出当前容器
docker ps 
docker exec -it 镜像ID /bin/bash
rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述

4.客户端window机访问RabbitMQ后台网页

http://linuxip地址:15672,这里的用户名和密码默认都是guest
在这里插入图片描述

2.springboot中使用RabbitMQ

1.创建springboot工程,添加依赖

添加web和RabbitMQ的依赖
在这里插入图片描述

3.配置RabbitMQ

通信端口5672,15672管理页面端口

4.交换机

交换机概念:
所有生产的消息都会交给交换机exchange,exchange根据不同的策略将信息发送到RabbitMQ里面去。
四种策略:
Direct exchange、Fanout exchange、Topic exchange、Headers exchange(使用频率相对低)。

1.Direct exchange直来直去的交换机

路由策略:把消息队列绑定到Direct exchange上面,当消息到达时,会转发到相应的routing key上面,跟ActiveMQ点对点发送差不多,给一个队列就可以了,跟交换机的关系并不大。

1.创建消息队列

如果用了Direct 模式,可以不使用DirectExchange Bean和Binding Bean。

// DirectConfig.java

package com.ll.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DirectConfig {

    @Bean
    Queue directQueue(){
        return new Queue("ll-directQueue");
    }

    // 如果用了Direct 模式,可以不使用DirectExchange Bean和Binding Bean。
//    @Bean
//    DirectExchange directExchange(){
//        // durable:重启后是否有效  autoDelete:长期未使用是否自动删除
//        return new DirectExchange("ll-direct",true,false);
//    }
//
//    // 将队列Queue和交换机DirectExchange绑定到一起
//    @Bean
//    Binding binding(){
//        return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct");
//    }
}

2.消息接收
// DirectRecevier.java

package com.ll.recevier;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
// 消息接收
public class DirectRecevier {
    @RabbitListener(queues = "ll-directQueue")
    public void handlerDirect(String message){
        System.out.println("msg:   "+message);
    }
}


3.单元测试发送信息
package com.ll;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class AmqpApplicationTests {

	@Autowired
	RabbitTemplate rabbitTemplate;

	@Test
	void contextLoads() {
		rabbitTemplate.convertAndSend("ll-directQueue","哈哈哈哈哈");
	}

}

标签:springboot,ll,springframework,RabbitMQ,org,import,ActiveMQ
来源: https://blog.csdn.net/qq_38190823/article/details/117385631

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有