【问题标题】:Application Context is closed and the ConnectionFactory can no longer create connections Spring AMQP应用程序上下文已关闭,ConnectionFactory 无法再创建连接 Spring AMQP
【发布时间】:2016-11-24 11:40:34
【问题描述】:

一旦我使用来自rabbitmq 的消息,我已经实现了多线程以在jira 中执行一些操作。我正在使用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;
    }

}

消息处理程序:

@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

【问题讨论】:

    标签: spring-amqp spring-rabbit


    【解决方案1】:

    上面的代码(在 handleMessage 中)看起来不完整 - try 没有捕获。

    在尝试发送之前,您必须在其他地方关闭应用程序上下文。关闭/销毁后,您不能在上下文中使用 bean。您引用的 JIRA 是允许在其他 bean 中的 stop() 方法中进行此类访问 - 即仅在所有其他 bean 停止后才销毁连接。

    我建议您为org.springframework 开启 DEBUG 日志记录,并找出上下文过早关闭的原因。

    【讨论】:

    • 很抱歉没有添加 catch 块。如果问题出现在 Jira 中,我可以发送消息。在那一刻,我将rabbittemplate contextclosed as false。但是,当由于缺少某些参数而无法在 jira 中创建问题时,它会在那里捕获块,它显示 contextclosed as true 因为我从那里发送到错误队列。
    • 正如我所说,要获得该异常,您必须关闭上下文。打开调试日志记录。没有那个日志,我无能为力。
    • 好的。您能否让我知道如何打开调试日志记录。有时当我在记录器的第一行收到消息时,我正在检查连接,还有 contextclosed as true
    • 请参阅您的日志记录子系统文档。 log4j、logback 等。我不知道你所说的 contextclose 是什么意思。
    • 我发现,我的配置中缺少@EnableRabbit 注释。现在成功了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2018-06-23
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多