1

次のモジュールでセットアップされた基本的な ESB Fuse テスト プロジェクトがあります。

シンプルなデータソース シンプルなモデル シンプルなサービス

データソースはブループリントを介して構成され、データソースは jndi にアタッチされています。

<?xml version="1.0" encoding="UTF-8"?>

http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd ">

<bean id="simpleDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVICE_NAME=xyz))(ADDRESS=(PROTOCOL=TCP)(HOST=xx.xx.xx.xx)(PORT=1521)))" />
    <property name="username" value="username" />
    <property name="password" value="password" />       
</bean>

<!--bean id="simpleDataSource" class="oracle.jdbc.driver.OracleDriver">     
    <property name="URL" value="jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVICE_NAME=devd))(ADDRESS=(PROTOCOL=TCP)(HOST=10.75.192.195)(PORT=1521)))"/>
    <property name="username" value="username" />
    <property name="password" value="password" />       
</bean-->

<service ref="simpleDataSource" interface="javax.sql.DataSource">
    <service-properties>
        <entry key="osgi.jndi.service.name" value="jdbc/simpleDataSource" />
    </service-properties>
</service>

このモデルは、persistence.xml ファイル内に永続ユニットを定義し、jndi を介してデータソースを参照します (ここで定義されている長い jndi ルックアップと短い jndi ルックアップに注目してください。どちらも試してみました)。

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
version="2.0">

<persistence-unit name="simple-service-persistence-unit" transaction-type="JTA">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <!--jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/simpleDataSource)</jta-data-source-->
    <jta-data-source>osgi.jndi.service.name=jdbc/simpleDataSource</jta-data-source>
    <!-- list of the persistance classes -->
    <class>com.model.SimpleRow</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
</persistence-unit>

SimpleRow クラスは JPA アノテーションを使用します。

package com.model;

import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table;

@Entity @Table(name = "SIMPLE") public class SimpleRow {

@Column(name = "simple_id")
private Long simpleId;

@Column(name = "simple_text", length =100)
private String simpleText;

public Long getSimpleId() {
    return simpleId;
}

public void setSimpleId(Long simpleId) {
    this.simpleId = simpleId;
}

public String getSimpleText() {
    return simpleText;
}

public void setSimpleText(String simpleText) {
    this.simpleText = simpleText;
}

}

次に、ブループリントと simple-service-persistence-unit への参照を使用して、サービスに EntityManager を注入しようとします。

<?xml version="1.0" encoding="UTF-8"?>

http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://aries.apache.org/xmlns/ jpa/v1.1.0 http://aries.apache.org/schemas/jpa/jpa_110.xsd ">

<bean id="simpleService" class="com.service.SimpleServiceImpl">
    <jpa:context property="entityManager" unitname="simple-service-persistence-unit" />
    <tx:transaction method="*" value="Required" />
</bean>

<service ref="simpleService" interface="com.service.SimpleService" />

これらのモジュールを fuse OSGi コンテナーにインストールすると、simple-datasource と simple-module の両方が正しくインストールされているように見えます。これらのモジュールをリストすると、次のようになります。

[ 274] [Active     ] [            ] [       ] [   60] Simple Model (1.0.0)
[ 275] [Active     ] [Created     ] [       ] [   60] Simple Datasource (1.0.0)

注入された DataSource を使用するテスト jdbc モジュールを作成しました。これにより、DataSource が正しく機能していることが確認されました。

public class DbExample {
DataSource dataSource;

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void test() throws Exception {
    Connection con = dataSource.getConnection();
    Statement stmt = null;
    DatabaseMetaData dbMeta = con.getMetaData();
    ....
 }

ここで、simple-service を開始しようとすると、猶予期間の状態になり、次のメッセージがログ ファイルに出力されます。

2013-07-02 11:05:33,772 | INFO  | e-1.0.0-thread-1 | BlueprintContainerImpl           | ?                                   ? | 8 - org.apache.aries.blueprint.core - 1.0.1.fuse-71-047 | Bundle simple-service is waiting for dependencies [(&(&(org.apache.aries.jpa.proxy.factory=true)(osgi.unit.name=simple-service-persistence-unit))(objectClass=javax.persistence.EntityManagerFactory))]

モジュールの状態を一覧表示すると、猶予期間の状態にあることがわかります。

[ 277] [Active     ] [GracePeriod ] [       ] [   60] Simple Service Bundle (1.0.0)

最終的にタイムアウトになり、障害状態に移行します。

私の最初の考えは、データソースが壊れている可能性があるということでしたが、jdbc モジュールは正常に動作していることを証明しています。私のその後の考えは、これを確認する方法がわかりませんが、jndi ルックアップが正しく機能していないということです。jndi レジストリを表示する方法はありますか? その他の提案は歓迎します。

4

1 に答える 1