package com.intrbiz.bergamot.queue.impl;
import java.io.IOException;
import com.intrbiz.bergamot.io.BergamotTranscoder;
import com.intrbiz.bergamot.model.message.event.control.ControlEvent;
import com.intrbiz.bergamot.queue.ControlQueue;
import com.intrbiz.gerald.source.IntelligenceSource;
import com.intrbiz.gerald.witchcraft.Witchcraft;
import com.intrbiz.queue.Consumer;
import com.intrbiz.queue.DeliveryHandler;
import com.intrbiz.queue.Producer;
import com.intrbiz.queue.QueueBrokerPool;
import com.intrbiz.queue.QueueManager;
import com.intrbiz.queue.name.NullKey;
import com.intrbiz.queue.rabbit.RabbitConsumer;
import com.intrbiz.queue.rabbit.RabbitProducer;
import com.rabbitmq.client.Channel;
public class RabbitControlQueue extends ControlQueue
{
public static final void register()
{
QueueManager.getInstance().registerQueueAdapter(ControlQueue.class, RabbitControlQueue::new);
}
private final BergamotTranscoder transcoder = new BergamotTranscoder();
private final QueueBrokerPool<Channel> broker;
private final IntelligenceSource source = Witchcraft.get().source("com.intrbiz.bergamot.queue");
@SuppressWarnings("unchecked")
public RabbitControlQueue(QueueBrokerPool<?> broker)
{
this.broker = (QueueBrokerPool<Channel>) broker;
}
public String getName()
{
return "control-queue";
}
@Override
public Producer<ControlEvent> publishControlEvents()
{
return new RabbitProducer<ControlEvent, NullKey>(this.broker, this.transcoder.asQueueEventTranscoder(ControlEvent.class), new NullKey(), this.source.getRegistry().timer("publish-control-events"))
{
protected String setupExchange(Channel on) throws IOException
{
on.exchangeDeclare("bergamot.control", "topic", true);
return "bergamot.control";
}
};
}
@Override
public Consumer<ControlEvent, NullKey> consumeControlEvents(DeliveryHandler<ControlEvent> handler)
{
return new RabbitConsumer<ControlEvent, NullKey>(this.broker, this.transcoder.asQueueEventTranscoder(ControlEvent.class), handler, this.source.getRegistry().timer("consume-control-events"))
{
public String setupQueue(Channel on) throws IOException
{
on.queueDeclare("bergamot.control.queue", true, false, false, null);
on.exchangeDeclare("bergamot.control", "topic", true);
on.queueBind("bergamot.control.queue", "bergamot.control", "#");
return "bergamot.control.queue";
}
};
}
@Override
public void close()
{
}
}