安装Erlang
如安装时出现:
在CMD下使用命令:
icacls C:\Users\Administrator\Desktop /setintegritylevel H
测试:
安装RabbitMQ
也可以查看官方的Win上安装手册,注意添加系统环境变量ERLANG_HOME
到Erlang的安装目录。
使用net start
可以看到全部已经开启的服务,net stop|start|restart
加服务名就可以操作某个服务了,RabbitMQ的服务名称默认是RabbitMQ
。
如果不能正常使用服务,且在services.msc
里能找到这个服务,很可能是端口被占用,可以参考这篇来操作一下端口。
检测RabbitMQ状态:
在服务中可以看到,RabbitMQ已经依存了刚刚安装的Erlang:
在rabbitmq.config.example
(RabbitMQ的配置示例)文件中可以看到其默认端口配置:
By default, RabbitMQ will listen on all interfaces, using
the standard (reserved) AMQP port.
{tcp_listeners, [5672]},
To listen on a specific interface, provide a tuple of {IpAddress, Port}.
For example, to listen only on localhost for both IPv4 and IPv6:
{tcp_listeners, [{"127.0.0.1", 5672},
{"::1", 5672}]},
在Java中做简易通信
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>org.lzh</groupId>
<artifactId>testRbtMQ</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.1.0</version>
</dependency>
</dependencies>
</project>
Producer类(生产者)
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
//生产者
public class Producer {
//消息队列的名称
private static final String QUEUE_NMAE = "lzhQue";
public static void main(String[] args) {
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置RabbitMQ服务所在主机名(或ip)
connectionFactory.setHost("localhost");
//设置RabbitMQ服务端口(即AMQP端口)默认是5672,使用默认值时可以不作设置
connectionFactory.setPort(5672);
Connection connection = null;
Channel channel = null;
try {
//创建连接对象
connection = connectionFactory.newConnection();
//创建一个通道
channel = connection.createChannel();
//在此通道中声明一个队列(队列名,是否持久化,是否排外的,是否自动删除,队列中消息的删除时机)
//此声明仅当队列不存在时才会创建,不会重复创建已经存在的队列
channel.queueDeclare(QUEUE_NMAE, false, false, false, null);
//向队列中发送一条消息,消息的形式是字节数组
channel.basicPublish("", QUEUE_NMAE, null, "刘知昊".getBytes());
System.out.println("消息已经发送");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
try {
//关闭通道
if (null != channel)
channel.close();
//关闭连接对象
if (null != connection)
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
}
Consumer类(消费者)
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
//消费者
public class Customer {
//消息队列的名称
private static final String QUEUE_NMAE = "lzhQue";
public static void main(String[] args) {
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置RabbitMQ服务所在主机名(或ip)
connectionFactory.setHost("localhost");
//设置RabbitMQ服务端口(即AMQP端口)默认是5672,使用默认值时可以不作设置
connectionFactory.setPort(5672);
Connection connection = null;
Channel channel = null;
try {
//创建连接对象
connection = connectionFactory.newConnection();
//创建一个通道
channel = connection.createChannel();
//在此通道中声明一个队列(队列名,是否持久化,是否排外的,是否自动删除,队列中消息的删除时机)
//此声明仅当队列不存在时才会创建,不会重复创建已经存在的队列
channel.queueDeclare(QUEUE_NMAE, false, false, false, null);
//可以使用QueueingConsumer创建队列消费者,但已经不被推荐使用
//下面是现在推荐的方式
//配置获取消息的方式和所做的事
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);
//手动做ACK消息应答
getChannel().basicAck(envelope.getDeliveryTag(), false);
}
};
//消费消息(消息队列名称,是否自动ACK,Consumer对象)
channel.basicConsume(QUEUE_NMAE, false, consumer);
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
try {
//关闭通道
if (null != channel)
channel.close();
//关闭连接对象
if (null != connection)
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
}
运行
先运行生产者程序,发送一条消息到消息队列:
再运行消费者程序,接收并消费这条消息: