2013-03-11 93 views
1

下面的代码被认为是不好的做法吗?你认为这是可以做到的吗? 我们的目标是要始终更新状态,无论是成功(即调用到service.invoke(ID);返回正常)或失败...这是不好的做法?

@Autowired 
private Service service; 

public void onMessage(Message message) { 

    String id = null; 
    String status = "FAILED"; 

    try { 
     id = ((TextMessage) message).getText(); 
     status = service.invoke(id); //can throw unchecked exception 
    } catch (final JMSException e) { 
     throw new RuntimeException(e); 
    } finally { 
     if (StringUtils.isNumeric(id)) { 
     service.update(id, status); 
     } 
    } 
} 
+0

将'default'更新代码放入'catch'中,一旦完成,就会抛出异常。避免使用'finally'子句。 – SudoRahul 2013-03-11 14:20:49

+3

@JustinYang你究竟是什么意思? 'finally'将在'try'之后被调用。 “燕子”是什么意思? – 2013-03-11 14:21:25

+2

@ bmorris591是正确的。执行'finally'后,'throw'仍然会发生。如果'finally'也抛出一个异常,它会被吞噬。 – 2013-03-11 14:22:20

回答

0

这取决于你的使用情况,无论你根据上一步必须执行一个步骤。无论您可能收到什么异常,最终都可以执行您的第二步。

我建议在try...catch块之外进行第二步操作,以便只有当您有预期的任何异常时才会更新,并继续执行第二步,否则您的方法将抛出并退出。

+0

我更新了我的代码,调用service.register(id);可以抛出未经检查的异常,我想传播并回滚trascaction。但我仍然需要更新那个失败... – boom123 2013-03-11 14:25:36

+0

鉴于他的catch引发了一个异常,catch之后的代码将永远不会被看到,除非它在finally中。 – 2013-03-11 14:26:39

+0

你可以将'service.register(id);'包装在'try ... catch'中,你正在捕获异常,你期待。未经检查的只是你的编译器不会要求你处理它,所以你的catch可以得到它。只有'错误'不能被'catch'处理。在这种情况下,'finally'不会帮助你,因为它会打断你的线程。如果您希望主叫方知道状态,请记录该状态并引发异常。我建议这样做的原因是,您可以在失败后进行多个步骤,而最终不需要放置这些步骤。 – 2013-03-11 14:38:36

0

我认为你不应该使用消息监听器的实现,你应该联系他们独立于弹簧技术。只是pojo的基础。使用<jms:listener-container ><jms:listener>

+0

你可以给出进一步的解释,为什么你认为春季自动装配不好? – eis 2013-10-04 08:13:41

+0

我没有考虑汽车布线。我正在关注“MessageListener” – 2013-10-04 08:18:35

+0

Spring in action ch 13第326页 – 2013-10-04 08:23:50

相关问题