2011-03-20 64 views
0

我想使用ServiceTracker来消费我们公司发布的服务。 而是为每个服务创建新ServiceTracker的我想消费我认为这将是更好的创建只是一个带有过滤器,然后从它那里得到的服务有:如何高效地使用ServiceTracker来使用多个服务?

Filter filter = ctx.createFilter("(" + Constants.OBJECTCLASS + "=com.mycomp*)"); 
tracker = new ServiceTracker(ctx, filter, null); 

这种方法的问题是,我当时需要遍历跟踪器发现的服务引用,检查它们的objectClass属性,看看我是否可以将它分配给服务对象,由于需要强制转换,这非常麻烦且容易出错。

任何其他的想法如何使用更优雅的方式cunsume多个服务?

回答

0

我认为这是一个错误的问题:-)从问题,我推断你有从你的公司和你需要的服务的方法想要调用这个方法。也就是说,在代码的某个地方,您需要了解特定类型的com.mycomp.X,也就是说,您对公司的一般服务不感兴趣,您有明确的类型依赖关系。在你的问题中,你假设他们需要集中调度,这通常不健壮,容易出错,并且有维护热点;每次您有新的公司服务时,您都需要更新派遣方法。

更好的解决方案似乎是使用声明式服务,并使用带注释的bndtools。在这种模型中,每个在你需要服务的地方:

@Component public class SomeMyCompComponent { 
    ... 
    @Reference 
    void foo(com.mycomp.X x) { ... } 
    ...  
} 

在这种模式下,你并不需要集中维护调度,任何类都可以得到时,他们需要它,它需要的服务。该模型还可以准确处理多个依赖关系,并提供更多的好处。

也许我不正确地理解问题,因为我从您需要的解决方案推断出问题。但是,我认为您会尝试滥用服务跟踪器来完成它不打算执行的任务。

不幸的是,DS是不建到框架,我们应该做的:-(

+0

非常感谢您的洞察彼得。我们使用Guice/Peaberry作为DI,所以我想我可以使用它们来做所有的事情以便消费服务,我只是讨厌他们使用ServiceModule和绑定创建的重载... – Joly 2011-03-24 10:15:57

-1

您可以继承ServiceTracker子类并添加方法以提供对您感兴趣的服务类型的直接访问。例如,您可以将服务存储在类型安全的异构容器中[1]。然后你就可以调用你的ServiceTracker子类的方法,它接受你感兴趣的服务的类型,并且可以很容易地在类型安全的异构容器中查找它们。

[1]有效的Java,第二版,第29项

+0

你可以提供一个代码示例吗? – Joly 2011-03-20 19:23:47

+1

只是看到有效的Java,第二版第29项,有足够的代码示例有 如果你还没有这本书,你真的应该得到它! – 2011-03-21 00:03:50