java中rabbitmq 的使用-测试篇

java中rabbitmq 的使用-测试篇

1.获取Connection

  public static Connection getConnection() { // 创建Connection工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("your rabbitmq servier ip");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        factory.setVirtualHost("yangzhtest"); // 创建Connection
        Connection conn = null;
        try {
            conn = factory.newConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }// 返回
        return conn;
    }

2.生产者

在生产者中创建 交换机,所有对列,绑定Routing key,可以避免在没有消费者绑定队列的情况下,发送的消息丢失。(这个看业务决定在何处创建交换机、队列等)

    @Test
    public void publish() throws Exception {

       // 配置
        String queneName = "HelloWorld";
        String exchangeName = "myexchage-direct-test";
        String routingKey = "router.helloworld";

        //1. 获取Connection
        Connection connection = RabbitMQClientTest.getConnection();

        //2. 创建Channel
        Channel channel = connection.createChannel(); //3. 发布消息到exchange,同时指定路由的规则

        String msg = "Hello-World!";
        // 参数1:指定exchange,使用""。
        // 参数2:指定路由的规则,使用具体的队列名称。
        // 参数3:指定传递的消息所携带的properties,使用null。 /
        // 参数4:指定发布的具体消息,byte[]类型
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT); // 绑定交换机,没有则创建

        //3. 开启confirm机制
        channel.confirmSelect();

        // 发送消息持久化
        // 声明默认的队列(也可不申明队列,使用默认队列)
        //参数1:queue - 指定消费者监听队列名称
        //参数2:durable -当前队列是否需要持久化
        //参数3:exclusive -当前队列只能被一个消费者消费
        //参数4:autoDelete -如果这个队列没有消费者消费,队列自动删除
        //参数5:arguments -其他信息
        channel.queueDeclare(queneName, true, false, false, null);  // 创建队列

        // String queue = channel.queueDeclare().getQueue();
        // 将队列与交换机绑定
        channel.queueBind(queneName, exchangeName, routingKey); //绑定routingkey

        // 发送消息
        channel.basicPublish("myexchage-direct-test", routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());// 发送消息

        // Ps:exchange是不会帮你将消息持久化到本地的,Queue才会帮你持久化消息。
        if (channel.waitForConfirms()) {
            System.out.println("生产者发布消息成功!");
        }

        //4. 释放资源
        channel.close();
        connection.close();
    }

3.消费者

    //  消费者
    @Test
    public void consume() throws Exception {
        String queneName = "HelloWorld";
        String exchangeName = "myexchage-direct-test";
        String routingKey = "router.helloworld";
        Channel channel = null;
        try {
            // 获取链接对象
            Connection connection = RabbitMQClientTest.getConnection();

            // 创建channel
            channel = connection.createChannel();

            // 声明交换机类型
            channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT); // 不指定使用默认交换机

            // 声明默认的队列(也可不申明队列,使用默认队列)
            //参数1:queue - 指定消费者监听队列名称
            //参数2:durable -当前队列是否需要持久化
            //参数3:exclusive -当前队列只能被一个消费者消费
            //参数4:autoDelete -如果这个队列没有消费者消费,队列自动删除
            //参数5:arguments -其他信息
            channel.queueDeclare(queneName, true, false, false, null);

            // String queue = channel.queueDeclare().getQueue();
            // 将队列与交换机绑定
            channel.queueBind(queneName, exchangeName, routingKey);

            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(envelope.getExchange() + "," + envelope.getRoutingKey() + "," + message);
                }
            };
            
            // channel绑定队列、消费者,autoAck为true表示一旦收到消息则自动回复确认消息
            channel.basicConsume(queneName, true, consumer);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值