Java 使用资源尝试失败,但尝试有效

Java 使用资源尝试失败,但尝试有效,java,rabbitmq,try-catch,java-11,try-with-resources,Java,Rabbitmq,Try Catch,Java 11,Try With Resources,我正在尝试设置一个侦听RabbitMQ服务器的服务,并使用设置了代码,其中包括以下try with resources块 当我使用相同的代码并使用java-cp myJar.jar MyService构建和运行此服务时,它只是立即启动和结束,echo$?返回0 但是,如果我用以下命令替换该块,那么使用相同的命令它就可以正常工作,并且我能够启动RabbitMQ实例的侦听器 try { Connection connection = factory.newConnection();

我正在尝试设置一个侦听RabbitMQ服务器的服务,并使用设置了代码,其中包括以下try with resources块

当我使用相同的代码并使用java-cp myJar.jar MyService构建和运行此服务时,它只是立即启动和结束,echo$?返回0

但是,如果我用以下命令替换该块,那么使用相同的命令它就可以正常工作,并且我能够启动RabbitMQ实例的侦听器

try {
     Connection connection = factory.newConnection();
     Channel channel = connection.createChannel());

     // code here
}
即使在创建数据库连接时也会发生同样的情况

try (Connection connection = dataSource.getConnection()) {
    //code here
}
失败但

try {
    Connection connection = dataSource.getConnection();
    //code here
}  
工作正常,并允许我使用连接将条目输入数据库


为什么会这样?我使用的是OpenJDK 11.0.2,此服务是独立的,但代码库的其余部分是JAX-RS驱动的rest API(如果有帮助)。

try with resources构造在块退出时关闭资源。您的基本try块代码不会关闭任何内容。这就是两者的区别

当您使用try-with-resources时,您需要实际使用该资源

如果您在编写代码时打开的资源需要“长寿命”,那么使用资源不是正确的构造,但一般来说,这意味着您正在编写的类本身应该是自动关闭的。

在编程中使用任何概念时,您必须了解您在做什么

try-with-resource的全部要点是,当try块结束时,保证关闭资源

但请注意:仅使用try块是不够的。像数据库连接这样的关键资源需要独特的、有意识的生命周期管理。换句话说:你应该在需要这些资源的时候一直保留它们。您最好确保在不再需要资源时不会错误地忘记关闭它


因此,你不应该轻松地放弃对资源的尝试。而是要确保需要这样一个资源的代码在这样一个try-with-resource块的范围内被调用

很难相信您的代码能与您发布的内容一起工作,因为像try{…}这样的块甚至不能编译。
try {
    Connection connection = dataSource.getConnection();
    //code here
}