RabbitMQ:使用笔记(一)

1.介绍

RabbitMQ是基于AMQP协议的消息中间件,服务器端用Erlang语言编写,支持多种客户端,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

2.安装

去官网下载对应的版本,在安装rabbitmq之前需要安装对应Erlang环境,安装完成后通过命令/sbin/service rabbitmq-server start启动。
http://www.rabbitmq.com/download.html

3.配置

rabbitmq默认的guest/guest用户只能在本机访问,如果需要外网用户访问,需要单独创建用户,通过命令创建用户及赋予权限
./rabbitmqctl add_user test test
./rabbitmqctl set_user_tags test administrator
注:命令行创建的用户需要在接下来的web监控页面用户管理里设定权限(下图的Set permisson),否则无法连接成功。
这里写图片描述
再通过./rabbitmq-plugins enable rabbitmq_management命令开启web监控页面显示,默认端口15672,可通过localhost:15672查看web监控页面,方便后期管理和查看队列消息。

4.Java Demo

消息提供者Provider:

package org.rabbitmq.RabbitMq;

import java.io.IOException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * java访问mq基础demo --provider
 * @author Mr.tanzc
 *
 */
public class MySpreadSend {

     //发送消息
     public static void main(String[] args) throws IOException {
        /*使用工厂类建立Connection和Channel,并且设置参数*/
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");//MQ的IP
        factory.setPort(5672);//MQ端口
        factory.setUsername("test");//MQ用户名
        factory.setPassword("test");//MQ密码
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        /*定义交换机*/
        channel.exchangeDeclare("COLOR_EXCHANGE", "direct");

        /*创建多个消息队列*/
        channel.queueDeclare("BLACK_QUEUE", false, false, false, null);
        channel.queueDeclare("RED_QUEUE", false, false, false, null);

        /*绑定交换机和队列*/
        channel.queueBind("BLACK_QUEUE", "COLOR_EXCHANGE", "black");
        channel.queueBind("RED_QUEUE", "COLOR_EXCHANGE", "red");

        /*通过交换机发送不同类别的消息到不同的队列中,注意,消息是由一个交换机来根据标志发往不同的队列中去*/
        String message = "black";
        channel.basicPublish("COLOR_EXCHANGE", "black", null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");

        message="red";
        channel.basicPublish("COLOR_EXCHANGE", "red", null, message.getBytes());
        System.out.println(" [x] Sent '" + message + "'");

        /*关闭连接*/
        channel.close();
        connection.close();
          }

}

定义两个消费者Comsumer:
第一个消费者MySpreadRecvRed

package org.rabbitmq.RabbitMq;

import java.io.IOException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.ShutdownSignalException;

public class MySpreadRecvRed {

    public static void main(String[] args) throws IOException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
        /*建立连接*/
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");//MQ的IP
        factory.setPort(5672);//MQ端口
        factory.setUsername("test");//MQ用户名
        factory.setPassword("test");//MQ密码
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        /*声明要连接的队列*/
        /*定义交换机*/
        channel.exchangeDeclare("COLOR_EXCHANGE", "direct");
        /*绑定交换机和队列*/
        channel.queueBind("RED_QUEUE", "COLOR_EXCHANGE", "red");
        /*创建消费者对象,用于读取消息*/
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume("RED_QUEUE", true, consumer);
        /* 读取队列,并且阻塞,即在读到消息之前在这里阻塞,直到等到消息,完成消息的阅读后,继续阻塞循环*/
        while (true) {
        QueueingConsumer.Delivery delivery = consumer.nextDelivery();
        String message = new String(delivery.getBody());
        System.out.println(" [x] Received '" + message + "'");
        }
        }
}

第二个消费者MySpreadRecvBlack:

package org.rabbitmq.RabbitMq;

import java.io.IOException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.ShutdownSignalException;

/**
 * 获取指定队列的消息
 * @author Mr.tanzc
 *
 */
public class MySpreadRecvBlack {

    public static void main(String[] args) throws IOException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
        /*建立连接*/
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.1.25");//MQ的IP
        factory.setPort(5672);//MQ端口
        factory.setUsername("twk");//MQ用户名
        factory.setPassword("twk");//MQ密码
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        /*声明要连接的队列*/
        /*定义交换机*/
        channel.exchangeDeclare("COLOR_EXCHANGE", "direct");
        /*绑定交换机和队列*/
        channel.queueBind("BLACK_QUEUE", "COLOR_EXCHANGE", "black");        
        /*创建消费者对象,用于读取消息*/
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume("BLACK_QUEUE", true, consumer);
        /* 读取队列,并且阻塞,即在读到消息之前在这里阻塞,直到等到消息,完成消息的阅读后,继续阻塞循环*/
        while (true) {
        QueueingConsumer.Delivery delivery = consumer.nextDelivery();
        String message = new String(delivery.getBody());
        System.out.println(" [x] Received '" + message + "'");
        }
        }
}

先运行Provider,查看到mq监控台队列里面有消息,再运行Comsumer,可以看到打印出来的消费信息,队列里面对应数据清空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值