Vert.x应用程序在与Eclipse一起运行时关闭,但在作为jar运行时不关闭

de90aj5v  于 2023-08-04  发布在  Eclipse
关注(0)|答案(1)|浏览(146)

下面是我的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()方法中使用,但仍然观察到类似的行为。

5kgi1eie

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 -这就是你编写的代码。

相关问题