RabbitMQ测试用户还活着

时间:2018-06-22 13:01:59

标签: java rabbitmq

我有一个JAVA应用程序,该应用程序创建了可以收听Rabbitmq的使用者。我需要知道启动的使用者仍然可以正常工作,如果没有,那么我需要重新启动使用者。

我可以通过任何方式做到这一点。当前,我的主应用程序创建一个Executor线程池,并在创建新连接时传递此executor。

ExecutorService executor = Executors.newFixedThreadPool(30);
Connection connection = factory.newConnection(executor);

然后,main方法通过使用新通道作为参数调用构造函数并调用listen()方法来创建30个ConsumerApp对象

for(int i=0;i<=30;i++) {
 ConsumerApp consumer = new ConsumerApp(i,connection.createChanell());
 consumer.listen() }

ConsumerApp中的listen方法侦听队列并启动DefaultConsumer对象,该对象仅打印收到的消息

listen() { 
  try {
  channel.queueDeclare("test-queue-name", false, false, false, null);
  }
catch {
  System.out.println("Exception on creating Queue")
  }
Consumer consumer = new DefaultConsumer(this.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(" [x] Received Message in consumer '"+consumerId+" "+  message + "'");
        }
    };
 //Now starting the consumer
  try {
    channel.basicConsume(QUEUE_NAME, true, consumer);   
   }
    catch (ShutdownSignalException | IOException ex) {
        ex.printStackTrace();
  }
 }

我想知道他们是否可以检查消费者是否活跃。我的想法是捕获关闭信号异常并重新创建使用者对象并调用listen方法。这是必要的,因为rabbitmq自动恢复并连接回来。 ?但是我如何确保呢?

使用传递给Rabbitmq连接器的线程池可以通过任何方式实现。

我正在使用最新版本的Rabbitmq客户端5.3.0

1 个答案:

答案 0 :(得分:0)

Consumer具有different methods,可以帮助您跟踪消费者的状态。您可能对handleConsumeOkhandleCancel感兴趣。 Automatic connection recovery确实会在连接失败后重新注册使用者,但这并不能阻止您手动跟踪其使用者状态,例如公开一些有关JMX的信息。