2013-07-11 6 views
1

다른 OSGi 번들에 의해 등록 된 서비스를 추적하는 참조 수신기 클래스가있는 OSGi 번들이 있습니다. 나는 다음과 같이 청사진 기준 리스너를 구성하고 펠릭스에 필요한 모든 양자리 번들을 배포 한 :청사진을 사용하여 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> 

모든이 구성 및 바인드와 MyServiceMonitor 클래스의 바인딩을 해제 방법과 함께 사용하기에 적합합니다 서비스가 올 때 호출되며, 가기.

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

만드는이 시도 : 다음 단계로 나는 다음과 같이 또한 데이터베이스의 일부 데이터를 작성하는 바인드 방법은 그래서 빈 태그를 변경하여 트랜잭션을 MyServiceMonitor에 하나의 엔티티 관리자를 주입하고 만들려고합니다 번들을 시작하면 bind 메소드의 트랜잭션이 아래 예외 상황이됩니다. 동일한 청사진 구성을 가진 다른 (참조 리스너가 아닌) 빈에서 엔티티 관리자와 트랜잭션을 사용할 수있는 동안 tx : transaction 태그를 제거하면 번들이 문제없이 시작됩니다.

비교적 OSGi에 익숙하지 않아 이것이 예상되는 동작인지 여부를 파악할 수 없었습니다. 그렇다면 참조 수신기에서 DB 작업을 수행하는 올바른 방법은 무엇입니까? 그걸 통찰 해?

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를 사용하여 트랜잭션을 프록시합니다. 내장 된 JDK 프록시 관리자는 프록시하기 위해 인터페이스가 필요합니다. 가장 좋은 방법은 필수 메소드와 인터페이스를 만들고 구현하는 것입니다. 다른 옵션은 ASM, CGLib 또는 JavaAssist 기반 ProxyManager로 전환하는 것입니다.

+0

나는 트랜잭션을 만들고 MyServiceMonitor 클래스에서이 인터페이스를 구현하는 데 필요한 메서드를 정의하는 인터페이스를 만들려고했지만 여전히 동일한 예외가 발생합니다. 나는 심지어 서비스로서 그것을 노출하려고 노력했다. (이상적으로는하고 싶지는 않지만) 운이 없다. 아마도 청사진 구성에서 뭔가를 놓치고 있습니까? – Christina