package tc.oc.api.queue; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import com.google.common.util.concurrent.ListenableFuture; import com.rabbitmq.client.BasicProperties; import tc.oc.api.connectable.Connectable; import tc.oc.api.message.Message; import tc.oc.commons.core.logging.Loggers; import static com.google.common.base.Preconditions.checkNotNull; public class Exchange implements Connectable { @Singleton public static class Direct extends Exchange { Direct() { super("ocn.direct", "direct", true, false, false, null); } } @Singleton public static class Fanout extends Exchange { Fanout() { super("ocn.fanout", "fanout", true, false, false, null); } } @Singleton public static class Topic extends Exchange { Topic() { super("ocn.topic", "topic", true, false, false, null); } } protected Logger logger; protected @Inject QueueClient client; private final String name; private final String type; private final boolean durable; private final boolean autoDelete; private final boolean internal; private final Map<String,Object> arguments; public String name() { return name; } public String type() { return type; } public boolean durable() { return durable; } public boolean autoDelete() { return autoDelete; } public boolean internal() { return internal; } public Map<String,Object> arguments() { return arguments; } private Exchange(String name, String type, boolean durable, boolean autoDelete, boolean internal, Map<String,Object> arguments) { this.name = checkNotNull(name); this.type = checkNotNull(type); this.durable = durable; this.autoDelete = autoDelete; this.internal = internal; this.arguments = arguments == null ? null : Collections.unmodifiableMap(new HashMap<>(arguments)); } @Inject void init(Loggers loggers) { this.logger = loggers.get(getClass(), name); } @Override public void connect() throws IOException { logger.fine("Declaring " + type() + " exchange"); client.getChannel().exchangeDeclare(name(), type(), durable(), autoDelete(), internal(), arguments()); } @Override public void disconnect() throws IOException {} public void publishSync(Message message) { publishSync(message, null, (Publish) null); } public void publishSync(Message message, @Nullable Publish publish) { publishSync(message, null, publish); } public void publishSync(Message message, @Nullable BasicProperties properties) { publishSync(message, properties, (Publish) null); } public void publishSync(Message message, @Nullable BasicProperties properties, String routingKey) { publishSync(message, properties, new Publish(routingKey)); } public void publishSync(Message message, @Nullable BasicProperties properties, @Nullable Publish publish) { client.publishSync(this, message, properties, publish); } public ListenableFuture<?> publishAsync(Message message) { return publishAsync(message, null, (Publish) null); } public ListenableFuture<?> publishAsync(Message message, String routingKey) { return publishAsync(message, null, new Publish(routingKey)); } public ListenableFuture<?> publishAsync(Message message, @Nullable Publish publish) { return publishAsync(message, null, publish); } public ListenableFuture<?> publishAsync(Message message, @Nullable BasicProperties properties) { return publishAsync(message, properties, (Publish) null); } public ListenableFuture<?> publishAsync(Message message, @Nullable BasicProperties properties, String routingKey) { return publishAsync(message, properties, new Publish(routingKey)); } public ListenableFuture<?> publishAsync(Message message, @Nullable BasicProperties properties, @Nullable Publish publish) { return client.publishAsync(this, message, properties, publish); } }