处理Java对象

时间:2018-06-13 06:54:14

标签: java rabbitmq

我想使用这个Java代码处理RabbitMQ发布者的序列化Java对象。

            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 :(得分:1)

每个方法都是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

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[]>>