1.连接RabbitMQ
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(USERNAME);
factory.setPassword(PASSWORD);
factory.setVirtualHost(virtualHost) ;
factory.setHost(IP ADDRESS);
factory.setPort(PORT) ;
Connection conn = factory.newConnection();
Connection 接口被用来创建一个 Channel:
Channel channel = conn.createChannel();
2.使用交换器和队列
channel.exchangeDeclare(exchangeName , "direct" , true) ;
String queueName = channel . queueDeclare() .getQueue( );
channel . queueBind (queueName , exchangeName , routingKey);
上面创建了一个持久化的、非自动删除的、绑定类型为direct的交换器,同时也创建了一个非持久货损的、排他的、自动删除的队列。
3.发送消息
byte[] messageBodyBytes = "Hello , world! ". getBytes();
channel.basicPublish(exchangeName , routingKey , null , messageBodyBytes);
4.消费消息
1)推模式
boolean autoAck = false ;
channel . basicQos(64);
channel . basicConsume(queueName , autoAck, "myConsumerTag" ,
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope ,
AMQP.BasicPropert es propert es
byte [l body)
throws IOException
String routingKey = envelope . getRoutingKey( );
String contentType = properties.getContentType() ;
long deliveryTag = envelope.getDeliveryTag() ;
// (process the message components here . .. )
channel . basicAck(deliveryTag, false );
}
, } ) ;
2)拉模式
GetResponse response = channel.basicGet(QUEUE NAME , false) ;
System.out.println(new String(response.getBody()));
channel .basicAck(response . getEnvelope() . getDeliveryTag() , false);
5.消费端的确认与拒绝
RabbitMQ提供了消息确认机制
消费者在订阅队列时,可以指定autoAck参数
False时:
RabbitMQ会等待消费者显式地回复确认信号后才从内存或磁盘中移去消息。
消费者有足够的时间处理消息任务,不用担心处理消息过程中消费者进程挂掉后消息丢失的问题,因为RabbitMQ会一直等待持有消息直到消费者显式调用 Basic.Ack命令为止。
True时:
RabbitMQ会自动把发送出去的消息置为确认, 然后从内存中删除,而不管消费者是否真正的消费到了这些消息。
6.关闭连接
channel.close();
conn.close() ;