SpringBoot可以作为servlet而不是命令行运行时连接到cassandra

cdmah0mi  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(294)

背景:我正试图为我们的cassandra数据库建立一个基于代码的数据迁移系统。我对java没有太多经验,但如果这是一个.net项目,我会将迁移设置为同一解决方案下的不同项目。但是,根据其他经验丰富的团队成员的指导,建议我将迁移与应用程序的其余部分包含在同一个包中(我可以接受)。还有人建议,最简单的方法是通过webapi端点运行迁移(我对此持怀疑态度)。为了避免打开潜在的安全漏洞,我想我应该尝试使用命令行实用程序来执行迁移。
我有一个spring boot web应用程序,其入口点类如下所示:

@Configuration
@SpringBootApplication
@EnableAutoConfiguration
@EnableCaching
@EnableScheduling
public class MyApplication extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(MyApplication.class);
  }

  public static void main(String[] args) {
    new MyApplication().configure(new SpringApplicationBuilder(MyApplication.class)).run(args);
  }
}

但是,我正在尝试添加一些功能来运行几个迁移脚本,这些脚本通过命令行打包在这个应用程序中(例如。 java -jar MyApplication.jar migrate ),所以我添加了以下类:

@Configuration
@SpringBootApplication
@EnableAutoConfiguration
public class MigrationRunner implements CommandLineRunner {

  @Autowired
  Session session;

  @Override
  public void run(String[] args)
  {
    MigrationResources mr = new MigrationResources();
    mr.addMigration(...);
    mr.addMigration(...);

    MigrationEngine.withSession(session).migrate(mr);
  }
}

然后更新我的入门级课程如下:

// annotations
public class MyApplication extends SpringBootServletInitializer {

  private final static String MIGRATE_COMMAND = "migrate";

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(MyApplication.class);
  }

  public static void main(String[] args) {
    if (args.length > 0 && args[0].equalsIgnoreCase(MIGRATE_COMMAND)) {
      new SpringApplicationBuilder()
          .sources(MigrationRunner.class)
          .run(Arrays.copyOfRange(args, 1, args.length));
    } else {
      new MyApplication().configure(new SpringApplicationBuilder(MyApplication.class)).run(args);
    }
  }
}

问题是当我用 migrate arg,spring抛出此错误:
创建名为“migrationrunner”的bean时出错:通过字段“session”表示的未满足的依赖关系
创建名为“session”的bean时出错,该bean在类路径资源[org/springframework/boot/autoconfigure/data/cassandra/cassandrataautoconfiguration.class]中定义:调用init方法失败
所有尝试查询的主机均失败(尝试:server022/xx.yy.zz.022:9042(com.datastax.driver.core.exceptions.transportexception:[server022/xx.yy.zz.022:9042]连接已关闭),server022/xx.yy.zz.020:9042(com.datastax.driver.core.exceptions.transportexception:[server020/xx.yy.zz:9042]连接已关闭),server020/xx.yy.zz.021:9042(com.datastax.driver.core.exceptions.transportexception:[server020/xx.yy.zz.021:9042]连接已关闭))
在没有 migrate arg仍然工作正常。我怀疑spring只是没有为这个cassandra服务器获取正确的证书,尽管它似乎获得了所有其他配置属性(服务器名、密钥空间等)
问:如何创建一个springbootservlet,它也具有命令行模式,并且可以以两种模式连接到已配置的cassandra服务器?

o8x7eapl

o8x7eapl1#

你要做的就是,

@SpringBootApplication
public class MyApplication
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

你的申请太复杂了。如果你运行 MyApplication.main 将在港口运行 8080 默认情况下。
奖金,如果你需要两个从同一个开始 class .

@SpringBootApplication
public class MigrationRunner implements CommandLineRunner {

  @Autowired
  Session session;

  public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
  }

  @Override
  public void run(String[] args)
  {
    MigrationResources mr = new MigrationResources();
    mr.addMigration(...);
    mr.addMigration(...);

    MigrationEngine.withSession(session).migrate(mr);
  }
}

相关问题