【问题标题】:Make OracleDataSource robust against Database restarts and hickups使 OracleDataSource 对数据库重新启动和中断具有鲁棒性
【发布时间】:2017-06-15 22:29:02
【问题描述】:

所以我得到了一个使用 Connectionfactory 的高级队列:

ConnectionFactory jmsQueueConnectionFactory() throws JMSException, SQLException { 
  final OracleDataSource dataSource = new OracleDataSource();
  dataSource.setUser(username);
  dataSource.setPassword(password);
  dataSource.setURL(url);
  dataSource.setImplicitCachingEnabled(true);
  dataSource.setFastConnectionFailoverEnabled(true);

  return AQjmsFactory.getConnectionFactory(dataSource);
} 

这是在共享数据库上运行的,该数据库可能会重新启动,或者有时网络会出现短暂的中断。这导致队列中不再有消息。

我使用 spring MessageListener 来检索消息,但实际上没有任何指示符或任何指示队列不再运行的情况。重新启动应用程序后,我会收到一堆应该已经处理过的旧消息。

有没有办法或特定的数据源实现重新连接或什么?

更新:监听器实现

@Bean
OracleAqQueueFactoryBean etlQueueFactory() throws JMSException, SQLException {
    final OracleAqQueueFactoryBean bean = new OracleAqQueueFactoryBean();
    bean.setConnectionFactory(jmsQueueConnectionFactory());
    bean.setOracleQueueUser("USER");
    bean.setOracleQueueName("QUEUE");
    return bean;
}


@Bean
DefaultMessageListenerContainer jmsContainer() throws JMSException, SQLException {
    final DefaultMessageListenerContainer bean = new DefaultMessageListenerContainer();
    bean.setConnectionFactory(jmsQueueConnectionFactory());
    bean.setDestination(etlQueueFactory().getObject());
    bean.setMessageListener(new MyListener());
    bean.setSessionTransacted(false);
    return bean;
}

public class MyListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
        ...
    }
}

【问题讨论】:

    标签: spring oracle jms datasource


    【解决方案1】:

    我猜你必须在 JMS 级别上做,而不是 DB 级别。

    不确定您使用的是哪种类型的侦听器,但 Spring 中的 DefaultMessageListenerContainer 是通过 consumer.receive(timeout) 循环实现的。它比使用普通侦听器更强大,因为它会尝试在每个轮询周期重新连接(如果需要)。

    【讨论】:

    • 感谢您的回答。我用其余的配置更新了问题。我使用 DefaultMessageListenerContainer 来获取一个实现 MessageListener 的类。数据库重新启动后,onMessage 似乎不再处于活动状态。
    猜你喜欢
    • 2013-02-24
    • 2018-06-16
    • 1970-01-01
    • 2016-04-27
    • 2013-08-27
    • 1970-01-01
    • 2021-06-22
    • 2022-06-12
    • 1970-01-01
    相关资源
    最近更新 更多