我想使用此 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/