基本使用
使用maven工程来演示,需要导入依赖包
<dependencies>
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.1.1</version>
</dependency>
</dependencies>
创建队列函数参数说明:
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
参数 | 含义 |
---|---|
queue | 队列名取值任意 |
durable | 是否为持久化的队列 |
exclusive | 是否排外,如果排这个队列只允许一个消费者监听 |
autoDelete | 是否自动删除,如果为True则表示当队列中没有消息,也没有消费者来连接时就会自动删除该队列 |
arguments | 队列的一些属性设置,通常为null |
注意:创建队列的时候如果该队列存在则放弃创建,即不会将原有的队列中的消息覆盖掉。如果该队列存在可以不调用该函数。。如果队列不存在则必须创建队列。
发送消息函数参数说明:
void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException;
参数 | 含义 |
---|---|
exchange | 交换机名称,为空字符串表示不使用交换机 |
routingKey | 队列名或routingKey,当指定交换机后这个值就是routingKey |
props | 消息的属性消息,通常为null即可 |
body | 消息体的字节数组 |
案例
注意:使用Java程序连接RabbitMQ的时候的端口是5672
发送方:
public class Send {
public static void main(String[] args) {
/**创建连接工厂
* */
ConnectionFactory factory =new ConnectionFactory();
/**RabbitMQ的连接消息
* */
factory.setHost("192.168.79.140");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("123456");
/**定义连接
* */
Connection connection=null;
/**定义通道
* */
Channel channel=null;
try {
/**获取连接
* */
connection=factory.newConnection();
/**获取通道
* */
channel=connection.createChannel();
/**创建队列
* */
channel.queueDeclare("myQueue",true,
false,false,null);
/**定义消息
* */
String message="RabbitMQ的测试消息";
/**通过通道发送消息
* */
channel.basicPublish("",
"myQueue",null,message.getBytes("utf-8"));
System.out.println("发送消息成功");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}finally {
if(channel!=null){
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
注意:finally中必须先关闭通道channel在关闭connection。否则会抛出异常。
执行结果:
注意:当管控台中的Requeue为Yes时,永远只获取到队头的消息。即不会进行出队操作。
接受方:
由于接受的回调函数有多个重载,这使用的是四个参数的
接受消息函数说明:
String basicConsume(String queue, boolean autoAck, DeliverCallback deliverCallback, CancelCallback cancelCallback) throws IOException;
参数 | 含义 |
---|---|
queue | 当前消费者监听的队列名 |
autoAck | 消息是否自动确认,true表示自动确认接受完消息后会自动将消息从队列中删除 |
deliverCallback | 消息消费者的标签,用于多个消费者监听同一个队列时确认不同的消费者。通常为空字符串即可 |
cancelCallback | 消息接受的回调函数,这个函数具体完成对消息的处理代码 |
public class Reseive {
public static void main(String[] args) {
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.79.140");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("123456");
/**通道资源和连接资源不需要关闭
* 关闭小概率会抛出异常
* */
Connection connection=null;
Channel channel=null;
try {
connection=factory.newConnection();
channel=connection.createChannel();
channel.queueDeclare("myQueue",
true,false,false,null);
channel.basicConsume("myQueue",true,"",
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(message);
}
});
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
注意:当使用了basicConsume()函数后,会启动一个线程来不间断的监听队列,如果队列中有消息就会自动接受消息。因此不能关闭连接和通道对象。如果关闭连接和通道对象可能会接受不到消息或者抛出异常。
执行结果:
如果队列里在没有监听该队列时堆积了很多消息,那么消费者监听的时候就会一次性获取队列中的所有消息。