RabbitMQ-java-client版本
com.rabbitmq:amqp-client:4.3.0
RabbitMQ
版本声明: 3.6.15
Consumer
RabbitMQ
的消费模式分为两种:Push(服务端推)
和Pull(客户端拉)
,Push(推)
采用Basic.Consume
进行消费,Pull(拉)
是调用Basic.Get
进行消费.在RabbitMQ
中Pull(拉)
适合单条消费,Push(推)
适合持续订阅
推拉模式代码
-
推模式代码示例
@Test public void testNoAuotAckSync() { String userName = "jannal"; String password = "jannal"; String virtualHost = "jannal-vhost"; String hostName = "jannal.mac.com"; String queueName = "jannal.direct.queue"; int portNumber = 5672; ConnectionFactory factory = new ConnectionFactory(); factory.setUsername(userName); factory.setPassword(password); factory.setVirtualHost(virtualHost); factory.setHost(hostName); factory.setPort(portNumber); factory.setAutomaticRecoveryEnabled(false); Connection conn = null; try { conn = factory.newConnection(); final Channel channel = conn.createChannel(); //设置客户端最多接收未被ack的消息的个数 channel.basicQos(1); //不自动确认 boolean autoAck = false; //true表示不能将一个Connection中生产者发送的消息传送给这个Connection中的消费者 boolean noLocal = false; //是否独占 boolean exclusive = false; //不同的订阅采用不同的消费者标签 String consumerTag = "consumerTag"; //basicConsume是一个同步方法 channel.basicConsume(queueName, autoAck, consumerTag, noLocal, exclusive, null, new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { long deliveryTag = envelope.getDeliveryTag(); System.out.println("Consumer1:"+new String(body, "utf-8")); channel.basicAck(deliveryTag, false); //channel.basicReject(deliveryTag,true); } }); // 阻止主程序结束 LockSupport.park(); } catch (IOException e) { logger.error(e.getMessage(), e); } catch (TimeoutException e) { logger.error(e.getMessage(), e); } finally { if (conn != null) {