我想使用这个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种处理交付的方法并不好看。
答案 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[]>>
。