【学习】使用rabbitmq

1 篇文章 0 订阅
1 篇文章 0 订阅

关于消息队列,市面上常见的有Activemq,rabbimq,kafka,rocketmq,关于性能对比,使用场景等,网上类似的文章有非常多,这里不重复陈述,开此贴是为了记录一下自己的使用。

1.rabbitmq环境的构建。

笔者直接使用docker,创建的rabbitmq容器。

关于Windows10安装docker,没有特别需要描述的,坑一定是有的。常见的问题如下:

      a.如果您使用的是Windows10 家庭版,请注意Hype-v是否能正常开启,虚拟化是否能正常开启。

      b.WSL2 installation is incomplete 报错,如果您使用的版本docker 19.03.13附近的版本,比较高的概率遇到这个提示,下载安装wsl_update_x64.msi 即可。

      c.拉取镜像缓慢,需要更换国内源,搜索docker国内源即可,这里使用的阿里源:

https://pee6w651.mirror.aliyuncs.com

ok,正常按照提示,安装完docker重启后,可以安装rabbitmq了

a. 执行docker search rabbitMq搜索镜像
b. 执行docker pull rabbitMq:3.8.3-management 拉取3.8.3-management版本(带有web页面的)的rabbitMq镜像
c. 执行docker images查看所有镜像
d. 执行docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:3.8.3-management
e. 执行docker ps 查看正在运行的容器

常见问题:

      a.在重启后,如果无法挂载5672端口,记得杀一下端口,可能会提示冲突。

      b.容器正常启动,无法访问 web->http://localhost:15672/ 应用->5672 注意启动命令中是否指定了这俩接口。

      c. docker命令解析 docker run xxx  启动容器 -d  是后台启动,即关掉shell不会终止. -p 或者 -publish 是指定端口。

     --name 指定容器名称 不支持特殊符号 

2.Springboot使用rabbit mq

   消费者的配置:

1.构建Springboot项目导入依赖:

1

2

3

4

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-amqp</artifactId>

</dependency>

2.Rabbit配置类,生成交换机,队列,以及匹配规则:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

@Configuration

public class RabbitConfig {

 

    //1.定义三个交换机

    @Bean

    public DirectExchange directExchange(){

        return new DirectExchange("DIRECT_EXCHANGE");

    }

 

    @Bean

    public TopicExchange topicExchange(){

 

        return new TopicExchange("TOPIC_EXCHANGE");

    }

 

    @Bean

    public FanoutExchange fanoutExchange(){

        return new FanoutExchange("FANOUT_EXCHANGE");

    }

    //2.定义四个队列

    @Bean

    public Queue firstQueue(){

        return new Queue("FIRST_QUEUE");

    }

 

    @Bean

    public Queue secondQueue(){

        return new Queue("SECOND_DQUEUE");

    }

 

    @Bean

    public Queue thirdQueue(){

        return new Queue("THIRD_DQUEUE");

    }

 

    @Bean

    public Queue fourthQueue(){

        return new Queue("FOURTH_DQUEUE");

    }

    //3.定义四个绑定关系

    @Bean

    public Binding bindFirst(@Qualifier("firstQueue") Queue queue,

                             @Qualifier("directExchange") DirectExchange exchange){

        return BindingBuilder.bind(queue).to(exchange).with("wuzz.test");

    }

 

    @Bean

    public Binding bindSecond(@Qualifier("secondQueue") Queue queue,

                              @Qualifier("topicExchange") TopicExchange exchange){

        return BindingBuilder.bind(queue).to(exchange).with("*.wuzz.*");

    }

 

    @Bean

    public Binding bindThird(@Qualifier("thirdQueue") Queue queue,

                             @Qualifier("fanoutExchange") FanoutExchange exchange){

        return BindingBuilder.bind(queue).to(exchange);

    }

 

    @Bean

    public Binding bindFourth(@Qualifier("fourthQueue") Queue queue,

                              @Qualifier("fanoutExchange") FanoutExchange exchange){

        return BindingBuilder.bind(queue).to(exchange);

    }

}

3.定义4个消费者:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

@Configuration

@RabbitListener(queues = "FIRST_QUEUE")

public class FirstConsumer {

 

    @RabbitHandler

    public void process(String msg){

        System.out.println("First Queue received msg : " + msg);

    }

}

@Configuration

@RabbitListener(queues = "SECOND_DQUEUE")

public class SecondConsumer {

 

    @RabbitHandler

    public void process(String msg){

        System.out.println("second Queue received msg : " + msg);

    }

}

@Configuration

@RabbitListener(queues = "THIRD_DQUEUE")

public class ThirdConsumer {

 

    @RabbitHandler

    public void process(String msg){

        System.out.println("third Queue received msg : " + msg);

    }

}

@Configuration

@RabbitListener(queues = "FOURTH_DQUEUE")

public class FourthConsumer {

 

    @RabbitHandler

    public void process(String msg){

        System.out.println("fourth Queue received msg : " + msg);

    }

}

4.配置application.properties,定义链接地址等信息:

application-dev.yml

spring

 appliacition

   name:test

rabbitmq:
  host: 127.0.0.1  # 这里如果写localhost 会有问题
  username: guest  # 默认名称
  password: guest  # 默认密码
  port: 5672       # 默认应用访问端口,注意 一般默认使用15672 做web访问接口,取决于你的命令绑定。

  启动消费者,可以通过管理页面看到有4个链接通道及交换机队列信息。

  生产者:

1.构建SpringBoot项目导入依赖

1

2

3

4

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-amqp</artifactId>

</dependency>

2.通过 RabbitTemplate 构建自己的生产者类,发送4条消息:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

@Component

public class MyProducer {

 

    @Autowired

    private RabbitTemplate rabbitTemplate;

 

    public  void send(){

        rabbitTemplate.convertAndSend("DIRECT_EXCHANGE","martin.test","DIRECT_EXCHANGE message");

        rabbitTemplate.convertAndSend("TOPIC_EXCHANGE","hello.martin.test","TOPIC_EXCHANGE hello message");

        rabbitTemplate.convertAndSend("TOPIC_EXCHANGE","he.martin.test","TOPIC_EXCHANGE hi message");

        rabbitTemplate.convertAndSend("FANOUT_EXCHANGE","","FANOUT_EXCHANGE message");

 

    }

}

3.编写测试类测试,并且启动:

1

2

3

4

5

6

7

8

9

10

11

12

@RunWith(SpringRunner.class)

@SpringBootTest

public class AppTest {

 

    @Autowired

    private MyProducer myProducer;

 

    @Test

    public  void  send(){

        myProducer.send();

    }

}

end

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值