2013-07-03 37 views
-3

我需要通过OSGi中不同的后端系统软件包来检查数据包的数据流。如何跟踪OSGi中的软件包之间的数据流

对于通过'网关包'进入的数据包,然后处理正在处理的多个不同捆绑包。我应该做的是让另一个知道“监视”通过这些不同包的数据流的bundle。没有其他的包真的知道它在那里。

我该如何解决这个问题?

+0

您可以使用骆驼和一些队列在组件之间路由消息吗? – blank

回答

0

您需要拦截公共API边界处的调用?

一种方法是interceptor pattern。在Java中执行此操作的典型方法是使用AOP。

您是否已经在使用Spring?如果是这样,那么你可以调查各种口味的AOP。

我假设代码是做直接方法调用?如果是这样,123x使用队列的建议将需要对代码进行重大的重构,所以它可能不是一个好的短期解决方案。

+0

我只是团队的一小部分。实际的实施还没有发生。我必须首先在我必须制作的虚拟系统上进行数据监控,并逐渐用真正的虚拟系统替换虚拟系统。我也不知道Spring是什么,只有今天才教OSGi的实际情况.AOP是我今天听到的一个新概念。 – Spyral

+0

你使用的是什么OSGi容器?你使用哪些Java库?您可能已经有了用于构建解决方案的工具。 – SteveD

1

这是不可能的,除了可能在字节码级别进行一些重大改写。在OSGi中,当您获得服务或直接实例化另一个包中的对象时,您可以直接不受限制地访问该对象。在bundle之间没有代理,OSGi本身不知道方法调用何时穿过bundle边界。

也许最好退一步,质疑为什么你想这样做的第一位。你希望实现什么?

+0

这不是我想要做的,而是我“有”这样做。这是我得到的任务。我想这样做是为了制作一个“观察者”套件,并让其他套件在他们做一些注意事项时通知观察者套件。这将更容易实现。但后来他们告诉我“不,我们不希望后端对你应该做的模块有任何了解......”..我能想到的唯一解决方案就像AOP那样,但我不是那样的熟悉AOP,甚至不熟悉OSGi。而且据我了解AOP,我不认为这是正确的解决方案 – Spyral

+0

好吧,所以你需要帮助客户了解他们正在尝试做什么的问题,并找出他们的潜在需求是什么.... –

0

如果数据流通过由其他bundle注册的OSGi服务的话,你可以创建为每一个服务对象java.lang.reflect.Proxy并注册这些对象为OSGi服务(具有相同的OBJECTCLASS和原有的特性)具有最大SERVICE_RANKING。在这种情况下,所有呼叫都会首先转到您的服务,然后您可以将它们转发到原始服务。