准备工作
导入相关的jar包,一般maven依赖的话只要在pom文件当中加入下面坐标就好。
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.0.0</version>
</dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.0.0</version>
</dependency>
HelloWorld示例
生产者
package com.xh.rabbitmq;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
//实例化工厂
ConnectionFactory factory = new ConnectionFactory();
//设置相关参数,地址,端口,账号,密码
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
//获取connection
Connection conn = factory.newConnection();
//获取channel
Channel channel = conn.createChannel();
//创建队列 1-队列名称 2-队列是否持久化 3-是否是排他队列 4-使用完之后是否删除此队列 5-其他属性
channel.queueDeclare("hello", false, false, false, null);
//创建路由 1-路由名称 2-路由类型
channel.exchangeDeclare("myexchange", "topic");
//绑定路由队列 1-队列名称 2-路由名称 3-routing key
channel.queueBind("hello", "myexchange", "shensha");
//发送消息 1-路由名称 2-routing key 3-其他信息 4-消息字节数组
channel.basicPublish("myexchange", "shensha", null, "HelloWorld".getBytes());
//关闭资源
channel.close();
conn.close();
}
}
package com.xh.rabbitmq;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
//实例化工厂
ConnectionFactory factory = new ConnectionFactory();
//设置相关参数,地址,端口,账号,密码
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
//获取connection
Connection conn = factory.newConnection();
//获取channel
Channel channel = conn.createChannel();
//创建队列 1-队列名称 2-队列是否持久化 3-是否是排他队列 4-使用完之后是否删除此队列 5-其他属性
channel.queueDeclare("hello", false, false, false, null);
//创建路由 1-路由名称 2-路由类型
channel.exchangeDeclare("myexchange", "topic");
//绑定路由队列 1-队列名称 2-路由名称 3-routing key
channel.queueBind("hello", "myexchange", "shensha");
//发送消息 1-路由名称 2-routing key 3-其他信息 4-消息字节数组
channel.basicPublish("myexchange", "shensha", null, "HelloWorld".getBytes());
//关闭资源
channel.close();
conn.close();
}
}
生产者在发送消息的时候,相关参数还可以设置更多.具体参数值根据实际开发环境输入.每次发送消息的时候都需要创建socket连接,这是需要昂贵的代价的.建议使用连接池来实现获取连接,使用 apache的commons-pool2来实现.发送完毕之后记得关闭资源连接.
消费者
package com.xh.rabbitmq;
import java.io.IOException;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Consumer {
public static void main(String[] args) {
// 实例化工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置相关参数,地址,端口,账号,密码
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
try {
// 获取connection
Connection conn = factory.newConnection();
// 获取channel
Channel channel = conn.createChannel();
// 创建队列 1-队列名称 2-队列是否持久化 3-是否是排他队列 4-使用完之后是否删除此队列 5-其他属性
channel.queueDeclare("hello", false, false, false, null);
//消费消息. 1-消费队列 2-是否自动发送消息回执 3-回调函数
channel.basicConsume("hello", true, new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println("接收到的消息为: " + message);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
消费者在消费的时候,也需要尝试创建队列.因为如果消费者消费的队列不存在的话,会出现异常情况.如果消费者创建的队列已经存在的话,RabbitMQ不会做任何事情.在进行消费的时候,需要设定自动发送回执ACK给服务端,当服务端接收到这个回执之后,确认消费者已经成功消费该消息时,RabbitMQ会从消息队列当中删除该消息.
回调函数,是重写的接口当中的方法,进行接收消息,以便做进一步的处理.
消费者不用关闭资源连接,因为它要一直监听队列,当队列当中有消息进来的时候,会消费该消息.
运行该示例,生产者控制台为:
消费者控制台为:
以上是JAVA简单的RabbitMQ示例.