您当前的位置: 首页 >  rabbitmq

java持续实践

暂无认证

  • 3浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

黑马十次方项目day05-03之Rabbitmq直接模式

java持续实践 发布时间:2019-01-27 11:15:53 ,浏览量:3

文章目录
      • 什么是直接模式
      • 创建队列
      • java代码实现,消息生产者
        • 创建一个maven工程
        • 创建yml配置文件
      • 生产者发送消息
      • 消息的消费者
      • 负载均衡的测试

什么是直接模式

直接模式,就是不走交换器exchange的模式,(底层还是走了交换器,只不过是走的默认的交换器). 当需要将消息发给唯一一个节点时使用这种模式,这是最简单的一种形式。 任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。 1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空字符串,下 文称其为default Exchange)。 2.这种模式下不需要将Exchange进行任何绑定(binding)操作 3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。 4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃

创建队列

在rabbitmq的页面控制台中,选择queues. 按照如下图的选择,创建一个名为firstQueue的队列. 添加完成后,可以看到如下图所示的队列了.

java代码实现,消息生产者 创建一个maven工程

pom文件中的依赖如下



    4.0.0

    com.thc.demo
    rabbitmqdemo
    1.0-SNAPSHOT

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.1.RELEASE
    

    
        
            org.springframework.boot
            spring-boot-starter-amqp
        

        
            org.springframework.boot
            spring-boot-starter-test
        

    





创建yml配置文件

在yml中指定mq的主机

server:
  port: 8888

spring:
  rabbitmq:
    host: 1553.552.24

生产者发送消息

在如下的测试包下 创建测试类com.tensquare.test.ProductTest 编写如下的代码, 进行消息的发送 其中convertAndSend方法的第一个参数为指定了routingkey的值,要与在rabbitmq中建立的队列的名称要对应上,并且当要消费该消息时,也要使用该键值.

package com.tensquare.test;

import com.tensquare.rabbit.RabbitApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * 类名称:ProductTest
 * 类描述:信息的生产者
 *
 * @author: taohongchao
 * 创建时间:2019/1/27 9:59
 * Version 1.0
 */

//使用spring的测试代替junit的测试
@RunWith(SpringRunner.class)
//指定测试程序的入口,springboot没有配置文件,只能指定启动类
@SpringBootTest(classes = RabbitApplication.class)
public class ProductTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @Test
    public void sendMsg(){
        rabbitTemplate.convertAndSend("firstQueue", "直接模式测试");
    }
}

运行sendMsg的测试方法, 运行成功后,在rabbitmq的控制台中,可以看到已经有一个消息进来了.

消息的消费者

在如下的包中, 创建消息的消费者 com.tensquare.rabbit.customer @RabbitListener注解,代码消息的监听者, 一有消息就进行消息的消费. 并且用queues来指定消费哪个消息. 使用@RabbitHandler来处理接收到的信息, 在方法的形参中, 进行消息的接收.

代码如下

package com.tensquare.rabbit.customer;

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

/**
 * 类名称:Customer1
 * 类描述:信息的消费者
 *
 * @author: taohongchao
 * 创建时间:2019/1/27 10:16
 * Version 1.0
 */
@Component
@RabbitListener(queues="firstQueue")
public class Customer1 {

    /**
     * 方法名: getMsg
     * 方法描述: 消费消息,并打印信息
     * 修改日期: 2019/1/27 10:36
      * @param msg
     * @return void
     * @author taohongchao
     * @throws
     */
    @RabbitHandler
    public void getMsg(String msg) {
        System.out.println("直接模式消费消息: "+msg);
    }
}

编写完成后, 启动RabbitApplication主启动类 启动项目后,控制台打印如下,代表接收到了消息. 在rabbitmq的控制台中,可以看到消息变成0了

负载均衡的测试

我使用的idea版本为2018.3.2 首先在如下图中,点击运行配置 勾选右上角的此处, 允许并列运行项目 首先在yml中, 设置端口号为8001, 在消费的方法中, 设置打印语句为"1111直接模式消费消息: "+msg 运行项目,就开启了8001的端口. 接着修改yml文件, 修改端口为8002, 在打印语句中,设置为2222直接模式消费消息,运行项目,开启8002端口. 再修改yml文件,修改端口为8003, 在打印语句中,设置为3333直接模式消费消息,运行项目,开启8003端口.

运行三次测试类中的发送消息的方法 可以看到的现象是, 在三个接收消息的端口中, 分别都接收到了一个消息. 如下面三个图所示 说明rabbitmq的底层,对消息的接收,做了负载均衡,让每一个消息的接收,分别给一个接收者,这样不会让一个接收者一直接收消息.

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.1266s