我需要通过OSGi中不同的后端系统软件包来检查数据包的数据流。如何跟踪OSGi中的软件包之间的数据流
对于通过'网关包'进入的数据包,然后处理正在处理的多个不同捆绑包。我应该做的是让另一个知道“监视”通过这些不同包的数据流的bundle。没有其他的包真的知道它在那里。
我该如何解决这个问题?
我需要通过OSGi中不同的后端系统软件包来检查数据包的数据流。如何跟踪OSGi中的软件包之间的数据流
对于通过'网关包'进入的数据包,然后处理正在处理的多个不同捆绑包。我应该做的是让另一个知道“监视”通过这些不同包的数据流的bundle。没有其他的包真的知道它在那里。
我该如何解决这个问题?
您需要拦截公共API边界处的调用?
一种方法是interceptor pattern。在Java中执行此操作的典型方法是使用AOP。
您是否已经在使用Spring?如果是这样,那么你可以调查各种口味的AOP。
我假设代码是做直接方法调用?如果是这样,123x使用队列的建议将需要对代码进行重大的重构,所以它可能不是一个好的短期解决方案。
这是不可能的,除了可能在字节码级别进行一些重大改写。在OSGi中,当您获得服务或直接实例化另一个包中的对象时,您可以直接不受限制地访问该对象。在bundle之间没有代理,OSGi本身不知道方法调用何时穿过bundle边界。
也许最好退一步,质疑为什么你想这样做的第一位。你希望实现什么?
这不是我想要做的,而是我“有”这样做。这是我得到的任务。我想这样做是为了制作一个“观察者”套件,并让其他套件在他们做一些注意事项时通知观察者套件。这将更容易实现。但后来他们告诉我“不,我们不希望后端对你应该做的模块有任何了解......”..我能想到的唯一解决方案就像AOP那样,但我不是那样的熟悉AOP,甚至不熟悉OSGi。而且据我了解AOP,我不认为这是正确的解决方案 – Spyral
好吧,所以你需要帮助客户了解他们正在尝试做什么的问题,并找出他们的潜在需求是什么.... –
如果数据流通过由其他bundle注册的OSGi服务的话,你可以创建为每一个服务对象java.lang.reflect.Proxy并注册这些对象为OSGi服务(具有相同的OBJECTCLASS和原有的特性)具有最大SERVICE_RANKING。在这种情况下,所有呼叫都会首先转到您的服务,然后您可以将它们转发到原始服务。
您可以使用骆驼和一些队列在组件之间路由消息吗? – blank