可以说OSGi是种服务,但这种服务是很难理解的。当我们开始着手设计OSGi时,我们的关键需求是建立一个特设的协同编程模型。我们寻求的不是集中管理的或者与兄弟紧密耦合的组件,而是一个独立的对等模型。要理解上述观点: 在一个对等模型中,你要能够找出你的对等点,并且知道该怎样和他们合作。在代理模型或参与者模型中,对等点是拥有唯一标识的,信息的交换建立在这些标识之上。对等的依赖关系经受着传递相关性聚合的考验,很快几乎所有的代理商都依赖上对方,没有组件能够重用。这就是大泥球问题。为了解决这个问题,我们提出了服务模式。OSGi服务将封装的规范与一个实例代理相结合,为对等者提供一个托管的渠道。

那么,对于应用程序开发人员来说,这种服务的价值究竟是什么?

服务的惊人效果就是:规范往往可以在传统的API上明显简化,因为在大多数Java API中,协同的部分常与实例耦合技术(黑客?)(DocumentBuilderFactory, InitialContextFactoryBuilder?)以及管理的部分混合在一起。

事实证明,有了服务,你几乎不用定义这些方面的规范,因为它们已经在服务模式(工厂模式,但其实更多)中涉及到了,或者在大多数情况下存在组件中了。许多管理方面是能够被实现处理的。服务规范可以被严格限制在协作部分中。规范的规模很重要,规模较小,越容易使用。 例如,假设你需要使用一个持久的队列,而该队列被一组工人使用。主动的MQ,亚马逊(Amazon)SQS等有大量的API调用来维护队列,设置属性,并与之交互。然而,几乎所有这些方面可以定义在配置管理中,唯一需要协作的就是工人如何得到任务,以及你该怎样排列一个任务。

到目前为止我所知道的最简单的解决方案是定义一个规范;这个规范,工人只注册了一个Worker服务和一个MessageQueue服务:

  @Component(properties="queue=myqueue")
  public class MyWorker implements Worker<MyTask> {
  MessageQueue queue;


  public void work(MyTask task) { 
     ...
     queue.post( AnotherTask.class, another );
  }

@Reference(target="(queue=myqueue)") void setQueue( MessageQueue queue ) { this.queue = queue; } }

此排队规范可以有效地允许各种各样不同的实现。使用Amazon简单队列服务,实现是很容易的。一个微不足道的bundle可以查找使用的服务,使用队列服务的属性监听队列和调度信息。在这种情况下,基于web的AWS控制台可以管理队列,不需要代码。一个更全面的实现可以配置管理队列,或根据需要创建队列。持久化队列可以不同的方式实现,而且作为发送者和工人的组件无需任何变化。

如果有一个简化软件的规则,那么它可隐藏地工作;你看不到的东西不会干扰你。 OSGi服务是目前为止隐藏细节最有效的方法,尽量减少共享的必要。在未来8年里,代码的数量预计会增加一倍,,我们最好使用服务;要不然崩溃会将我们埋没。(出自OSGi Alliance Blog,2012年3月23日)

译自OSGi 联盟的博客


杨威利的红茶 2014-01-06 14:05

自己找到了<br>config.ini里加:<br>org.osgi.framework.system.packages=javax.accessibility,\<br> javax.activation,\<br> javax.activity,\<br> javax.annotation,\<br> javax.annotation.processing,\<br> javax.crypto,\<br> javax.crypto.interfaces,\<br> javax.crypto.spec,\<br> javax.imageio,\<br> javax.imageio.event,\<br> javax.imageio.metadata,\<br> javax.imageio.plugins.bmp,\<br> javax.imageio.plugins.jpeg,\<br> javax.imageio.spi,\<br> javax.imageio.stream,\<br> javax.jws,\<br> javax.jws.soap,\<br> javax.lang.model,\<br> javax.lang.model.element,\<br> javax.lang.model.type,\<br> javax.lang.model.util,\<br> javax.management,\<br> javax.management.loading,\<br> javax.management.modelmbean,\<br> javax.management.monitor,\<br> javax.management.openmbean,\<br> javax.management.relation,\<br> javax.management.remote,\<br> javax.management.remote.rmi,\<br> javax.management.timer,\<br> javax.naming,\<br> javax.naming.directory,\<br> javax.naming.event,\<br> javax.naming.ldap,\<br> javax.naming.spi,\<br> javax.net,\<br> javax.net.ssl,\<br> javax.print,\<br> javax.print.attribute,\<br> javax.print.attribute.standard,\<br> javax.print.event,\<br> javax.rmi,\<br> javax.rmi.CORBA,\<br> javax.rmi.ssl,\<br> javax.script,\<br> javax.security.auth,\<br> javax.security.auth.callback,\<br> javax.security.auth.kerberos,\<br> javax.security.auth.login,\<br> javax.security.auth.spi,\<br> javax.security.auth.x500,\<br> javax.security.cert,\<br> javax.security.sasl,\<br> javax.sound.midi,\<br> javax.sound.midi.spi,\<br> javax.sound.sampled,\<br> javax.sound.sampled.spi,\<br> javax.sql,\<br> javax.sql.rowset,\<br> javax.sql.rowset.serial,\<br> javax.sql.rowset.spi,\<br> javax.swing,\<br> javax.swing.border,\<br> javax.swing.colorchooser,\<br> javax.swing.event,\<br> javax.swing.filechooser,\<br> javax.swing.plaf,\<br> javax.swing.plaf.basic,\<br> javax.swing.plaf.metal,\<br> javax.swing.plaf.multi,\<br> javax.swing.plaf.synth,\<br> javax.swing.table,\<br> javax.swing.text,\<br> javax.swing.text.html,\<br> javax.swing.text.html.parser,\<br> javax.swing.text.rtf,\<br> javax.swing.tree,\<br> javax.swing.undo,\<br> javax.tools,\<br> javax.transaction,\<br> javax.transaction.xa,\<br> javax.xml,\<br> javax.xml.bind,\<br> javax.xml.bind.annotation,\<br> javax.xml.bind.annotation.adapters,\<br> javax.xml.bind.attachment,\<br> javax.xml.bind.helpers,\<br> javax.xml.bind.util,\<br> javax.xml.crypto,\<br> javax.xml.crypto.dom,\<br> javax.xml.crypto.dsig,\<br> javax.xml.crypto.dsig.dom,\<br> javax.xml.crypto.dsig.keyinfo,\<br> javax.xml.crypto.dsig.spec,\<br> javax.xml.datatype,\<br> javax.xml.namespace,\<br> javax.xml.parsers,\<br> javax.xml.soap,\<br> javax.xml.stream,\<br> javax.xml.stream.events,\<br> javax.xml.stream.util,\<br> javax.xml.transform,\<br> javax.xml.transform.dom,\<br> javax.xml.transform.sax,\<br> javax.xml.transform.stax,\<br> javax.xml.transform.stream,\<br> javax.xml.validation,\<br> javax.xml.ws,\<br> javax.xml.ws.handler,\<br> javax.xml.ws.handler.soap,\<br> javax.xml.ws.http,\<br> javax.xml.ws.soap,\<br> javax.xml.ws.spi,\<br> javax.xml.ws.wsaddressing,\<br> javax.xml.xpath,\<br> org.ietf.jgss,\<br> org.omg.CORBA,\<br> org.omg.CORBA_2_3,\<br> org.omg.CORBA_2_3.portable,\<br> org.omg.CORBA.DynAnyPackage,\<br> org.omg.CORBA.ORBPackage,\<br> org.omg.CORBA.portable,\<br> org.omg.CORBA.TypeCodePackage,\<br> org.omg.CosNaming,\<br> org.omg.CosNaming.NamingContextExtPackage,\<br> org.omg.CosNaming.NamingContextPackage,\<br> org.omg.Dynamic,\<br> org.omg.DynamicAny,\<br> org.omg.DynamicAny.DynAnyFactoryPackage,\<br> org.omg.DynamicAny.DynAnyPackage,\<br> org.omg.IOP,\<br> org.omg.IOP.CodecFactoryPackage,\<br> org.omg.IOP.CodecPackage,\<br> org.omg.Messaging,\<br> org.omg.PortableInterceptor,\<br> org.omg.PortableInterceptor.ORBInitInfoPackage,\<br> org.omg.PortableServer,\<br> org.omg.PortableServer.CurrentPackage,\<br> org.omg.PortableServer.POAManagerPackage,\<br> org.omg.PortableServer.POAPackage,\<br> org.omg.PortableServer.portable,\<br> org.omg.PortableServer.ServantLocatorPackage,\<br> org.omg.SendingContext,\<br> org.omg.stub.java.rmi,\<br> org.w3c.dom,\<br> org.w3c.dom.bootstrap,\<br> org.w3c.dom.css,\<br> org.w3c.dom.events,\<br> org.w3c.dom.html,\<br> org.w3c.dom.ls,\<br> org.w3c.dom.ranges,\<br> org.w3c.dom.stylesheets,\<br> org.w3c.dom.traversal,\<br> org.w3c.dom.views,\<br> org.w3c.dom.xpath,\<br> org.xml.sax,\<br> org.xml.sax.ext,\<br> org.xml.sax.helpers<br>org.osgi.framework.bootdelegation = \<br> javax.*,\<br> org.ietf.jgss,\<br> org.omg.*,\<br> org.w3c.*,\<br> org.xml.*,\<br> sun.*,\<br> com.sun.*

顶(0) 踩(0) 回复

杨威利的红茶 2014-01-06 11:18

DocumentBuilderFactory这个类在JDK中存在,但是如果有两个bundle分别为A和B,并且B require A的情况下,B直接使用DocumentBuilderFactory没有问题,但如果A中有DocumentBuilderFactory的调用,并且B通过A调用了DocumentBuilderFactory,就会出现java.lang.ClassNotFoundException: javax.xml.parsers.DocumentBuilderFactory。我至今仍找不到解决方案。。。请本文作者解答一下,谢谢。。。

顶(0) 踩(0) 回复

最受欢迎的文章

最新评论