【问题标题】:Using Esper within OSGi framework在 OSGi 框架中使用 Esper
【发布时间】:2016-01-27 21:49:51
【问题描述】:

我想在 OSGi 框架中使用 Esper,但是我不确定 OSGi 中的类加载机制将如何实现我需要实现的目标,甚至不确定如何在 OSGi 中使用 Esper。

我使用的是 Esper 5.3,在检查捆绑清单时,它没有使用 Dynamic-Import OSGi 标头。 Esper 的核心是 EPStatements,我理解它是在 POJO 上运行的 SQL 查询。

我很难理解的是,Esper 捆绑包如何访问它们,它不使用动态导入并且不知道将来可能会被引导操作哪些 POJO。

例如,如果我尝试创建 EPStatement:

select * com.example.Pojo

如果类 com.example.Pojo 位于 Esper 核心的另一个捆绑包中,则加载 Pojo 的唯一方法是使用 its 类加载器。这可以通过以下方式完成:

Thread.currentThread().setContextClassLoader(com.example.Pojo.class.getClassLoader);

但这不只是将Pojo 加载到包含Pojo 本身的包的类空间中吗?在创建上述示例 EPStatement 时,Esper 包如何获得对它的访问权限。

【问题讨论】:

    标签: java classloader esper contextclassloader


    【解决方案1】:

    您可以使用“epAdministrator.getConfiguration()”中的“addEventType(String eventTypeName, Class eventClass)”来注册类型。这样你就可以控制类的来源。

    当尝试按名称查找类时,Esper 总是使用“Thread.currentThread().getContextClassLoader();”。您的代码可以使用“setContextClassLoader”来设置自己的类加载器。并且代码可能应该将其设置回来。

    您可以简单地更改 Esper jar 附带的 Manifest 并包含您喜欢的任何内容。

    您可以使用“朋友”捆绑包。

    【讨论】:

    • 感谢您的建议。我还尝试创建一个单独的包来加载类。它通过服务(我的定义)通知添加到系统的新类,并将加载器切换到提供 POJO 的捆绑包的加载器。加载程序包会导入所有 Esper 导出,因此我能够以这种方式创建语句。一旦以这种方式加载,我只需要在自己的脑海中澄清从 etc 中可见的类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2015-06-18
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多