- PR -

JBoss + EJB でlookupできない

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/08/03
投稿数: 3
投稿日時: 2006-08-03 18:20
皆様

お世話になってます。

JBoss導入の際に、コネクションプーリングの動作確認をしようとしたところ、
Context.lookupにて、バインドされているJNDI名が解決されません。

構成
jboss-4.0.3SP1
Eclipse3.1 + JBoss-IDEプラグイン

Javaソース

package hoge;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.sql.DataSource;


public class EchoClient {

public static Object lookup(String name, Class type)
throws NamingException,SQLException {

//DBへ接続(コネクション取得)

// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

//直接DBにつなぐ
//Connection conn =
//DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521","hr", "password");
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
props.put(Context.URL_PKG_PREFIXES,
"org.jboss.naming:org.jnp.interfaces");
props.put(Context.PROVIDER_URL, "jnp://localhost:1099");

InitialContext ctx = new InitialContext(props);
ctx.lookup("OracleDS");
//コネクションプーリングVer
DataSource ds = (DataSource)ctx.lookup("java:OracleDS");
Connection conn = ds.getConnection();

//ステートメントオブジェクト生成
Statement stmt = conn.createStatement ();
ResultSet rset = stmt.executeQuery ("select * from employees");

conn.close();
rset.close();
stmt.close();

ResultSetMetaData rmeta = rset.getMetaData();
int columnCount = rmeta.getColumnCount();
String[] columnNames = new String[columnCount];
for(int i = 0; i < columnCount ; i++){
columnNames[i] = rmeta.getColumnName(i+1);
}

Object home = PortableRemoteObject.narrow(ctx.lookup(name), type);

return home;
}

public static String sayEcho(String message) {
try {
EchoHome home = (EchoHome)
lookup("ejb/Echo", EchoHome.class);
Echo echo = home.create();
String result = echo.sayEcho(message);
return result;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}

public static void main(String[] args) throws Exception {

String result = sayEcho("hello");
System.out.println(result);
}

}

ソース抜粋

ctx.lookup("OracleDS");
//コネクションプーリングVer
DataSource ds = (DataSource)ctx.lookup("java:OracleDS");

ここで落ちます。

JBoss起動時のログについては
18:14:43,906 INFO [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=OracleDS' to JNDI name 'java:OracleDS'

OracleDSという名前でバインドされているはずなのですが、

javax.naming.NameNotFoundException: OracleDS not bound
at org.jnp.server.NamingServer.getBinding(NamingServer.java:514)
at org.jnp.server.NamingServer.getBinding(NamingServer.java:522)
at org.jnp.server.NamingServer.getObject(NamingServer.java:528)
at org.jnp.server.NamingServer.lookup(NamingServer.java:281)
at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:610)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)
at javax.naming.InitialContext.lookup(Unknown Source)
at hoge.EchoClient.lookup(EchoClient.java:39)
at hoge.EchoClient.sayEcho(EchoClient.java:67)
at hoge.EchoClient.main(EchoClient.java:79)

ちなみに、

C:\jboss-4.0.3SP1\server\default\deploy\oracle-ds.xml
の内容は
<datasources>
<local-tx-datasource>
<jndi-name>OracleDS</jndi-name>
<connection-url>jdbc:oracle:thin:@localhost:1521</connection-url>
<!--

Here are a couple of the possible OCI configurations.
For more information, see http://otn.oracle.com/docs/products/oracle9i/doc_library/release2/java.920/a96654/toc.htm

<connection-url>jdbc:oracle:oci:@youroracle-tns-name</connection-url>
or
<connection-url>jdbc:oracle:oci:@(description=(address=(host=youroraclehost)(protocol=tcp)(port=1521))(connect_data=(SERVICE_NAME=yourservicename)))</connection-url>

Clearly, its better to have TNS set up properly.
-->
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>hr</user-name>
<password>password</password>
<!-- Uses the pingDatabase method to check a connection is still valid before handing it out from the pool -->
<!--valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name-->
<!-- Checks the Oracle error codes and messages for fatal errors -->
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<!-- sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
-->

<!-- sql to call on an existing pooled connection when it is obtained from pool - the OracleValidConnectionChecker is prefered
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
-->

<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>Oracle9i</type-mapping>
</metadata>
</local-tx-datasource>

</datasources>

となってます。

バインドできているように見えて、lookup("OracleDS")がこける理由が分かりません。

ご回答よろしくお願いします。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2006-08-03 18:57
JBOSSについてはまったく存じていないのですが
記述を見る限り1点抜けているのではないかと思い
書かせていただきます。

C:\jboss-4.0.3SP1\server\default\deploy\oracle-ds.xml

はDataSourceの定義を書いてある定義ファイルだと思われます。
ここにDataSourceを定義してもソース上では利用できません。

EJBで利用するにはそのEJBに対しDataSouceのJNDI名を
マッピングする必要があるはずです。
それを記述する場所がどこかに
ありませんでしょうか
未記入
会議室デビュー日: 2006/08/03
投稿数: 3
投稿日時: 2006-08-03 19:36
返答ありがとうございます。

正直、マッピングの構成は良く分からないのですが、関係ありそうなファイルのコードを書きます。
ejbのjndiをマッピングしていると思われる。
ejb-jar.xml
<session >
<description><![CDATA[Description for Echo]]></description>
<display-name>Name for Echo</display-name>

<ejb-name>Echo</ejb-name>
<jndi-name>ejb/Echo</jndi-name>
<home>hoge.EchoHome</home>
<remote>hoge.Echo</remote>
<ejb-class>hoge.EchoSession</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>

</session>

また、jboss.xmlというファイルにもマッピングしています。
<session>
<ejb-name>Echo</ejb-name>
<jndi-name>ejb/Echo</jndi-name>
</session>

こうすることで、ejbのlookupはできています

Object home = PortableRemoteObject.narrow(ctx.lookup(name), type);

ソースを並べ替えて実行すると、この一文は成功します。

>EJBで利用するにはそのEJBに対しDataSouceのJNDI名を
>マッピングする必要があるはずです。
>それを記述する場所がどこかに
>ありませんでしょうか

正直、分かりませんでした。

ご助言ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)