Darse de baja de una cola específica después de una determinada fecha en RabbitMQ

Michalis S.:

Tengo una clase Java que -upon una determinada acción de los iniciados Gui- una conexión con el servidor RabbitMQ (utilizando el / sub golpeteo pub) y escuchas para nuevos eventos.

Quiero añadir una nueva característica que voy a permitir al usuario establecer un "tiempo del fin" que detendrá mi solicitud de la escucha de nuevos eventos (dejar de consumir de la cola sin cerrarla).

He intentado utilizar el método basicCancel, pero no puedo encontrar una manera de hacer que funcione para una fecha predefinida. ¿Sería una buena idea para iniciar un nuevo hilo dentro de mi clase Suscríbete que llame a la basicCancel al llegar a la fecha dada o hay una mejor manera de hacer eso?

Escuchar a nuevos eventos

    private void listenToEvents(String queueName) {
        try {
              logger.info(" [*] Waiting for events. Subscribed to : " + queueName);

              Consumer consumer = new DefaultConsumer(channel) {

                  @Override
                  public void handleDelivery(String consumerTag, Envelope envelope,
                                             AMQP.BasicProperties properties, byte[] body) throws IOException {

                    TypeOfEvent event = null;

                    String message = new String(body);


                    // process the payload
                    InteractionEventManager eventManager = new InteractionEventManager();
                    event = eventManager.toCoreMonitorFormatObject(message);


                    if(event!=null){    
                        String latestEventOpnName = event.getType().getOperationMessage().getOperationName();

                        if(latestEventOpnName.equals("END_OF_PERIOD"))
                            event.getMessageArgs().getContext().setTimestamp(++latestEventTimeStamp);            

                        latestEventTimeStamp = event.getMessageArgs().getContext().getTimestamp();                                    
                        ndaec.receiveTypeOfEventObject(event);                  
                    }
                  }
                };

                channel.basicConsume(queueName, true, consumer);   
             //Should I add the basicCancel here?
        }
        catch (Exception e) {
            logger.info("The Monitor could not reach the EventBus. " +e.toString());
        }     

    }

iniciar la conexión

  public String initiateConnection(Timestamp endTime) {

        Properties props = new Properties();
        try {
            props.load(new FileInputStream(everestHome+ "/monitoring-system/rabbit.properties"));
         }catch(IOException e){
             e.printStackTrace();
        }                       

        RabbitConfigure config = new RabbitConfigure(props,props.getProperty("queuName").trim());

        ConnectionFactory factory = new ConnectionFactory();

        exchangeTopic = new HashMap<String,String>();
        String exchangeMerged = config.getExchange();
        logger.info("Exchange=" + exchangeMerged);
        String[] couples = exchangeMerged.split(";");

        for(String couple : couples)
        {
            String[] infos = couple.split(":");
            if (infos.length == 2)
            {
                exchangeTopic.put(infos[0], infos[1]);
            }
            else
            {
                logger.error("Invalid Exchange Detail: " + couple);
            }
        }

        for(Entry<String, String> entry : exchangeTopic.entrySet()) {

            String exchange = entry.getKey();
            String topic = entry.getValue();

            factory.setHost(config.getHost());
            factory.setPort(Integer.parseInt(config.getPort()));
            factory.setUsername(config.getUsername());
            factory.setPassword(config.getPassword());

            try {
                connection1= factory.newConnection();
                channel = connection1.createChannel();
                channel.exchangeDeclare(exchange, EXCHANGE_TYPE);
                /*Map<String, Object> args = new HashMap<String, Object>();
                args.put("x-expires", endTime.getTime());*/
                channel.queueDeclare(config.getQueue(),false,false,false,null);
                channel.queueBind(config.getQueue(),exchange,topic);            
                logger.info("Connected to RabbitMQ.\n Exchange: " + exchange + " Topic: " + topic +"\n Queue Name is: "+ config.getQueue());
                return config.getQueue();
            } catch (IOException e) {
                logger.error(e.getMessage());
                e.printStackTrace();
            } catch (TimeoutException e) {
                logger.error(e.getMessage());
                e.printStackTrace();
            }
        }
        return null;
    }
Paolo Costa:

Puede crear una cola de retraso, estableciendo el tiempo de licencia por lo que el mensaje se presiona habrá muerto con letras exactamente tan pronto como se quiere dejar de su consumo.

Entonces usted tiene que obligar a la letra muerta de cambio a una cola cuyo consumo se detendrá el otro tan pronto como se reciba el mensaje.

Nunca utilice hilos cuando se tiene RabbitMQ, se puede hacer un montón de cosas interesantes con mensajes retrasados!

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=362932&siteId=1
Recomendado
Clasificación