2016-06-21 4 views
0

src/main/resources/META-INF/spring/mq-connectのフォルダ構造を持つOSGIバンドルのjarファイル(connection.jar)が1つあります。接続コード次の.xml はラクダルートを含有MQ-connect.xml別のバンドルのラクダルートでアクセスできない

<beans ...... > 
    .... 
    .... 
    .... 
    .... 

    <!-- AMQ jms component --> 
    <bean id="amqtx" class="org.apache.activemq.camel.component.ActiveMQComponent"> 
     <property name="connectionFactory" ref="amqPooledConnectFactory" /> 
     ... 
     ... 
     ... 
     <property name="maxConcurrentConsumers" value="${concurrent.consumers}" /> 
    </bean> 
</beans> 

私は別のOSGiバンドル(connection_impl.jar)を有する内に配置されます。私は、camelエンドポイントのコンポーネントとして "amqtx" beanを使用したいと思います。続き は、私は、JBoss--MQ-6.2.1を使用してKarafコンテナに配備しています「amqtx」

<beans ...... > 
    <import resource="classpath*:mq-connect.xml"/> 
     ... 
     ... 
     ... 
     ... 
    <camelContext trace="true" streamCache="true" autoStartup="true" xmlns="http://camel.apache.org/schema/spring"> 
      <route customId="true" id="TEST_AMQ"> 
        <description>Test connectivity from another file</description> 
        <from uri="amqtx:INBOUND.QUEUE" /> 
        <transacted ref="AMQ_PROPAGATION_REQUIRED" /> 
        <to uri="OUTBOUND.QUEUE" /> 
        <log message="Route completed successfully" /> 
       </route> 
    </camelContext> 
</beans> 

にアクセスするにはラクダのcontext.xmlに入れたコードです。 OSGiバンドルconnection.jarは正常にデプロイされますが、connection_implはデプロイできません。 A-MQは

Stack Trace: 
org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route TEST_AMQ: 
Route(TEST_AMQ)[[From[amqtx:INBOUND.QUEUE]] -> ... because of Failed to resolve endpoint: amqtx://INBOUND.QUEUE due to: No component found with scheme: amqtx 

をログに記録し、それが次のエラーを与える私は別のバンドルではアクセスできませんamqtxまださまざまな方法で一部を試みたが。

connection.jarでamqtxコンポーネントがconnection_impl.jar

答えて

2

にあなたがすべてで、この作品を作ることができるかどうかわからアクセスすることはできませんが、それは間違いなく、輸入に推奨されないように欠落しているインポート、エクスポート/間違った設定を提案してください。別のバンドルにバネxml。

最初のバンドルのサービスとしてBeanをエクスポートし、2番目のバンドルのサービスとして参照してください。これによりバンドルをより良い方法でデカップリングします。

+0

私はあなたの提案がかかりますし、あなたが提案方法を実装しようとします –

2

私はクリスチャンと合意しています。 OSGIバンドルは、別のバンドルが使用するライブラリのエクスポートを明示的に設定したり、OSGIサービスを公開したりしない限り、通常は分離されます。 OSGIサービスを設定したいのであれば、私の推薦は、比較的クリーンなので、Spring Frameworkのやり方です。インターフェイスを介してコンポーネントを公開することができます。以下に例を示します。

通常、これを管理する3つのバンドルがあります。私は通常、別々のバンドル間で公開するインターフェイスだけを含むバンドルを持っています。インターフェイスのインプリメンテーションであるBundleと、インタフェースを実装したインプリメンテーションを利用してタスクを達成するバンドル。

// Interfaceバンドルは、Interfaceと関連するPojosを公開します。例:あなたのインターフェイスから実装Beanのオフに基づいて、OSGiサービスを登録します

public interface AlternateFacilityApi { 
    public String getAlternateFacility(String facilityName); 
} 

//実装バンドル

public Class MyAlternateFacilityImpl implements AlternateFacilityApi { 
    public String getAlternateFacility(String facilityName) { 
     return "Bob's house"; 
    } 

//ラクダコンテキスト(はい、前のバンドルがで依存関係OSGI線です)

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:osgi="http://www.springframework.org/schema/osgi" 
    xmlns:ctx="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd 
     http://www.springframework.org/schema/osgi 
     http://www.springframework.org/schema/osgi/spring-osgi.xsd"> 

    <osgi:service id="AlternateFacilityService" ref="alternateFacilityService" interface="com.world.api.AlternateFacilityApi" /> 

    <bean id="alternateFacilityService" class="com.world.service.MyAlternateFacilityImpl" 
/> 
</beans> 

// [OK]を、最終的にプロセスは、OSGiサービス

を活用するために探して//ラクダコンテキスト
public Class AlternateFacilityLookup { 
    private AlternateFacilityApi apiLookupBean; 

    public String getMyAlternateFacility(String facilityName) { 
     return apiLookupBean.getAlternateFacility(facilityName); 
    } 

    //excluded setters and getters 
} 

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:osgi="http://www.springframework.org/schema/osgi" 
    xmlns:ctx="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd 
     http://www.springframework.org/schema/osgi 
     http://www.springframework.org/schema/osgi/spring-osgi.xsd"> 

    <osgi:reference id="AlternateFacilityLookupService" interface="com.world.api.AlternateFacilityApi" /> 

    <bean id="MyAlternateFacilityBean" class="com.awesome.AlternateFacilityLookup"> 
     <property name="apiLookupBean" ref="AlternateFacilityLookupService" /> 
    </bean> 
関連する問題