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