Я написал скрипт, который использует Spring Rabbit для помещения ряда сообщений в очередь Rabbit, используя RabbitTemplate.convertAndSend, а затем завершает работу. Однако соединение Rabbit, по-видимому, поддерживает работу приложения даже после того, как сообщение поставлено в очередь. Я не нашел способа четко указать серверу Rabbit остановиться после того, как сообщения поставлены в очередь.
Лучшее решение, которое я смог придумать, — изменить мои вызовы convertAndSend на convertSendAndReceive, чтобы я знал, что сообщение успешно помещено в очередь, а затем выйдите, используя System.exit(0). Я переключился на convertSendAndReceive, так как оказалось, что convertAndSend происходит в фоновом потоке или что-то в этом роде, поскольку, если я выполню System.exit(0) после выполнения ряда этих вызовов, только первый из них будет успешным.
Обратите внимание, что простое создание RabbitTemplate не приводит к такому поведению; использование его с помощью одного из методов «отправить».
Следующий код иллюстрирует проблему.
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import static issues.RabbitSettings.*; //Static fields containing my test Rabbit connection info
public class RabbitTemplateShutdownIssue {
public static void main(String[] args) {
RabbitTemplate rabbitTemplate = createRabbitTemplate();
rabbitTemplate.convertAndSend(ROUTING_KEY, "Test"); // Or convertSendAndReceive
// The app never exits
}
private static RabbitTemplate createRabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(getConnectionFactory());
rabbitTemplate.setExchange(EXCHANGE);
rabbitTemplate.setMandatory(true);
return rabbitTemplate;
}
private static ConnectionFactory getConnectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(HOSTNAME);
connectionFactory.setPublisherConfirms(true);
connectionFactory.setVirtualHost(VIRTUAL_HOST);
connectionFactory.setUsername(USERNAME);
connectionFactory.setPassword(PASSWORD);
return connectionFactory;
}
}
Есть ли способ приказать клиенту Rabbit закрыться, в идеале, после того, как все сообщения будут поставлены в очередь?
ApplicationContext
- это PITA, с которым нужно иметь дело, так как вам нужно закрыть все, чтобы не получать исключений. Простое решение? Делай это правильно! - person Boris the Spider   schedule 19.08.2016