资源尝试失败,但可以尝试

时间:2019-06-15 19:45:35

标签: java rabbitmq try-catch java-11 try-with-resources

我正在尝试建立一个监听RabbitMQ服务器的服务,并且我已经使用RabbitMQ Sample code from Github设置了代码,其中包括以下try-with-resources

try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {
        // code here
}

当我使用相同的代码并使用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。

2 个答案:

答案 0 :(得分:5)

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

在使用try-with-resources时,您实际上需要 DO 使用资源。

如果您在要打开的资源需要“长寿”的地方编写代码,那么try-with-resources不是正确的结构(尽管通常,这意味着您正在编写的类本身应该是自动关闭)。

答案 1 :(得分:3)

在编程中使用 any 概念时,您必须了解自己在做什么!

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

但是请注意:仅使用try块是不够的。这样的关键资源,例如数据库连接,需要独特的,有意的生命周期管理。换句话说:您应该将这些资源的存放时间保持在需要的时间范围内。并且最好确保不要再忘记不再需要的资源了!

因此,您应该轻松地放弃尝试资源。而是确保在try-with-resource块的范围内调用了需要这种资源的代码!