RabbitMQ的搭建以及在java中的使用

一.在Linux中安装RabbitMQ
虽然RabbitMQ有Windows和Mac版的,但是建议还是装在Linux中,毕竟很少有项目把Windows或Mac作为服务器使用。
安装方式一:直接在线安装
1.因为RabbitMq是使用Erlang语言编写的,所以先要配置Erlang环境
(1)安装Erlang的依赖文件

     yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto

(2)下载Erlang安装包

    wget -c http://erlang.org/download/otp_src_20.2.tar.gz

(3)解压

    tar -zxvf otp_src_20.2.tar.gz

(4)进入otp_src_20.2文件夹中进行接下来的操作

    cd otp_src_20.2/

(5)安装
执行以下命令,将Erlang安装到/usr/local/erlang目录下

    ./configure --prefix=/usr/local/erlang

(6)编译

    make && make install

(7)测试Erlang安装情况

    cd /usr/local/erlang/bin
    ./erl -version

出现如图效果,则表明Erlang安装成功
在这里插入图片描述
(8).配置Erlang环境变量,如图:
在这里插入图片描述
(9).检测环境变量安装情况
2.开始安装RabbitMq
(1)下载RabbitMq安装包

    wget -c http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-generic-unix-3.6.15.tar.xz

(2)解压

    xz -d rabbitmq-server-generic-unix-3.6.15.tar.xz
    tar -xvf rabbitmq-server-generic-unix-3.6.15.tar

(3)配置RabbitMq环境变量,如图
在这里插入图片描述
(4)RabbitMq常用命令
启动: rabbitmq-server -detached

关闭:rabbitmqctl stop

查看状态:rabbitmqctl status

设置开机启动:chkconfig rabbitmq-server on

(5)创建用户
查看用户列表:rabbitmqctl list_users

添加用户和密码:rabbitmqctl add_user admin 123456

删除用户:rabbitmqctl delete_user admin

修改密码:rabbitmqctl change_password admin 666666

(6)为新创建的用户添加权限
查看用户权限:rabbitmqctl list_user_permissions admin

设置用户权限:rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'

(7)使用浏览器打开RabbitMq管理界面,如图

在这里插入图片描述
在这里插入图片描述

安装方法二:在docker容器中起RabbitMq服务
1.下载RabbitMq镜像

    docker pull rabbitmq:3.7.7-management

在这里插入图片描述

2.起RabbitMq容器

    docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:3.7.7-management

在这里插入图片描述
3.添加用户密码,以及验证参照方法一中的方法

二.写代码调用
1.maven工程先导入rabbitmq相关jar报

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

2.获取RabbitMq连接类

package com.rabbit.mq.util;

import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class ConnectionUtil {
	public Connection getConnection() throws IOException, TimeoutException {
		  /*
		   * 创建mq连接工厂
		   */
		  ConnectionFactory factory = new ConnectionFactory();
	 	  /*
		   * 配置mq连接工厂
		   */
		  factory.setHost("192.168.*.*");
		  factory.setUsername("admin");
		  factory.setPassword("123456");
		  factory.setPort(5672);
		  /*
		   * 获取到mq连接
		   */
		  Connection connection = factory.newConnection();
		  return connection;		
	  }
}

3.创建生产者(发送消息)

package com.rabbit.mq.test;

import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbit.mq.util.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

public class Producer {
	  private final static String EXCHANGE_NAME = "exchange_name_test";
	  private final static String QUEUE_NAME = "queue_name_test";
	  private final static String ROUTING_KEY = "routing_key_test";
	
	  public static void main(String[] args) {
		  Producer producer = new Producer();
		  try {
			  producer.sendMessage();
		  } catch (IOException | TimeoutException e) {
			  e.printStackTrace();
		  }
	  }
	
	public void sendMessage() throws IOException, TimeoutException {
		  ConnectionUtil util = new ConnectionUtil();
		  Connection connection = util.getConnection();		
		  //创建一个信道
		  Channel channel = connection.createChannel();
		
		  /*
		   * 1.在信道中声明一个exchange
		   * 
		   * 参数1:交换器名称
		   * 参数2:交换器类型,“direct”(直接类型)、“fanout”(扇形)、“topic”(匹配类型)、“headers”
		   * 参数3:设置是否持久化,设置为true 表示持久化, 反之是非持久化。持久化可以将交换器存盘,在服务器重启的时候不会丢失相关信息
		   * 参数4:设置是否自动删除,设置为true则表示自动删除。自动删除的前提是至少有一个队列或者交换器与这个交换器绑定,之后所有与这个
		   *      交换器绑定的队列或者交换器都与此解绑。注意不能错误地把这个参数理解为:"当与此交换器连接的客户端都断开时,RabbitMQ
		   *      会自动删除本交换器"
		   * 参数5:是否内置,true表示为内置的交换器,即客户端无法直接发送消息到这个交换器,只能使用其他交换器路由到此交换器
		   * 参数6:其他参数
		   */
		  channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, false, null);
		
		  //2.在信道中生成一个queue
		  channel.queueDeclare(QUEUE_NAME, true, false, false, null);
		
		  //3.将exchange和queue绑定,绑定规则为routing key
		  channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY, null);
		
		  String message = "This is from producer2 ! !";
		  System.out.println(" [生产者2] Start Send Message ! ! ");
		
		  //4.发送消息,路由规则同“3”中绑定的routing key
		  channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes());
		
		  System.out.println(" [生产者2] Send Message End ! !");
		
		  this.close(connection, channel);
	}
	
	  public void close(Connection connection , Channel channel) throws IOException, TimeoutException {
		  channel.close();
		  connection.close();
	  }
}

4.创建消费者(处理消息)

package com.rabbit.mq.test;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.TimeoutException;

import com.rabbit.mq.util.ConnectionUtil;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class Consumer2 {
	  private final static String QUEUE_NAME="queue_name_test";
	
	  public static void main(String[] args) {
		  Consumer2 consumer = new Consumer2();
		  try {
			 consumer.getMesssage();
		   } catch (IOException | TimeoutException e) {
			  e.printStackTrace();
		  }
	  }
	
	public void getMesssage() throws IOException, TimeoutException {
		  ConnectionUtil util = new ConnectionUtil();
		  Connection connection=util.getConnection();
		
		  // 创建一个通道
		  Channel channel = connection.createChannel();
		  // 申明要关注的队列
		  channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		
		  /*
		   * DefaultConsumer类实现了Consumer接口,通过传入频道,告诉服务器我们需要哪个频道的消息
		   * 如果频道中有消息就会执行回调函数
		   */
		  Consumer consumer = new DefaultConsumer(channel) {
			  @Override
			  public void handleDelivery(String consumerTag , Envelope envelope ,
					  AMQP.BasicProperties properties , byte[] body) throws UnsupportedEncodingException {
				
				  String message = new String(body, "UTF-8");
                  System.out.println("Customer Received '" + message + "'");	
			  }			
		  };
		  channel.basicConsume(QUEUE_NAME, true, consumer);	
	  }
}

5.新创建的消息队列可以在管理器中查看到,如图:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值