2012-05-24 3 views
0

Я наблюдаю странное поведение в приложении OSGi. В основном я имею несколько пакетов, обеспечивающих реализацию для одного сервисного интерфейса. Предполагается, что пакеты-потребители используют реализацию одного из этих пакетов, который соответствует конкретной версии.OSGi: servicereference.getBundle(). GetVersion() - Нет такой ошибки метода

Я пытался достичь этого первого получения всех услуг с использованием фильтра на услуги трекера, как это:

serviceTaskTracker = new ServiceTracker(bundleContext, 
bundleContext.createFilter("(objectClass=*ServiceTasks)"), null); 
ServiceReference[] serviceReferences = serviceTaskTracker.getServiceReferences(); 

Впоследствии я итерация набора результатов

for (ServiceReference serviceReference : serviceReferences) { 
     Bundle currentBundle = serviceReference.getBundle(); 

     try { 
      Version currentVersion = currentBundle.getVersion(); 
     } catch (Throwable e) { 
      System.out.println(e); 
      e.printStackTrace(); 
     } 

     if (currentVersion.equals(specifiedVersion)) { 
      service = (ServiceTasks) bundleContext.getService(serviceReference); 
     } 
} 

Теперь он вылетает при вызове currentBundle.getVersion(), который сообщает «Нет такой ошибки метода». Это особенно странно для меня, так как я могу подойти к этой строке в режиме отладки Eclipse, выделить «currentBundle.getVersion()», нажать CTRL + Shift + D, чтобы выполнить ее и получить ожидаемую версию поставляемого пакета. Нажав F6 на шаг еще раз, он сработает.

currentBundle.getClass() возвращает "(org.eclipse.osgi.framework.internal.core.BundleHost)", прежде чем я вызову getVersion() на нем.

StackTrace выглядит следующим образом:

java.lang.NoSuchMethodError: org.osgi.framework.Bundle.getVersion()Lorg/osgi/framework/Version; java.lang.NoSuchMethodError: org.osgi.framework.Bundle.getVersion()Lorg/osgi/framework/Version; at de.paas.engine.adapter.activiti.PaasServiceTask.getServiceTaskService(PaasServiceTask.java:69) at de.paas.servicetasks.exampleprocess.SendMailTask.paasExecute(SendMailTask.java:58) at de.paas.engine.adapter.activiti.PaasServiceTask.execute(PaasServiceTask.java:119) at org.activiti.engine.impl.bpmn.helper.ClassDelegate.execute(ClassDelegate.java:115) at org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute(AtomicOperationActivityExecute.java:44) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerStart.java:52) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionCreateScope.execute(AtomicOperationTransitionCreateScope.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake.execute(AtomicOperationTransitionNotifyListenerTake.java:65) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionDestroyScope.execute(AtomicOperationTransitionDestroyScope.java:115) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerEnd.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerEnd.java:36) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.take(ExecutionEntity.java:365) at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:74) at org.activiti.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.execute(FlowNodeActivityBehavior.java:36) at org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute(AtomicOperationActivityExecute.java:44) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerStart.java:52) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionCreateScope.execute(AtomicOperationTransitionCreateScope.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake.execute(AtomicOperationTransitionNotifyListenerTake.java:65) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionDestroyScope.execute(AtomicOperationTransitionDestroyScope.java:115) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerEnd.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerEnd.java:36) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:77) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:525) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.take(ExecutionEntity.java:365) at org.activiti.engine.impl.bpmn.behavior.BpmnActivityBehavior.performOutgoingBehavior(BpmnActivityBehavior.java:102) at org.activiti.engine.impl.bpmn.behavior.BpmnActivityBehavior.performDefaultOutgoingBehavior(BpmnActivityBehavior.java:51) at org.activiti.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.leave(FlowNodeActivityBehavior.java:44) at org.activiti.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior.leave(AbstractBpmnActivityBehavior.java:47) at org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior.signal(UserTaskActivityBehavior.java:92) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.signal(ExecutionEntity.java:348) at org.activiti.engine.impl.persistence.entity.TaskEntity.complete(TaskEntity.java:149) at org.activiti.engine.impl.cmd.SubmitTaskFormCmd.execute(SubmitTaskFormCmd.java:74) at org.activiti.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:24) at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:42) at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33) at org.activiti.engine.impl.FormServiceImpl.submitTaskFormData(FormServiceImpl.java:68) at de.paas.engine.adapter.activiti.ActivitiEngine.submit(ActivitiEngine.java:116) at de.paas.engine.core.ProcessEngineModule.submit(ProcessEngineModule.java:119) at de.paas.handler.ProcessHandler.post(ProcessHandler.java:223) at de.paas.dispatcher.PortalDispatcher.dispatch(PortalDispatcher.java:77) at de.paas.dispatcher.PortalDispatcher.doPost(PortalDispatcher.java:106) at de.paas.controller.FrontController.startService(FrontController.java:87) at de.paas.controller.FrontController.doFilter(FrontController.java:160) at de.paas.filter.core.PaasChain.doFilter(PaasChain.java:28) at de.paas.filter.PaasMessageFilter.doFilter(PaasMessageFilter.java:53) at de.paas.filter.core.PaasChain.doFilter(PaasChain.java:28) at de.paas.filter.PaasAuthorisationFilter.doFilter(PaasAuthorisationFilter.java:31) at de.paas.filter.core.PaasChain.doFilter(PaasChain.java:28) at de.paas.filter.PaasSessionFilter.doFilter(PaasSessionFilter.java:39) at de.paas.filter.core.PaasChain.doFilter(PaasChain.java:28) at de.paas.filter.PaasCallExceptionFilter.doFilter(PaasCallExceptionFilter.java:44) at de.paas.filter.core.PaasChain.doFilter(PaasChain.java:28) at de.paas.dispatcher.PortalDispatcher.service(PortalDispatcher.java:51) at org.eclipse.equinox.http.servlet.internal.ServletRegistration.handleRequest(ServletRegistration.java:91) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:110) at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.eclipse.equinox.servletbridge.BridgeServlet.service(BridgeServlet.java:115) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722)

Я могу только догадываться, это вызвано OSGi магии в фоновом режиме ?! Любая помощь высоко ценится. Спасибо!! Johannes

+0

Можете ли вы предоставить трассировку стека, а также распечатать класс пакета перед вызовом getVersion()? Не должно быть никаких масок OSGi, которые могут вызвать это. OSGi работает только с загрузчиками классов. –

+0

Я отредактировал мое сообщение, и теперь он показывает возвращаемое значение currentBundle.getClass() (надеюсь, это то, что вы имели в виду, не так ли?), А также слишком длинная трассировка стека. – Johannes

+0

Хмммм, похоже, что есть некоторая несоответствие в реализации OSGi между тем, что было скомпилировано и что выполняется. Однако класс, который вы распечатываете, кажется правильным? Как вы это делаете? –

ответ

9

Метод getVersion() был добавлен в Bundle в версии 1.5 пакета org.osgi.framework, то есть OSGi Release 4.2. Похоже, вы скомпилированы против OSGi R4.2, но на самом деле работают на чем-то ниже.

Этот вид проблемы можно легко избежать, используя диапазоны версий в вашем заявлении Import-Package. В этом примере вам необходимо импортировать пакет org.osgi.framework в виде диапазона версий [1.5,2.0) ... это не позволит вашему пакету перейти на более раннюю версию OSGi.

+0

Большое спасибо! Я никогда не понимал, что развертываю свои пакеты на платформе с старой версией OSGi и никогда бы не узнал об этом. Теперь обновляем все пакеты ... – Johannes

1

Работа над догадкой здесь: Я думаю, что ваш код и код платформы имеют иное представление о том, откуда приходит пакет org.osgi.framework. Это может произойти, если OSGi API загружен из разных пакетов, что приводит к классам с одинаковым именем, но не.

Вы можете попробовать использовать консоль, чтобы посмотреть, как ваши пакеты подключены к пакету org.osgi.framework, и посмотреть, как подключается комплект, который производит проверку, которую вы проверяете. Лучше всего предположить, что вы слишком много внедряете в свое приложение, которое может работать корректно во время отладки в Eclipse, но неправильно запущено во время работы в Tomcat (в зависимости от точного способа развертывания вашего проекта).

+0

Хорошо, моя догадка была неправильной, я должен был это знать. Ответ @Neil Bartlett выше правильный. –

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