package io.muoncore.extension.amqp; import io.muoncore.channel.ChannelConnection; import io.muoncore.extension.amqp.rabbitmq09.RabbitMq09QueueListener; import static io.muoncore.extension.amqp.QueueMessageBuilder.HEADER_PROTOCOL; import static io.muoncore.extension.amqp.QueueMessageBuilder.HEADER_RECEIVE_QUEUE; import static io.muoncore.extension.amqp.QueueMessageBuilder.HEADER_REPLY_TO; public class DefaultServiceQueue implements ServiceQueue { private RabbitMq09QueueListener listener; private String serviceName; private AmqpConnection connection; public DefaultServiceQueue(String serviceName, AmqpConnection connection) { this.serviceName = serviceName; this.connection = connection; } @Override public void shutdown() { if (listener != null) listener.cancel(); try { connection.close(); } catch (Exception ignored){} } @Override public void onHandshake(ChannelConnection.ChannelFunction<AmqpHandshakeMessage> channelFunction) { if (listener != null) throw new IllegalStateException("QueueListener already has a handshake."); listener = new RabbitMq09QueueListener(connection.getChannel(), "service." + serviceName, fun -> { AmqpHandshakeMessage handshake = new AmqpHandshakeMessage( fun.getHeaders().get(HEADER_PROTOCOL).toString(), fun.getHeaders().get(HEADER_REPLY_TO).toString(), fun.getHeaders().get(HEADER_RECEIVE_QUEUE).toString()); channelFunction.apply(handshake); }); listener.start(); listener.blockUntilReady(); } }