因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 '.*' '.*' '.*' # 授予权限
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());