2013-07-11 2 views
1

У меня есть комплект OSGi, который имеет класс слушателей-слушателей, отслеживающий службы, зарегистрированные другими пакетами OSGi. Я настроил опорный слушатель плана следующим образом и раскрывал все необходимые пакеты Овна в Felix:Инъекционная транзакция в справочном прослушивателе OSGi с планом

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0"> 
    <reference-list id="ServiceList" interface="com.test.MyService" availability="optional"> 
     <reference-listener bind-method="bind" unbind-method="unbind"> 
      <bean class="com.test.MyServiceMonitor" /> 
     </reference-listener> 
    </reference-list> 
</blueprint> 

Все хорошо работает с этой конфигурацией и связываются и UNBIND методы класса MyServiceMonitor называется когда услуги приходят и идти. В качестве следующего шага я хочу способ привязки также написать некоторые данные в базе данных, так что я пытался внедрить менеджер сущностей в MyServiceMonitor и создать транзакцию путем изменений боба тега следующим образом:

<bean class="com.test.MyServiceMonitor"> 
    <tx:transaction method="bind" value="RequiresNew" /> 
    <jpa:context property="entityManager" unitname="myunit" /> 
</bean> 

Это попытка создать транзакция для метода привязки приводит к исключению ниже, когда я запускаю пакет. Пакет запускается без проблем, когда я удаляю тэг транзакции tx :, когда я смог использовать диспетчер сущностей и транзакции в других (не ссылающихся слушателя) бобах с той же конфигурацией плана.

Будучи относительно новым для OSGi, я не смог выяснить, является ли это ожидаемым поведением, и если да, то каков надлежащий способ выполнения операций БД внутри ссылочного прослушивателя. Какие-нибудь идеи по этому поводу?

2013-07-11 12:40:12,592 | ERROR | 20 - org.apache.aries.blueprint - 1.1.0 | org.apache.aries.blueprint.container.BlueprintContainerImpl | Unable to start blueprint container for bundle com.test.my-bundle 
org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to convert value BeanRecipe[name='#recipe-2'] to type class java.lang.Object 
    at org.apache.aries.blueprint.di.CollectionRecipe.internalCreate(CollectionRecipe.java:92) 
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106) 
    at org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe.createListeners(AbstractServiceReferenceRecipe.java:246) 
    at org.apache.aries.blueprint.container.ReferenceListRecipe.internalCreate(ReferenceListRecipe.java:74) 
    at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88) 
    at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:245) 
    at org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:183) 
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:668) 
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:370) 
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:261) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at org.apache.aries.blueprint.container.ExecutorServiceWrapper.run(ExecutorServiceWrapper.java:106) 
    at org.apache.aries.blueprint.utils.threading.impl.DiscardableRunnable.run(DiscardableRunnable.java:48) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) 
    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) 
Caused by: org.osgi.service.blueprint.container.ComponentDefinitionException: Error setting property: PropertyDescriptor <name: listener, getter: null, setter: [class org.apache.aries.blueprint.container.AbstractServiceReferenceRecipe$Listener.setListener(class java.lang.Object)] 
    at org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:941) 
    at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:907) 
    at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:888) 
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:820) 
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787) 
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106) 
    at org.apache.aries.blueprint.di.CollectionRecipe.internalCreate(CollectionRecipe.java:90) 
    ... 25 more 
Caused by: org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to create proxy for bean #recipe-3 in bundle com.test.my-bundle version 1.0.0.SNAPSHOT 
    at org.apache.aries.blueprint.container.BeanRecipe.addInterceptors(BeanRecipe.java:771) 
    at org.apache.aries.blueprint.container.BeanRecipe.wrap(BeanRecipe.java:841) 
    at org.apache.aries.blueprint.container.AggregateConverter.convert(AggregateConverter.java:149) 
    at org.apache.aries.blueprint.container.BlueprintRepository.convert(BlueprintRepository.java:402) 
    at org.apache.aries.blueprint.utils.ReflectionUtils$PropertyDescriptor.convert(ReflectionUtils.java:394) 
    at org.apache.aries.blueprint.utils.ReflectionUtils$MethodPropertyDescriptor.internalSet(ReflectionUtils.java:628) 
    at org.apache.aries.blueprint.utils.ReflectionUtils$PropertyDescriptor.set(ReflectionUtils.java:378) 
    at org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:939) 
    ... 31 more 
Caused by: org.apache.aries.proxy.UnableToProxyException: The class com.test.MyServiceMonitor is not an interface and therefore a proxy cannot be generated. 
    at org.apache.aries.proxy.impl.JdkProxyManager.getInterfaces(JdkProxyManager.java:43) 
    at org.apache.aries.proxy.impl.JdkProxyManager.createNewProxy(JdkProxyManager.java:36) 
    at org.apache.aries.proxy.impl.AbstractProxyManager.createDelegatingInterceptingProxy(AbstractProxyManager.java:75) 
    at org.apache.aries.proxy.impl.AbstractProxyManager.createInterceptingProxy(AbstractProxyManager.java:53) 
    at org.apache.aries.blueprint.container.BeanRecipe.addInterceptors(BeanRecipe.java:767) 
    ... 38 more 
+0

Поддерживает ли MyServiceMonitor интерфейс? –

+0

@SheenaArtrip Нет, это не так, поскольку слушателю-справочнику не нужно работать. – Christina

ответ

0

Ваш менеджер транзакций использует JdkProxyManager для прокси-транзакций. Для встроенного JXK-прокси-менеджера требуется интерфейс для прокси-сервера. Лучше всего сделать интерфейс с помощью необходимых методов и реализовать его. Другой вариант - переключиться на прокси-сервер ASM, CGLib или JavaAssist.

+0

Я попытался создать интерфейс, который определяет методы, которые я хочу сделать транзакционными, и класс MyServiceMonitor реализует этот интерфейс, но я все равно получаю то же исключение. Я даже попытался разоблачить его как услугу (которая в идеале я бы не хотела делать), но все равно не повезло. Может, я что-то упустил в конфигурации чертежа? – Christina