Обработка объектов Java - PullRequest
0 голосов
/ 13 июня 2018

Я хочу использовать этот код Java для обработки сериализованных объектов Java от издателя RabbitMQ.

            Consumer consumerone = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                        byte[] body) throws IOException {
                    processobjone(body);
                }
            };
            channel.basicConsume(QUEUE_FIRST_NAME, true, consumerone);

            Consumer consumersec = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                        byte[] body) throws IOException {
                    processobjsec(body);
                }
            };
            channel.basicConsume(QUEUE_SEC_NAME, true, consumersec);

// Processing

private void processobjone(byte[] body) {       
        // handle obj
    }

    private void processobjsec(byte[] body) {   
        // handle obj
    }

  .... and many more

Проблема в том, что у меня будет более 50 типов объектов Java.Есть ли какой-либо шаблон проектирования или умный Java-способ использования, например, одного метода Factory для всех методов и повторного использования кода?Я хотел бы просто сжать код Java каким-то умным способом в несколько строк.Как видите, не очень хорошо иметь 50 методов обработки доставки.

1 Ответ

0 голосов
/ 13 июня 2018

Каждый из методов - это Consumer<byte[]>, и их необходимо назначить определенному имени очереди.Это, вероятно, лучше всего сделать в Map.

import java.util.function.Consumer;

// ...

Map<String, Consumer<byte[]>> queueToConsumer = new HashMap<>();
queueToConsumer.put(QUEUE_NAME_ONE, this::processobjone);
queueToConsumer.put(QUEUE_NAME_TWO, this::processobjtwo);
// and so on

Затем вы можете использовать это для создания Consumer s.

queueToConsumer.forEach((queueName, consumer) -> {
    channel.basicConsume(queueName, true, new DefaultConsumer() {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            consumer.accept(body);
        }
    });
});

Если у вас есть конфликт имен с Consumer из-за com.rabbitmq.client.Consumer, вы можете вместо этого объявить карту как Map<String, java.util.function.Consumer<byte[]>>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...