【发布时间】:2013-07-01 01:54:29
【问题描述】:
我需要通过 OSGi 中后端系统的不同捆绑包检查数据包的数据流。
一个数据包通过“网关捆绑包”进入,然后通过几个不同的捆绑包进行处理。我应该做的是制作另一个知道“监控”通过这些不同包的数据流的包。在其他捆绑包不知道它的存在的情况下。
我该如何处理?
【问题讨论】:
-
你可以使用 Camel 和一些队列在你的组件之间路由消息吗?
我需要通过 OSGi 中后端系统的不同捆绑包检查数据包的数据流。
一个数据包通过“网关捆绑包”进入,然后通过几个不同的捆绑包进行处理。我应该做的是制作另一个知道“监控”通过这些不同包的数据流的包。在其他捆绑包不知道它的存在的情况下。
我该如何处理?
【问题讨论】:
如果数据流通过其他捆绑注册的 OSGi 服务,您可以为每个服务创建一个 java.lang.reflect.Proxy 对象,并将这些对象注册为 OSGi 服务(具有与原始服务相同的 OBJECTCLASS 和属性),最大 SERVICE_RANKING .在这种情况下,所有呼叫首先转到您的服务,然后您可以将它们转发到原始服务。
【讨论】:
这是不可能的,除非在字节码级别进行一些重大的重写。在 OSGi 中,当您从另一个包中获取服务或直接实例化对象时,您可以直接不受限制地访问该对象。包之间没有代理,OSGi 本身不知道方法调用何时跨越包边界。
也许最好先退后一步,问问自己为什么要这样做。你希望达到什么目标?
【讨论】:
您需要在公共 API 边界拦截调用吗?
一种方法是interceptor pattern。在 Java 中执行此操作的典型方法是使用 AOP。
您已经在使用 Spring 了吗?如果是这样,那么您可以研究各种不同风格的 AOP。
我假设代码正在执行直接方法调用?如果是这样,123x 使用队列的建议将需要对您的代码进行重大重构,因此这可能不是一个好的短期解决方案。
【讨论】: