java - 处理Java对象

标签 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 方法可以对所有方法使用一个工厂方法并重用代码?我只想用一些聪明的方法将 Java 代码缩小为几行。正如您所看到的,有 50 种处理交付的方法看起来不太好。

最佳答案

每个方法都是一个 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 声明为 Map<String, java.util.function.Consumer<byte[]>>相反。

关于java - 处理Java对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50830799/

相关文章:

java - 尝试用 Java 编写优先级队列但得到 "Exception in thread "main"java.lang.ClassCastException"

database - 有没有办法让 Celery/RabbitMQ 持久化?

c# - 依赖注入(inject)无法与具有 Azure Key Vault Value asp.net core 3.0 的 RabbitMQ Service Bus 一起使用

java - 短字符串太长异常

python - 两个 celery 应用程序可以相互依赖吗?或者一个应用程序的两个任务是相互依赖的?

Java Jersey 2.6 : ContainerRequestFilter: Not Inside a request scope

Java 反射输出

java - 如何在一个类中执行不同的类

java - Java.Util.Calendar 值的任意分配

python - RabbitMQ + 昆布 : write/read to one-time use queues with random names