背景:我正试图为我们的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服务器?
1条答案
按热度按时间o8x7eapl1#
你要做的就是,
你的申请太复杂了。如果你运行
MyApplication.main
将在港口运行8080
默认情况下。奖金,如果你需要两个从同一个开始
class
.