在下拉向导应用程序中, 在主服务中,通常使用如下内容覆盖Application类中的抽象Run方法:

@Override
public void run(MyServiceConfiguration configuration, Environment environment) throws Exception {
    // application logic
}

我try 跟踪执行逻辑,但无法弄清楚该方法是在哪里调用的,或者是如何调用的.有谁能给我指个方向吗?

推荐答案

让我们从头开始,当您运行Dropwizard application as a server时,您在命令行界面(CLI)上给出了server命令. 文档给出的示例如下:

JAVA-JAR目标/Hello-world-0.0.1-SNAPSHOT.jar服务器Hello-world.yml

io.dropwizard.Application(您通常会对其进行扩展)中,我们可以看到bootstrap中添加了以下命令:

protected void addDefaultCommands(Bootstrap<T> bootstrap) {
    bootstrap.addCommand(new ServerCommand<>(this));
    bootstrap.addCommand(new CheckCommand<>(this));
}

在本例中,this是您的类扩展Application的实例,它被提供给ServerCommand.

然后,同一类中的run方法将解析CLI:

public void run(String... arguments) throws Exception {
    final Bootstrap<T> bootstrap = new Bootstrap<>(this);
    addDefaultCommands(bootstrap);
    initialize(bootstrap);
    // Should be called after initialize to give an opportunity to set a custom metric registry
    bootstrap.registerMetrics();

    final Cli cli = new Cli(new JarLocation(getClass()), bootstrap, System.out, System.err);
    // only exit if there's an error running the command
    cli.run(arguments).ifPresent(this::onFatalError);
}

当我们跟随 cli.run(arguments).ifPresent(this::onFatalError);的时候,我们最终得到了io.dropwizard.cli.Cli#run.在此方法中,命令被解析,由于我们指定了server,因此它将通过名称找到该命令并执行它:

public Optional<Throwable> run(String... arguments) {
...
final Namespace namespace = parser.parseArgs(arguments);
final Command command = requireNonNull(commands.get(namespace.getString(COMMAND_NAME_ATTR)),
    "Command is not found");
try {
    command.run(bootstrap, namespace);
...

服务器命令将是io.dropwizard.cli.ServerCommand的一个实例,它扩展了io.dropwizard.cli.EnvironmentCommand.

EnvironmentCommand中,我们可以看到您所请求的Application.run(...)方法已执行:

protected void run(Bootstrap<T> bootstrap, Namespace namespace, T configuration) throws Exception {
    ...

    bootstrap.run(configuration, environment);
    Application.run(配置、环境);
    run(environment, namespace, configuration);
}

这一行具体如下:

Application.run(配置、环境);

T configuration是通过基类EnvironmentCommand相加的,基类是io.dropwizard.cli.ConfiguredCommand.

所有代码均取自Drop向导版本2.1.0

Java相关问答推荐

@从类文件中删除JsonProperty—Java

有关手动创建的包的问题

解析Javadoc时链接的全限定类名

流迭代列表<;对象>;上的NoSuchElementException

如何使用值中包含与号的查询参数创建一个java.net.URI

如何从错误通道回复网关,使其不会挂起

如何在JavaFX中处理多个按钮

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

如何使用路径过渡方法使 node 绕圆旋转?

为什么在下面的Java泛型方法中没有类型限制?

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

为什么Spring要更改Java版本配置以及如何正确设置?

如何通过gradle命令行从build.gradle获得Java targetCompatibility

升级版本后出现非法访问错误

无泄漏函数的Java DRY

转换为JSON字符串时,日期按天递减-Java

双对象供应商

将Optionals/null安全添加到嵌套的flatMap/流

具有 DayOfWeek 列表的 JPA 实体

我可以使用一个 PoolingNHttpClientConnectionManager 运行多个 HttpAsyncClient 吗?