RabbitMQ初体验

废话不多说直接开始

第一步:

首先是下载RabbitMQ的二进制包,在这里只提供mac系统的下载方式,其他系统网上教程有很多,在这里我只针对mac安装
brew更新到最新版本,执行:brew update
安装Erlang,执行:brew install erlang
安装RabbitMQ Server,执行:brew install rabbitmq
通过上面的命令,RabbitMQ Server的命令会被安装到/usr/local/sbin,
并不会自动加到用户的环境变量中去,所以我们需要在.bash_profile或.profile文件中增加下面内容:
PATH=$PATH:/usr/local/sbin
source ~/.bash_profile   //是配置生效
这样,我们就可以通过rabbitmq-server命令来启动RabbitMQ的服务端了。
启动之后可以在浏览器中输入localhost:15672默认的登录名和密码都是guest,当看到以下界面表示启动成功

RabbitMQ初体验_第1张图片
第二步:

  1. 创建一个springboot项目,然后在pom文件中加入以下依赖:
    
        org.springframework.boot
        spring-boot-starter-amqp
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    

2.在application.properties中配置RabbitMQ的连接信息

spring.application.name=rabbitmq-hello    
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=liguohui
spring.rabbitmq.password=liguohui

3.创建第一个消息生产者,做消息的发送:

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
 * 通过注入AmqpTemplate接口的实例来实现消息的发送,
 * AmqpTemplate接口定义了一套针对AMQP协议的基础操作。
 * 在Spring Boot中会根据配置来注入其具体实现。在该生产者,
 * 我们会产生一个字符串,并发送到名为hello的队列中。
 */
@Component
public class Sender {
    @Autowired
    private AmqpTemplate rabbitTemplate;
    public void send(){
        String context = "hello "+ new Date();
        System.out.println("Sender : " + context);
        rabbitTemplate.convertAndSend("hello",context);
    }
}

4.创建第一个消息消费者

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

/**
 * 创建消息消费者Receiver。
 * 通过@RabbitListener注解定义该类对hello队列的监听,
 * 并用@RabbitHandler注解来指定对消息的处理方法。
 * 所以,该消费者实现了对hello队列的消费,消费操作为输出消息的字符串内容
 */
@Component
@RabbitListener(queues = "hello")  //监听消息队列hello
public class Receiver {

    @RabbitHandler   //指定对消息的处理方法,处理方法就是输出消息的字符串内容.
    public void process(String hello){
        System.out.println("Receiver : " + hello);
    }
}

5.创建RabbitMQ的配置类RabbitConfig

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * 创建RabbitMQ的配置类RabbitConfig,
 * 用来配置队列、交换器、路由等高级信息。
 * 这里我们以入门为主,先以最小化的配置来定义,以完成一个基本的生产和消费过程。
 */
@Configuration
public class RabbitConfig {
    @Bean
    public Queue helloQueue(){
        return new Queue("hello");
    }
}

6.接下来就是创建测试类:

import com.alibaba.rabbitmq.RabbitmqHelloApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = RabbitmqHelloApplication.class) //加载主类
public class HelloApplicationTests {

    @Autowired
    private Sender sender;
    
    @Test
    public void hello() throws Exception{
        sender.send();
    }
}

7.可能出现的错误:

Caused by:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
qualifying bean of type ‘com.alibaba.sender.Sender’ available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}

出现这种错误的原因就是,虽然你在测试类中已经加载了启动类,但是启动类和你注入的类不在同一个包中,所以需要在启动类进行包扫描,只需要在启动类上加上下面这句换就好了

@ComponentScan(basePackages = "com.alibaba") //因为启动类和其他类不在同一个包中,因此想要加载的话需要进行包扫描

8.测试:
启动启动类,然后运行hello测试方法,在该控制台中打印如下表示消息生产者已经产生了一个消息:

Sender : hello Tue Sep 11 11:36:05 CST 2018

同时控制台也打印出了监听队列的结果:

Receiver : hello Tue Sep 11 11:36:05 CST 2018

同时你还可以在浏览器的控制台中看到一个hello队列在使用中.
RabbitMQ初体验_第2张图片
至此,RabbitMQ的第一个测试demo就完成了

你可能感兴趣的:(服务器架构)