package org.test

import java.util.concurrent.CountDownLatch

@Log
@Configuration
@EnableRabbitMessaging
class RabbitExample implements CommandLineRunner {

	private CountDownLatch latch = new CountDownLatch(1)

	@Autowired
	RabbitTemplate rabbitTemplate

	private String queueName = "spring-boot"

	@Bean
	Queue queue() {
		new Queue(queueName, false)
	}

	@Bean
	TopicExchange exchange() {
		new TopicExchange("spring-boot-exchange")
	}

	/**
	 * The queue and topic exchange cannot be inlined inside this method and have
	 * dynamic creation with Spring AMQP work properly.
	 */
	@Bean
	Binding binding(Queue queue, TopicExchange exchange) {
		BindingBuilder
				.bind(queue)
				.to(exchange)
				.with("spring-boot")
	}

	@Bean
	SimpleMessageListenerContainer container(CachingConnectionFactory connectionFactory) {
		return new SimpleMessageListenerContainer(
		connectionFactory: connectionFactory,
		queueNames: [queueName],
		messageListener: new MessageListenerAdapter(new Receiver(latch:latch), "receive")
		)
	}

	void run(String... args) {
		log.info "Sending RabbitMQ message..."
		rabbitTemplate.convertAndSend(queueName, "Greetings from Spring Boot via RabbitMQ")
		latch.await()
	}
}

@Log
class Receiver {
	CountDownLatch latch

	def receive(String message) {
		log.info "Received ${message}"
		latch.countDown()
	}
}
