安装RabbitMq,写程序发送接收消息

1.安装Erlang和RabbitMq

在安装RabbitMq之前需要安装的Erlang(esl-erlang_22.0_windows_amd64.exe): https://pan.baidu.com/s/1_ExgTzvCRN0byIYXgiA16g

需要安装的RabbitMq(rabbitmq-server-3.7.18.exe):https://pan.baidu.com/s/10UuuukYibnpmm16RtUZw3Q

安装时这两个软件没有特殊设置,一路同意接受就行了。

2.开启RabbitMq的管理

安装完成后,找到RaabitMq的sbin所在的目录,在我的Win10系统上,这个路径是C:Program FilesRabbitMQ Server abbitmq_server-3.7.18sbin,然后打开控制台,进入这个目录.

然后输入>rabbitmq-plugins enable rabbitmq_management

C:Program FilesRabbitMQ Server
abbitmq_server-3.7.18sbin>rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@DESKTOP-8IDBHPK:
rabbitmq_management
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@DESKTOP-8IDBHPK...
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

started 3 plugins.

C:Program FilesRabbitMQ Server
abbitmq_server-3.7.18sbin>

这一步的目的是为了能使用RabbitMq的控制界面。

3.查看RabbitMq的控制界面

打开浏览器,在地址栏输入 http://localhost:15672,在弹出的登录页中都输入guest,登录进去,你将看到下面画面。

看到这个页面后,意味着RabbitMq的安装配置都完成了,下面就可以写代码了。

4.书写代码往队列里发消息

接下来打开SpringToolSuite或者其它Eclipse,新建一个Maven工程,在pom.xml里添加以下红色粗体部分的dependency。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com</groupId>
  <artifactId>test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>test</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <dependency>
      <groupId>com.rabbitmq</groupId>
      <artifactId>amqp-client</artifactId>
      <version>4.2.0</version>
    </dependency>
    
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.9</version>
    </dependency>
    
  </dependencies>
</project>

题外话:不用Maven工程,直接用java工程也可,只是你需要自己去找对应的jar包,稍显麻烦。但网络不好用的时候还必须这么做。

创建完工程后就可以写 消息发送者 代码了。

package com.test;


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

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


/**
 * Hello world!
 *
 */
public class Sender 
{
    public static void main( String[] args ) throws IOException, TimeoutException
    {
        ConnectionFactory factory=new ConnectionFactory();
        factory.setHost("localhost");
        Connection conn=factory.newConnection();
        
        Channel channel=conn.createChannel();
        
        String queueName="MsgQue";
        channel.queueDeclare(queueName, false, false, false, null);
        
        String message="hello!RabbitMq";
        
        channel.basicPublish("", queueName, null, message.getBytes());        
        
        channel.close();
        conn.close();
    }
}

执行后不报错就说明消息发到队列里面去了。

5.书写代码从队列里取消息

在同一个工程里另外起一个类,书写下面的代码:

package com.test;

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

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class Comsumer {
    public static void main( String[] args ) throws IOException, TimeoutException
    {
        ConnectionFactory factory=new ConnectionFactory();
        factory.setHost("localhost");
        Connection conn=factory.newConnection();
        
        Channel channel=conn.createChannel();
        
        String queueName="MsgQue";
        channel.queueDeclare(queueName, false, false, false, null);
        
        Consumer consumer=new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException {
                String msg=new String(body,"UTF-8");
                System.out.println("收到消息:"+msg);
            }
        };

        
        channel.basicConsume(queueName, true, consumer);
    }
}

这个类启动后就处于阻塞状态,阻塞就像一条船堵在运河(channel)上,这时从运河上飘来的东西(消息)都会被船(消息消费者)截获住。

下面是控制台的输出,其中第一条消息是消费者启动前发上去的,第二条是消费者处于阻塞时再发的,两条消息都被消费者收取(截获)了。

收到消息:你好!RabbitMq
收到消息:hello!RabbitMq

 下图显示了消费者的状态:

好了,到此任务完成,恭喜你又做了一个Hello World程序。

参考书:

1.《疯狂Spring Cloud微服务架构实战》杨恩雄 编著

--END-- 2019年9月28日10:36:05

原文地址:https://www.cnblogs.com/heyang78/p/11601941.html