下面是我的main class代码:
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle(new MainVerticle(), whenDeployed -> {
vertx.close();
// System.exit(0);
});
}
字符串
下面是主垂直部分的代码:
public class MainVerticle extends AbstractVerticle {
private static final ObjectMapper mapper = new ObjectMapper();
private static final Logger log = LoggerFactory.getLogger(MainVerticle.class);
@Override
public void start(Promise<Void> startPromise) throws Exception {
Configuration config = null;
try(FileInputStream fin = new FileInputStream("/opt/vertex-proxy/config.json")){
config = mapper.readValue(fin, Configuration.class);
} catch(Exception e) {
log.error("Invalid configuration\n{}", e.getCause());
}
log.info("Started application\n");
ProxyOptions proxyOptions = new ProxyOptions()
.setHost(config.getProxy().getIp())
.setPort(config.getProxy().getPort());
WebClientOptions options = new WebClientOptions().setUserAgent("Yash client")
.setProtocolVersion(HttpVersion.HTTP_2).setHttp2ClearTextUpgrade(false)
.setConnectTimeout(config.getTarget().getConnectionTimeout())
.setProxyOptions(proxyOptions);
WebClient client = WebClient.create(vertx, options);
HttpRequest<Buffer> req = client.get(config.getTarget().getPort(), config.getTarget().getIp(), config.getTarget().getUri());
req.send().onSuccess(response -> {
log.info("Received response with status code: " + response.statusCode());
log.info("Response:\n" + response.bodyAsString());
startPromise.complete();
}).onFailure(err -> {
log.error("Something went wrong\n" + err.getCause());
startPromise.complete();
});
}
@Override
public void stop() throws Exception {
System.out.println("\nStopping application");
}
}
型
当我在Eclipse中运行上面的代码时,它的性能非常好,程序在执行后关闭。但是当我构建一个maven jar并尝试使用命令java -jar application.jar
运行jar时,程序执行并显示响应,但它不会退出,除非手动中断。
有谁能提出一个正确的方法来解决这个问题,使它在Eclipse和jar中的行为相同?
我甚至尝试在onSuccess和onFailure块中使用java.lang.System.exit(),也在main类中的whenDeployed块中使用,也在stop()方法中使用,但仍然观察到类似的行为。
1条答案
按热度按时间5kgi1eie1#
您在Eclipse中运行的很可能是您上面展示的自己的主类,它也关闭了Vert. x。
然而,当您运行jar时,
Main-Class
可能是io.vertx.core.Launcher
-取决于您如何设置构建。查看jar的META-INF/MANIFEST.MF
文件。如果您看到一个类似
Main-Class: io.vertx.core.Launcher
的条目,那么jar将使用Vert.x启动器运行。然后你的
MainVerticle
只发送一个请求并记录响应,但不关闭Vert.x -这就是你编写的代码。