package org.springframework.amqp.message.subscription; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Consumer; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.client.Envelope; import org.springframework.amqp.AMQException; import org.springframework.amqp.component.AbstractComponent; import org.springframework.amqp.component.Component; import org.springframework.amqp.component.Queue; import org.springframework.amqp.message.header.HeaderImpl; import org.springframework.amqp.message.MessageSink; import org.springframework.amqp.message.ReceivedMessageImpl; import java.io.IOException; public class SimpleSubscription extends AbstractComponent implements Component, Subscription { private Queue queue; private MessageSink messageSink; private boolean noAck = true; public Queue getQueue() { return queue; } public void setQueue(Queue queue) { this.queue = queue; } public MessageSink getMessageSink() { return messageSink; } public void setMessageSink(MessageSink messageSink) { this.messageSink = messageSink; } public boolean isNoAck() { return noAck; } public void setNoAck(boolean noAck) { this.noAck = noAck; } protected Consumer newConsumerInstance() { return new DefaultConsumer(getChannel()) { @Override public void handleDelivery(String consumerTag, final Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { HeaderImpl header; if (noAck) header = new HeaderImpl(); else header = new HeaderImpl() { @Override public void acknowledge() { final long deliveryTag = envelope.getDeliveryTag(); try { getChannel().basicAck(deliveryTag, false); } catch (IOException e) { throw new AMQException(String.format("Unable to acknowledge message with delivery tag '%d'", deliveryTag), e); } } }; header.setConsumerTag(consumerTag); header.setEnvelope(envelope); header.setProperties(properties); header.setRoutingKey(envelope.getRoutingKey()); ReceivedMessageImpl message = new ReceivedMessageImpl(); message.setHeader(header); message.setBody(body); messageSink.receive(message); } }; } public void declare() throws Exception { getChannel().basicConsume(queue.getName(), noAck, newConsumerInstance()); } }