2013-06-03 2 views
0

Мое приложение имеет некоторые модули OSGI и часть, отличную от OSGI. Я попробовал поиск osgi-сервисов в подсистеме non-osgi через JNDI с apache-ариями. Я использую старую рыбку.Овен jndi lookup in osgi

Мой план 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. Apache Aries Util
  2. Apache Aries Proxy Пакет
  3. Apache Aries Blueprint Bundle
  4. Apache Aries JNDI Bundle

Но я получаю исключение:

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, она не будет работать.

Основываясь на вашем стекле, вы используете двигатель JNDI Glassfish.

Овен JNDI полезен в случае следующего сценария: у вас есть JAR, у которого есть класс, который ищет объект через JNDI. Можно расположить местоположение JNDI. Вы добавляете записи OSGi в MANIFEST.MF и развертываете JAR в контейнере OSGi. Даже в этом случае вы должны быть уверены в том, что ваши новые прокладки соединяются с Aries JNDI и что служба зарегистрирована до того, как будет выполнен поиск.

+0

Как зарегистрировать службу osgi, которую я могу найти в другой JVM без ария? Если я зарегистрирую его с помощью bundlecontext, только другие пакеты могут найти службу – bg89

+0

Другая JVM или в той же JVM, но вне контейнера OSGi? Если вас интересует другая JVM, это может быть сделано только через какой-то удаленный протокол (RMI, SOAP WS, RESTFul API, ...) –

+0

Да, еще один JVM – bg89

Смежные вопросы