Контекст приложения закрыт, и ConnectionFactory больше не может создавать соединения Spring AMQP

Я реализовал многопоточность для выполнения некоторых операций в jira после получения сообщения от rabbitmq. Я использую spring amqp (версия 1.6.1)

Как только поток перехватывает исключение, я устанавливаю статус как ошибку и объект вывода, о котором я буду говорить в будущем. При отправке этого выходного объекта в очередь. Я столкнулся с вышеупомянутым исполнением

Код:

Завод подключения:

@Configuration
@PropertySources({ @PropertySource("classpath:application.properties") })
public class RabbitMQConfiguration {

    @Autowired
    private Environment environment;

    @Bean
    public ConnectionFactory connectionFactory() {

        // TODO make it possible to customize in subclasses.
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(environment.getProperty("bip.rabbitmq.url"));
        connectionFactory.setUsername(environment.getProperty("bip.rabbitmq.username"));
        connectionFactory.setPassword(environment.getProperty("bip.rabbitmq.password"));
        return connectionFactory;
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    /**
     * @return the admin bean that can declare queues etc.
     */
    @Bean
    public AmqpAdmin amqpAdmin() {
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());
        return rabbitAdmin;
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());
        template.setMessageConverter(jsonMessageConverter());
        return template;
    }

    @Bean(name = "jiraQueueListenerContainerFactory")
    public SimpleRabbitListenerContainerFactory jiraQueueListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setMessageConverter(new Jackson2JsonMessageConverter());
        factory.setReceiveTimeout(10L);
        return factory;
    }

}

MessageHandler:

@Component
@PropertySources({ @PropertySource("classpath:application.properties") })

public class JiraMessageHandler {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private static ExecutorService executor = Executors.newFixedThreadPool(Constants.THREAD_SIZE);

    private static Logger logger = LogManager.getLogger(JiraMessageHandler.class);

    @RabbitListener(containerFactory = "jiraQueueListenerContainerFactory", queues = Constants.QUEUE_NAME)
    public void handleMessage(HashMap<String, Object> jiraMessage) {

        logger.info(jiraMessage.toString() + System.currentTimeMillis());
        logger.info("Jira Message Handler");
        BaseServerAdapter jiraProcessingAdapter = new JiraProcessingAdapter();
        Future future = executor.submit(jiraProcessingAdapter);
        JiraAdapterOutput jiraAdapterOutput = new JiraAdapterOutput();
        Future future = executor.submit(jiraProcessingAdapter);
        jiraAdapterOutput = (JiraAdapterOutput) future.get();
        try {
            jiraAdapterOutput = (JiraAdapterOutput) future.get();

            if (jiraAdapterOutput.getOutputMap().get("activityStatus") == "SUCCESS") {
                logger.info("Successfully Executed Jira ::: " + new Date() + "::: "
                        + jiraAdapterOutput.getOutputMap().get("jiraId"));
                        rabbitTemplate.convertAndSend(Constants.ADAPTER_OUTPUT_QUEUE, senderMap);
            }else if (jiraAdapterOutput.getOutputMap().get("activityStatus").equalsIgnoreCase("FAIL")) {
                logger.info("Successfully Executed Jira ::: " + new Date() + "::: "
                        + jiraAdapterOutput.getOutputMap().get("jiraId"));
                        sendMessageForProcessingToBIP(senderMap);
            }

        private boolean sendMessageForProcessingToBIP(HashMap<String, ExchangeDTO> senderMap) {
        try {
            rabbitTemplate.convertAndSend(Constants.WFM_ERROR_QUEUE, senderMap);
            return true;
        } catch (Exception e) {
            **logger.info("Message sending failed, try again:::::::" + e.getMessage());**
        }
        return false;

    }

Он показывает «Контекст приложения закрыт, и ConnectionFactory больше не может создавать подключения».

Я делаю что-то не так. Я также упомянул здесь: https://jira.spring.io/browse/AMQP-546 < / а>


person Chandan    schedule 24.11.2016    source источник


Ответы (1)


Приведенный выше код (в handleMessage) выглядит неполным - здесь нет уловки для попытки.

Вы должны закрыть контекст приложения в другом месте перед попыткой отправки. Вы не можете использовать beans в контексте после того, как он закрыт / уничтожен. JIRA, на которую вы ссылаетесь, должна была разрешить такой доступ в stop() методах в других bean-компонентах, то есть уничтожить соединение только после остановки всех остальных bean-компонентов.

Я предлагаю вам включить ведение журнала DEBUG для org.springframework и выяснить, почему контекст закрывается преждевременно.

person Gary Russell    schedule 24.11.2016
comment
Извините за то, что не добавили блок catch. Если проблема возникает в Jira, я могу отправить сообщение. В этот момент у меня есть шаблон rabbittemplate contextclosed как false. Но когда ему не удается создать проблему в jira из-за некоторых отсутствующих параметров, он переходит в блок catch, где он показывает contextclosed как true, потому что оттуда я отправляю в очередь ошибок. - person Chandan; 25.11.2016
comment
Как я уже сказал, чтобы получить это исключение, вы должны закрыть контекст. Включите ведение журнала DEBUG. Я не могу помочь без этого журнала. - person Gary Russell; 25.11.2016
comment
Ok. Не могли бы вы сообщить мне, как включить ведение журнала DEBUG. Иногда, когда я получаю сообщение в первой строке регистратора, я проверяю соединение, там также contextclosed как true - person Chandan; 25.11.2016
comment
Обратитесь к документации вашей подсистемы ведения журнала. log4j, logback и т. д. Я понятия не имею, что вы подразумеваете под contextclosed как true. - person Gary Russell; 25.11.2016
comment
Я обнаружил, что в моей конфигурации отсутствует аннотация @EnableRabbit. Теперь все заработало! - person Chandan; 25.11.2016