【问题标题】:In OSGi, how do you gracefully handle initialisation exceptions?在 OSGi 中,如何优雅地处理初始化异常?
【发布时间】:2012-09-19 05:07:38
【问题描述】:

我正在使用 Maven-SCR。通过使用@Component@Service 标签,我可以让我的类实例自动注册它提供的接口。

但有时,activate 方法(标记为@Activate)甚至构造函数可能会抛出异常并以我无法处理的方式失败。

问题是:我想捕获该异常,以便正确记录它,但同时,我想防止该类在激活或初始化失败时发布其服务。

你们是怎么做到的?

谢谢!

【问题讨论】:

    标签: java osgi apache-felix declarative-services


    【解决方案1】:

    SCR 规范要求将这些方法的异常记录到 OSGi LogService。您是否安装了 LogService 实现包?如果是这样,您可以从那里记录的这些方法中找到异常。如果您需要将这些异常记录到其他日志中,您可能需要查看 Pax Logging 之类的内容。

    【讨论】:

    • 好吧,所以,是的,我应该抛出异常,以便不注册服务等等,如果我在 OSGi 容器级别处理异常有问题,我可以工作使用日志记录配置来修复它。好的。我认为这是最明智的做法。谢谢! (PS:我正在使用 Pax 日志记录)
    • 嗨@BJ Hargrave,您提供的链接无效,能否请您更新一下,以便其他人可以完全理解答案。
    【解决方案2】:

    首先,我会查看您的 OSGi 框架的日志记录配置。它应该记录这些异常。

    如果这不起作用,您可以将此类代码放入带注释的方法中

    catch (Exception ex) {  // or RuntimeException if possible
        // log it
        // then rethrow
        throw ex;
    }
    

    请注意,这被某些人认为是一种反模式,因为它往往会产生重复的堆栈跟踪。

    这也可以移动到一个方面,尽管这可能会导致 OSGi 的痛苦。

    【讨论】:

    • 它确实会记录它们,只是我对它们的控制较少。我认为我的问题一开始有点令人困惑。我试图解释我在@BJ Hargrave 的回答中的意思。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 2015-12-14
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2023-03-21
    相关资源
    最近更新 更多