rabbitMQ简单Demo(三)

Demo

功能描述:生产者将消息发送到队列(队列的名字为hello)中,消费者从队列中获取消息。

这里写图片描述

一:生产者

首先引入RabbitMQ的Java客户端依赖

<dependency>
  <groupId>com.rabbitmq</groupId>
  <artifactId>amqp-client</artifactId>
  <version>5.0.0</version>
</dependency>

@Test
public void testBasicPublish() throws IOException, TimeoutException {
    // 创建连接工厂
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("127.0.0.1");
    factory.setPort(AMQP.PROTOCOL.PORT);    // 5672
    factory.setUsername("mengday");
    factory.setPassword("mengday");

    // 新建一个长连接
    Connection connection = factory.newConnection();

    // 创建一个通道(一个轻量级的连接)
    Channel channel = connection.createChannel();

    // 声明一个队列
    String QUEUE_NAME = "heelo";
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);

    // 发送消息到队列中
    String message = "Hello RabbitMQ!";
    // 注意:exchange如果不需要写成空字符串,routingKey和队列名称保持一致
    channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
    System.out.println("Producer Send a message:" + message);

    // 关闭资源
    channel.close();
    connection.close();
}

二:消费者

@Test
public void testBasicConsumer() throws Exception{
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("127.0.0.1");
    factory.setPort(AMQP.PROTOCOL.PORT);    // 5672
    factory.setUsername("mengday");
    factory.setPassword("mengday");

    // 新建一个长连接
    Connection connection = factory.newConnection();

    // 创建一个通道(一个轻量级的连接)
    Channel channel = connection.createChannel();

    // 声明一个队列
    String QUEUE_NAME = "hello";
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    System.out.println("Consumer Wating Receive Message");

    Consumer consumer = new DefaultConsumer(channel){
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            String message = new String(body, "UTF-8");
            System.out.println(" [C] Received '" + message + "'");
        }
    };

    // 订阅消息
    channel.basicConsume(QUEUE_NAME, true, consumer);
}



三:运行结果


   
   
  1. 运行发布消息的方法,可以看到在RabbitMQ Management —> Queues 中会有自己声明的队列,Total代表消息的总条数,现在有1条消息
    这里写图片描述

  2. 运行消费者,消费者获取到了一条消息,并且RabbitMQ Management中 的对应的队列的消息总条数为0

这里写图片描述

这里写图片描述

四: Hello World示例解释
  • 关于用户名和密码:用户名和密码可以在RabbitMQ Management 平台上的Admin菜单下创建,也可以通过rabbitmqctl命令行来创建
  • 关于队列声明queueDeclare的参数:第一个参数表示队列名称、 第二个参数为是否持久化(true表示是,队列将在服务器重启时生存)、 第三个参数为是否是独占队列(创建者可以使用的私有队列,断开后自动删除)、 第四个参数为当所有消费者客户端连接断开时是否自动删除队列、 第五个参数为队列的其他参数

  • 关于basicConsume的第二个参数autoAck: 应答模式, true:自动应答,即消费者获取到消息,该消息就会从队列中删除掉, false:手动应答,当从队列中取出消息后,需要程序员手动调用方法 应答,如果没有应答,该消息还会再放进队列中,就会出现该消息一 直没有被消费掉的现象

  • 系统会为每个队列都隐式的绑定一个默认的交换机,交换机的 名称为“(AMQP default)”,类型为直连接direct,当你手动创建一个队列 时,后台会自动将这个队列绑定到一个名称为空的Direct类型交换机上 ,绑定路由名称与队列名称相同,相当于channel.queueBind(queue: ”QUEUE_NAME”, exchange:”(AMQP default)”, routingKey:”QUEUE_NAME”); 所以hello world示例虽然没有显示声明交换机,当路由键和队列名称 一样时就将消息发送到这个默认的交换机里。有了这个默认的交换机 和绑定,我们就可以像其他轻量级的队列,如Redis那样,直接操作 队列来处理消息。不过理论上是可以的,但实际上在RabbitMQ里直 接操作是不可取的。消息始终都是先发送到交换机,由交换级经过路 由传送给队列,消费者再从队列中获取消息的。不过由于这个默认交 换机和路由的关系,使我们只关心队列这一层即可,这个比较适合做 一些简单的应用,毕竟没有发挥RabbitMQ的最大功能(RabbitMQ可 以重量级消息队列),如果都用这种方式去使用的话就真是杀鸡用宰牛刀了。

  • The default exchange is implicitly bound to every queue, with a routing key equal to the queue name. It is not possible to explicitly bind to, or unbind from the default exchange. It also cannot be deleted.默认交换机隐式绑定到每个队列,其中路由键等于队列名称。不可能显式绑定到,或从缺省交换中解除绑定。它也不能被删除。

    这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值