【RabbitMQ】CentOS安装RabbitMQ,及简单的Java客户端连接

在CentOS安装

因Rabbit MQ使用Erlang,所以需要先安装Erlang,安装过程中可能会遇到种种问题,可参考CentOS 6.5安装Erlang/OTP 17.0。然后就可以安装MQ了。

rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
yum install rabbitmq-server-3.6.6-1.noarch.rpm

启动与停止

rabbitmq-server start & # 启动
rabbitmqctl stop # 停止

开启控制台页面

rabbitmq-plugins enable rabbitmq_management

开启后,可以在http://xx.xx.xx.xx:15672访问控制台。如果你在其他机器访问控制台,有可能出现访问不了的情况,试试将Linus防火墙设置一下。

以前的版本通过账号/密码:guest/guest就可以登录访问,安装新版本后就不行了,所以自己新建用户,并授予角色和权限,具体可参考这篇文章:rabbitmq的web管理界面无法使用guest用户登录

rabbitmqctl add_user nicchagil 123456 # 常见用户
rabbitmqctl set_user_tags nicchagil administrator # 授予administrator角色给nicchagil
rabbitmqctl set_permissions -p / user_admin '.*' '.*' '.*' # 授予权限

Java客户端连接

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

public class Producer {

    private final static String QUEUE_NAME = "hello world";

    public static void main(String[] argv) throws Exception {
        
        Connection connection = null;
        Channel channel = null;
        try {
            /* 创建连接工厂 */
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("192.168.1.101");
            factory.setPort(5672);
            factory.setUsername("nicchagil");
            factory.setPassword("123456");
            /* 创建连接 */
            connection = factory.newConnection();
            /* 创建信道 */
            channel = connection.createChannel();

            // 声明一个队列:名称、持久性的(重启仍存在此队列)、非私有的、非自动删除的
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
            
            String message = "hello world..."; // 需发送的信息
            
            /* 发送消息,使用默认的direct交换器 */
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println("Send message -> " + message);
            
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            /* 关闭连接、通道 */
            channel.close();
            connection.close();
            System.out.println("Closed the channel and conn.");
        }

    }

}
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 Customer {

    private final static String QUEUE_NAME = "hello world";

    public static void main(String[] argv) throws java.io.IOException,
            java.lang.InterruptedException, TimeoutException {

        /* 创建连接工厂 */
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.1.101");
        factory.setPort(5672);
        factory.setUsername("nicchagil");
        factory.setPassword("123456");
        /* 创建连接 */
        Connection connection = factory.newConnection();
        /* 创建信道 */
        Channel channel = connection.createChannel();

        // 声明一个队列:名称、持久性的(重启仍存在此队列)、非私有的、非自动删除的
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        System.out.println("Waiting for messages.");

        /* 定义消费者 */
        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("Received the message -> " + message);
            }
        };
        
        // 将消费者绑定到队列,并设置自动确认消息(即无需显示确认,如何设置请慎重考虑)
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }
}

消息持久化

为了避免RabbitMQ重启或宕机导致消息丢失,我们需要设置消息持久性。

而设置消息持久性,主要分两步:

  • 设置队列是持久的
  • 发送消息时,设置消息是持久的

设置队列是持久的:

// 声明一个队列:名称、持久性的(重启仍存在此队列)、非私有的、非自动删除的
channel.queueDeclare(QUEUE_NAME, true, false, false, null);

发送消息时,设置消息是持久的:

channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

参考的文章

  • RabbitMQ Tutorials
  • Java Client API Guide
  • CentOS 6.5安装Erlang/OTP 17.0
  • rabbitmq的web管理界面无法使用guest用户登录
    

你可能感兴趣的:(【RabbitMQ】CentOS安装RabbitMQ,及简单的Java客户端连接)