2013-06-03 43 views
0

我的應用程序有一些OSGI模塊和一個非OSGI部分。我試圖用apache aries通過JNDI在非osgi子系統中查找osgi服務。我使用玻璃魚。在osgi中的白羊座jndi查找

我的藍圖XML是什麼樣子:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> 
<bean id="repositoryservice" 
    class="com.example.repository.jndi.RepoImpl"> 
</bean> 

<service ref="repositoryservice" 
    interface="javax.jcr.Repository"> 
</service> 

</blueprint> 

我試圖查找與:

Context jndiContext = new InitialContext(); 
Repository repo = (Repository)jndiContext.lookup("osgi:service/" + 
        Repository.class.getName()); 

我部署4個捆綁包:

  1. 阿帕奇白羊座的Util
  2. 阿帕奇白羊座代理套裝
  3. 阿帕奇白羊座藍圖捆綁
  4. 阿帕奇白羊座JNDI捆綁

但我得到一個異常:

javax.naming.NamingException: Lookup failed for 'osgi:service/javax.jcr.Repository' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: osgi:service] 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
at javax.naming.InitialContext.lookup(InitialContext.java:392) 
at com.example.JndiTest.testRepositoryNotNull(JndiTest.java:27) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at junit.framework.TestCase.runTest(TestCase.java:176) 
at junit.framework.TestCase.runBare(TestCase.java:141) 
at junit.framework.TestResult$1.protect(TestResult.java:122) 
at junit.framework.TestResult.runProtected(TestResult.java:142) 
at junit.framework.TestResult.run(TestResult.java:125) 
at junit.framework.TestCase.run(TestCase.java:129) 
at junit.framework.TestSuite.runTest(TestSuite.java:255) 
at junit.framework.TestSuite.run(TestSuite.java:250) 
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: javax.naming.NameNotFoundException: osgi:service 
at com.sun.enterprise.naming.impl.TransientContext.resolveContext(TransientContext.java:310) 
at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:218) 
at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77) 
at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:109) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:144) 
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174) 
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528) 
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199) 
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624) 
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486) 
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990) 
at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214) 
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742) 
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539) 
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324) 
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) 
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540) 

是否忘記捆綁? 任何人都可以幫助我嗎?

回答

0

GlassFish有它自己的JNDI引擎,而Aries JNDI也是一個獨立的實現。

普通Java EE應用程序(EAR,WAR,...)將使用GlassFish JNDI引擎。 Glassfish JNDI引擎不支持「osgi:service」。萬一你的子系統是普通的Java EE應用程序,它將無法工作。

根據您的堆棧跟蹤,您使用Glassfish JNDI引擎。

白羊座JNDI在下列情況下很有用:您有一個現有的JAR,它具有通過JNDI查找對象的類。 JNDI位置可以配置。您將OSGi條目添加到MANIFEST.MF並將JAR部署到OSGi容器。即使在這種情況下,您也必須確保您的新捆綁連接到Aries JNDI,並且該服務在查找完成之前已註冊。

+0

如何註冊一個可以在沒有白羊座的其他JVM中查找的osgi服務?如果我用bundlecontext註冊它,只有其他bundle可以找到服務 – bg89

+0

另一個JVM或在同一個JVM中,但在OSGi容器之外?如果您對另一個JVM感興趣,只能通過某種遠程協議(RMI,SOAP WS,RESTFul API,...)來完成。 –

+0

是的,另一個JVM – bg89