【问题标题】:Getting Exception 'java.lang.IllegalStateException:Expected one datasource and found 2' when more than one datasource defined获取异常'java.lang.IllegalStateException:预期一个数据源并找到2个'当定义多个数据源时
【发布时间】:2017-04-03 12:05:58
【问题描述】:

当我在 spring 云任务应用程序中定义多个数据源时,它会引发异常。这就是我定义数据源的方式

@Primary
@Bean(name="datasource1")
@ConfigurationProperties(prefix="spring.datasource")
public javax.sql.DataSource primaryDataSource() {
    return  DataSourceBuilder.create().build();
}

@Bean(name="datasource2")
@ConfigurationProperties(prefix="spring.datasource1")
public javax.sql.DataSource primaryDataSource1() {
    return  DataSourceBuilder.create().build();
}

@Bean
public TaskConfigurer taskConfigurer() {
    return new DefaultTaskConfigurer(primaryDataSource());
}

我已经看到了将 @Primary 定义为上面的 TaskConfigurer 的建议,但它们都不起作用。有人遇到过这种问题吗?

谢谢, 尼尔

【问题讨论】:

  • 使用profile怎么样?
  • 嗨飞行僵尸,感谢您的回复。即使我使用 profile ,我也需要在所有配置文件中都有两个数据源。所以,我猜问题仍然会来。虽然不确定
  • 你能显示抛出的异常吗?
  • 我仍然不确定您在寻找什么?如果你想使用多个数据库,那么你必须改变你的方法,比如使用 hibernate 并且你没有指定你的最终目标是什么,如果你指定了你的最终目标,那么其他人会很容易:)
  • 这是我得到的异常:原因:org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.cloud.task.batch.configuration.TaskBatchExecutionListenerFactoryBean]:工厂方法'taskBatchExecutionListener ' 抛出异常;嵌套异常是 java.lang.IllegalStateException: Expected one datasource and found 2 End Goal: 配置具有多个数据源的 Spring 云任务应用程序。 Spring Cloud Task 将使用一个数据源来存储所有作业执行细节,另一个数据源将用于我的应用程序数据。

标签: spring spring-boot spring-batch spring-cloud-task


【解决方案1】:

您将需要覆盖侦听器。与其他围绕任务的自动配置一样,当您定义了多个数据源时,它不知道要使用哪个数据源。我已经创建了一个问题来在未来的版本中解决这个问题:https://github.com/spring-cloud/spring-cloud-task/issues/252

【讨论】:

  • 感谢迈克尔的回复。我是否需要同时覆盖侦听器 TaskBatchExecutionListener 和 TaskBeanExecutionListener。如果是这种情况,您能否提供有关如何创建这些配置的说明或文档指针?
  • 我不熟悉TaskBeanExecutionListener。如果你的意思是TaskLifecycleListener,没有。您可以使用TaskConfigurer 来解决它的配置问题。上述问题的修复实际上将使用TaskConfigurer 来配置TaskBatchExecutionListener
  • 能否请您告诉我如何使用 DefaultTaskConfigurer 配置 TaskBatchExecutionListener 的步骤。 TaskBatchExecutionListener 在内部使用 TaskBatchDao,JdbcTaskBatchDao,我是否需要手动提供数据源来创建这些 bean。谢谢
  • 您还不能使用DefaultTaskConfigurer。我们尚未添加该功能。
  • 我其实很困惑 TaskConfigurer 和 TaskBatchExecutionListener 是如何连接的。我在 TaskConfigurer 接口中看不到任何与 TaskBatchExecutionListener 相关的方法。您是说更新 TaskConfigurer 接口以添加另一种提供 TaskBatchExecutionListener bean 的方法。那我是否需要自己实现TaskConfigurer接口。否则,保持 DefaultTaskConfigurer 不变并编写一个扩展 TaskBatchExecutionListener 并手动提供依赖项 TaskBatchDao/JdbcExecutionTaskBatchDao 的类。如果我走错方向,请纠正我。
【解决方案2】:

您需要覆盖 DefaultTaskConfigurer

@Configuration
public class BatchConfigurer extends DefaultTaskConfigurer
{

    public BatchConfigurer(@Qualifier("batchDataSource") DataSource dataSource) 
    {
        super(dataSource);
    }

}

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多