创建连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("host");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/virtualHosts");
connectionFactory.setUsername("username");
connectionFactory.setPassword("password");
Connection connection = connectionFactory.newConnection();
生产者
Channel channel = connection.createChannel();
/**
声明队列,声明多个队列需要交换机(可以发送到交换机,在消费者声明队列)
var1: 队列名称
var2:是否持久化队列(RabbitMQ服务重启,消息保留
var3:是否用户独立占用队列(其他用户访问不了该用户创建的消息 )
var4:自动删除队列(队列没有被使用自动删除)
var5:其他参数
*/
channel.queueDeclare(String var1, boolean var2, boolean var3, boolean var4, Map<String, Object> var5)
//多个队列要使用交换机
/**
var1: 交换机名称
var2:交换机类型
(FANOUT: 消息同时转发到绑定的每个队列;
DIRECT: 消息发送到交换机后,交换机通过路由key转发到队列;
TOPIC: 可以用通配符的DIRECT,不能字符串直接拼接,要string.*
)
*/
channel.exchangeDeclare(String var1, BuiltinExchangeType var2)
/**
交换机通过路由key转发到队列,可以绑定多条(生产者发送到交换机时,在消费者再绑定队列)
var1: 队列名称
var2:交换机名称
var3: 路由key,没有写""
*/
channel.queueBind(String var1, String var2, String var3);
//
/**
给交换机发送消息
var1: 交换机名称,使用默认交换机设置""
var2:路由key,不是DIRECT模式时绑定队列,没有写"",可以多段*.*.*(*匹配一个,#匹配多个)
var3:属性
var4:消息内容
*/
channel.basicPublish(String var1, String var2, BasicProperties var3, byte[] var4)
channel.close();
connection.close();
消费者
同一个队列可以配置多个消费者,同一个消息只被一个消费者接收
Channel channel = connection.createChannel();
//同时只处理一条信息
channel.basicQos(1);
//定义处理方法
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//envelope可以获取交换机信息
//body为消息内容
//手动ACK
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
/**
消息监听
var1: 队列名称
var2:是否自动确认消息ACK(处理消息后自动清除消息)
var3:绑定处理方法
*/
channel.basicConsume(String var1, boolean var2, Consumer var3);