package tc.oc.api.queue; import javax.annotation.Nullable; import tc.oc.api.message.Message; import tc.oc.commons.core.reflect.Types; import static com.google.common.base.Preconditions.checkNotNull; /** * Options for publishing a {@link Message} through a {@link Queue} */ public class Publish { public static final Publish DEFAULT = new Publish(); private final String routingKey; private final boolean mandatory; private final boolean immediate; public Publish(String routingKey, boolean mandatory, boolean immediate) { this.routingKey = checkNotNull(routingKey); this.mandatory = mandatory; this.immediate = immediate; } public Publish(String routingKey) { this(routingKey, false, false); } public Publish() { this("", false, false); } public String routingKey() { return routingKey; } public boolean mandatory() { return mandatory; } public boolean immediate() { return immediate; } public static Publish forMessage(Message message, @Nullable Publish publish) { if(publish == null) { publish = Publish.DEFAULT; } if("".equals(publish.routingKey())) { MessageDefaults.RoutingKey routingKey = Types.inheritableAnnotation(message.getClass(), MessageDefaults.RoutingKey.class); if(routingKey != null) { publish = new Publish(routingKey.value(), publish.mandatory(), publish.immediate()); } } return publish; } }