我正在尝试建立一个监听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。
答案 0 :(得分:5)
try-with-resources构造在块退出时关闭资源。基本的try块代码不会关闭任何内容。那是两者之间的区别。
在使用try-with-resources时,您实际上需要 DO 使用资源。
如果您在要打开的资源需要“长寿”的地方编写代码,那么try-with-resources不是正确的结构(尽管通常,这意味着您正在编写的类本身应该是自动关闭)。
答案 1 :(得分:3)
在编程中使用 any 概念时,您必须了解自己在做什么!
try-with-resource的要点是当try块结束时,保证资源是关闭的。
但是请注意:仅使用try块是不够的。这样的关键资源,例如数据库连接,需要独特的,有意的生命周期管理。换句话说:您应该将这些资源的存放时间保持在需要的时间范围内。并且最好确保不要再忘记不再需要的资源了!
因此,您应该不轻松地放弃尝试资源。而是确保在try-with-resource块的范围内调用了需要这种资源的代码!