[jjbug-jboss 2] jboss のデータソースを java アプリから使えますか

415 views
Skip to first unread message

竹の内まり子

unread,
May 9, 2007, 4:02:21 AM5/9/07
to japan-jb...@lists.sourceforge.jp, shi...@atomsware.co.jp
島田様、

ご指摘ありがとうございます。
当然といえば当然ですね。
#実はエラーになることが分かっていながら投稿いたしました。(ごめんなさい)

問題は IntialContextFactoryとして何を渡すのかということだと思うのですが、

下記のようにlist()->Invokeしたところ、


java:comp namespace of the jboss-web.deployer/ROOT.war application:

+- UserTransaction[link -> UserTransaction] (class: javax.naming.LinkRef)
+- env (class: org.jnp.interfaces.NamingContext)
| +- security (class: org.jnp.interfaces.NamingContext)
| | +- realmMapping[link -> java:/jaas/other] (class: javax.naming.LinkRef)
| | +- subject[link -> java:/jaas/other/subject] (class: javax.naming.LinkRef)
| | +- securityMgr[link -> java:/jaas/other] (class: javax.naming.LinkRef)
| | +- security-domain[link -> java:/jaas/other] (class: javax.naming.LinkRef)


java:comp namespace of the http-invoker.sar/invoker.war application:

+- UserTransaction[link -> UserTransaction] (class: javax.naming.LinkRef)
+- env (class: org.jnp.interfaces.NamingContext)
| +- security (class: org.jnp.interfaces.NamingContext)
| | +- realmMapping[link -> java:/jaas/jmx-console] (class: javax.naming.LinkRef)
| | +- subject[link -> java:/jaas/jmx-console/subject] (class: javax.naming.LinkRef)
| | +- securityMgr[link -> java:/jaas/jmx-console] (class: javax.naming.LinkRef)
| | +- security-domain[link -> java:/jaas/jmx-console] (class: javax.naming.LinkRef)

java:comp namespace of the jbossmq-httpil.sar/jbossmq-httpil.war application:

+- UserTransaction[link -> UserTransaction] (class: javax.naming.LinkRef)
+- env (class: org.jnp.interfaces.NamingContext)
| +- security (class: org.jnp.interfaces.NamingContext)
| | +- realmMapping[link -> java:/jaas/jbossmq] (class: javax.naming.LinkRef)
| | +- subject[link -> java:/jaas/jbossmq/subject] (class: javax.naming.LinkRef)
| | +- securityMgr[link -> java:/jaas/jbossmq] (class: javax.naming.LinkRef)
| | +- security-domain[link -> java:/jaas/jbossmq] (class: javax.naming.LinkRef)


java:comp namespace of the console-mgr.sar/web-console.war application:

+- UserTransaction[link -> UserTransaction] (class: javax.naming.LinkRef)
+- env (class: org.jnp.interfaces.NamingContext)
| +- security (class: org.jnp.interfaces.NamingContext)
| | +- realmMapping[link -> java:/jaas/other] (class: javax.naming.LinkRef)
| | +- subject[link -> java:/jaas/other/subject] (class: javax.naming.LinkRef)
| | +- securityMgr[link -> java:/jaas/other] (class: javax.naming.LinkRef)
| | +- security-domain[link -> java:/jaas/other] (class: javax.naming.LinkRef)


java:comp namespace of the jbossws.sar/jbossws-context.war application:

+- UserTransaction[link -> UserTransaction] (class: javax.naming.LinkRef)
+- env (class: org.jnp.interfaces.NamingContext)
| +- security (class: org.jnp.interfaces.NamingContext)
| | +- realmMapping[link -> java:/jaas/other] (class: javax.naming.LinkRef)
| | +- subject[link -> java:/jaas/other/subject] (class: javax.naming.LinkRef)
| | +- securityMgr[link -> java:/jaas/other] (class: javax.naming.LinkRef)
| | +- security-domain[link -> java:/jaas/other] (class: javax.naming.LinkRef)


java:comp namespace of the jmx-console.war application:

+- UserTransaction[link -> UserTransaction] (class: javax.naming.LinkRef)
+- env (class: org.jnp.interfaces.NamingContext)
| +- security (class: org.jnp.interfaces.NamingContext)
| | +- realmMapping[link -> java:/jaas/other] (class: javax.naming.LinkRef)
| | +- subject[link -> java:/jaas/other/subject] (class: javax.naming.LinkRef)
| | +- securityMgr[link -> java:/jaas/other] (class: javax.naming.LinkRef)
| | +- security-domain[link -> java:/jaas/other] (class: javax.naming.LinkRef)


java: Namespace

+- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- DefaultDS (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)
+- SecurityProxyFactory (class: org.jboss.security.SubjectSecurityProxyFactory)
+- DefaultJMSProvider (class: org.jboss.jms.jndi.JNDIProviderAdapter)
+- comp (class: javax.naming.Context)
+- ConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- JmsXA (class: org.jboss.resource.adapter.jms.JmsConnectionFactoryImpl)
+- jaas (class: javax.naming.Context)
| +- jbossmq (class: org.jboss.security.plugins.SecurityDomainContext)
| +- JmsXARealm (class: org.jboss.security.plugins.SecurityDomainContext)
+- comp.original (class: javax.namingMain.Context)
+- timedCacheFactory (class: javax.naming.Context)
Failed to lookup: timedCacheFactory, errmsg=org.jboss.util.TimedCachePolicy cannot be cast to javax.naming.NamingEnumeration
+- TransactionPropagationContextExporter (class: com.arjuna.ats.internal.jbossatx.jta.PropagationContextManager)
+- StdJMSPool (class: org.jboss.jms.asf.StdServerSessionPoolFactory)
+- Mail (class: javax.mail.Session)
+- comp.ejb3 (class: javax.naming.Context)
| NonContext: null
+- TransactionPropagationContextImporter (class: com.arjuna.ats.internal.jbossatx.jta.PropagationContextManager)
+- TransactionManager (class: com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate)


Global JNDI Namespace

+- TopicConnectionFactory (class: org.jboss.naming.LinkRefPair)
+- jmx (class: org.jnp.interfaces.NamingContext)
| +- invoker (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor (proxy: $Proxy48 implements interface org.jboss.jmx.adaptor.rmi.RMIAdaptor,interface org.jboss.jmx.adaptor.rmi.RMIAdaptorExt)
| +- rmi (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor[link -> jmx/invoker/RMIAdaptor] (class: javax.naming.LinkRef)
+- HTTPXAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- ConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- UserTransactionSessionFactory (proxy: $Proxy14 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory)
+- HTTPConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- TransactionSynchronizationRegistry (class: com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple)
+- UserTransaction (class: org.jboss.tm.usertx.client.ClientUserTransaction)
+- UILXAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
+- UIL2XAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
+- queue (class: org.jnp.interfaces.NamingContext)
| +- A (class: org.jboss.mq.SpyQueue)
| +- testQueue (class: org.jboss.mq.SpyQueue)
| +- ex (class: org.jboss.mq.SpyQueue)
| +- DLQ (class: org.jboss.mq.SpyQueue)
| +- D (class: org.jboss.mq.SpyQueue)
| +- C (class: org.jboss.mq.SpyQueue)
| +- B (class: org.jboss.mq.SpyQueue)
+- topic (class: org.jnp.interfaces.NamingContext)
| +- testDurableTopic (class: org.jboss.mq.SpyTopic)
| +- testTopic (class: org.jboss.mq.SpyTopic)
| +- securedTopic (class: org.jboss.mq.SpyTopic)
+- console (class: org.jnp.interfaces.NamingContext)
| +- PluginManager (proxy: $Proxy49 implements interface org.jboss.console.manager.PluginManagerMBean)
+- UIL2ConnectionFactory[link -> ConnectionFactory] (class: javax.naming.LinkRef)
+- HiLoKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.hilo.HiLoKeyGeneratorFactory)
+- UILConnectionFactory[link -> ConnectionFactory] (class: javax.naming.LinkRef)
+- QueueConnectionFactory (class: org.jboss.naming.LinkRefPair)
+- UUIDKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.uuid.UUIDKeyGeneratorFactory)

そこで

import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.sql.DataSource;

import java.util.Properties;

public class Batch {

public static void main (String [] args) {
DataSource ds;
try {
Properties props = new Properties ();
props.put ("HTTPXAConnectionFactory", "org.jboss.mq.SpyConnectionFactory");
InitialContext ic = new InitialContext (props);
ds = (DataSource) ic.lookup ("java:/DefaultDS");
} catch (NamingException ex) {
ex.printStackTrace (System.out);
}
}
}

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at Batch.main(Batch.java:16)


どのように書けばよろしいのでしょうか?
よろしくお願いいたします。

竹の内まり子

_______________________________________________
Japan-jbug-jboss mailing list
Japan-jb...@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/japan-jbug-jboss

ryuk.shinesoft

unread,
May 9, 2007, 4:44:42 AM5/9/07
to japan-jb...@lists.sourceforge.jp
竹の内様

お疲れ様です、劉です。

http://wiki.jboss.org/wiki/Wiki.jsp?page=ConfigDataSources
によると、リモートクライアントからDataSourceに
アクセスするには、データソースの設定ファイルに、
use-java-context=falseの設定を追加すればできます。

つまり、*-ds.xmlのファイルに、
<use-java-context>false</use-java-context>
行を追加するだけで出来るはずです。

私が以下のようなサンプルをテストOKでした。

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class TestDs {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub


try {
Properties props = new Properties();

props.put("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
props.put("java.naming.factory.url.pkgs",
"org.jboss.naming:org.jnp.interfaces");
props.put("java.naming.provider.url",
"jnp://localhost:1099");

Context ic = new InitialContext(props);
DataSource ds = (DataSource) ic.lookup("DefaultDS");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT count(*)
from JMS_TRANSACTIONS");
rs.next();
String count = rs.getString(1);
// ..........
conn.close();
System.out.println("count is " + count);
System.out.println("OK");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

以上です、宜しくお願い致します。


--- 竹の内まり子 <t.ma...@k8.dion.ne.jp> wrote:

> 島田様、
>
> ご指摘ありがとうございます。
> 当然といえば当然ですね。
> #実はエラーになることが分かっていながら投稿いたしまし
た。(ごめんなさい)
>
> 問題は
> IntialContextFactoryとして何を渡すのかということだと思

=== 以下のメッセージは省略されました ===


--------------------------------------
Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar
http://pr.mail.yahoo.co.jp/toolbar/

ryuk.shinesoft

unread,
May 9, 2007, 5:17:30 AM5/9/07
to japan-jb...@lists.sourceforge.jp

お疲れ様です、劉です。

すみません、書くべき注意点を追記させて頂きます。

Wikiにもかいてありますけど、
JBossは、開発環境でその方法は勧めないです。

接続プールがリモートアクセスするのを必要となりますので、

□ 接続が直列化可能でないためパターンに反しています。
□ トランザクション伝播はサポートされません。
□ リモートクライアントが信頼できない場合コネクションリ
ークになるかもしれません。

データソースにリモートアクセスする必要がありましたら、
JBossはリモートセッションBeanで正面を通ってデータソース
にアクセスするのを勧めています。

以上、ご参考まで。

--- "ryuk.shinesoft" <ry...@shinesoft.co.jp> wrote:

大塚 玲子

unread,
May 9, 2007, 5:22:39 AM5/9/07
to japan-jb...@lists.sourceforge.jp
竹の内さん

大塚と申します。初めまして!

素朴な疑問なのですが、JBossのデータソースを使わないと
いけないのでしょうか?
java.sql.DriverManagerで直接JDBCドライバから接続する
のではだめなんでしょうか?

劉さんからも指摘がありましたが、この方法はあまりお勧め
できないみたいです。(私もそう思います。)
JNDI名も変わっちゃいますし。

以上、よろしくお願いします。

Fusayuki Minamoto

unread,
May 9, 2007, 8:11:22 AM5/9/07
to japan-jb...@lists.sourceforge.jp
大塚さん

>素朴な疑問なのですが、JBossのデータソースを使わないと
>いけないのでしょうか?
>java.sql.DriverManagerで直接JDBCドライバから接続する
>のではだめなんでしょうか?

リソースとしてのDBコネクションを一元管理できなくなりますので、
私はこの方法はお勧めしません。

それにコネクションプールの設定も異なるのは嫌ですよね。

Miki

----
皆本 房幸 <miki....@nifty.com>
http://d.hatena.ne.jp/neverbird/about

Takayoshi Kimura

unread,
May 9, 2007, 8:15:35 PM5/9/07
to japan-jb...@lists.sourceforge.jp
きむらです。

On 5/9/07, Fusayuki Minamoto <miki....@nifty.com> wrote:
> >素朴な疑問なのですが、JBossのデータソースを使わないと
> >いけないのでしょうか?
> >java.sql.DriverManagerで直接JDBCドライバから接続する
> >のではだめなんでしょうか?
>
> リソースとしてのDBコネクションを一元管理できなくなりますので、
> 私はこの方法はお勧めしません。

要件によるんじゃないでしょうか。別のマシン上で動作する
重たいバッチ処理とかなら直接そのマシンからDBへ接続する
ほうが賢明でしょう。

--
//Takayoshi Kimura <taka...@gmail.com>

Fusayuki Minamoto

unread,
May 9, 2007, 9:02:45 PM5/9/07
to japan-jb...@lists.sourceforge.jp
きむらさん

確かに要件次第ですね。

[japan-jbug 373] を読み直したら、「夜間バッチ」の話が発端に
なっていました。

想像するにcronとか、ジョブネットとかを使って、JBossの外部から
トリガをかけてバッチ処理をしたいということなのでしょうかねぇ。

ロジックが無いのであれば、Javaを使わないというのがベストなケース
もあるかもしれません。

Miki
----- Original Message -----
>Date: Thu, 10 May 2007 09:15:35 +0900
>From: "Takayoshi Kimura" <taka...@gmail.com>
>To: japan-jb...@lists.sourceforge.jp
>Subject: [jjbug-jboss 7] Re:
> jboss のデータソースを java アプリから使えますか
>
>

----

_______________________________________________

竹の内まり子

unread,
May 9, 2007, 9:26:27 PM5/9/07
to japan-jb...@lists.sourceforge.jp
竹の内と申します。

昨日は、その後会議に入ってしまいましてこんなにいっぱいの
フォローに驚いています。

皆様、ありがとうございます。

ジョブネットは高価なのでcronで処理するバッチです。
jbossとは同じサーバ上に配置する予定です。

なので、jbossのデータソースから取得を試みようと思っています。
ところで、JNDI名を変更したならばOLTP側のデータソース名も
変えなくてはならないのでしょうか?

よろしくお願いいたします。

竹の内まり子

大塚 玲子

unread,
May 9, 2007, 11:26:54 PM5/9/07
to japan-jb...@lists.sourceforge.jp
大塚です。

OLTPも使ってるんですね!
(って言いながら、OLTPって具体的に何のことだろう。。。)

OLTPからどのようにデータソースにアクセスしているかわかりませんが
データソース名(ex."DefaultDS")は同じでも良いはずですよ。
lookupするJNDI名は"java:/DefaultDS"ではなく"DefaultDS"にしないと
いけないと思いますが。

ちょっと古いですが、Forum見つけました。
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=69360

Scottさんもanti-patternだと言ってますし、やはり、DriverManagerの
ほうが良くないですか?
DriverManagerならJBoss稼動していなくてもだいじょうぶですよ。

どうなんでしょう???>みなさん

竹の内まり子

unread,
May 10, 2007, 2:28:40 AM5/10/07
to japan-jb...@lists.sourceforge.jp
竹の内です。

劉様もご指摘のようにアンチパターンですね。
ところで、これらは、他のアプリケーションサーバにも適用されるのでしょうか?

では質問を変えまして、
違うVMからJBOSSのSessionBeanを呼び出す方法は?
これもしたことが無いもので、、、

すみませんがよろしくお願いします。

Fusayuki Minamoto

unread,
May 10, 2007, 9:16:03 AM5/10/07
to japan-jb...@lists.sourceforge.jp
竹の内さん

FAQです。

http://wiki.jboss.org/wiki/Wiki.jsp?page=AccessEJBsRemotely

Googleで"jboss jndi.properties"を検索すれば日本語の記事やブログも見つかります

Miki
----- Original Message -----

----

_______________________________________________

竹の内まり子

unread,
May 10, 2007, 9:47:57 PM5/10/07
to japan-jb...@lists.sourceforge.jp
Miki様、

>FAQです。
>http://wiki.jboss.org/wiki/Wiki.jsp?page=AccessEJBsRemotely
>Googleで"jboss jndi.properties"を検索すれば日本語の記事やブログも見つか
>ります

とのことで、
@Stateless
public class HelloBean implements HelloRemote {
public HelloBean () {
}
public String sayHello() {
return "Hello";
}
}
@Remote
public interface HelloRemote {
public String sayHello();
}
JMX-CONSOLEでは
Jboss.j2ee
●jar=HelloModule.jar,name=HelloBean,service=EJB3
そこで
public class TestHello {


public static void main(String [] args) {

Properties props = new Properties();
props.put("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory);

props.put("java.naming.provider.url","jnlp://localhost:1099");
props.put("java.naming.factory.url.pkgs","org.jboss.naming:org.inp.interfaces");
InitialContext context = new InitialContext(props);
HelloRemote remote =
(HelloRemote)context.lookup(HelloRemote.class.getName());
String s = remote.sayHello();
}
}
としたところ、
Exception in thread "main" javax.naming.NameNotFoundException:
mariko.ejb.module1.HelloRemote not bound
(以下省略)

なぜでしょうか?

Fusayuki Minamoto

unread,
May 11, 2007, 9:54:51 PM5/11/07
to japan-jb...@lists.sourceforge.jp
竹の内さん

私は前のメールでGoogleで関連URLを探す方法を書きましたが
何か調べましたか?

jndi.propertiesを使っていない理由はなぜでしょう。
InitialContextにプロパティを渡すより簡単なのですが。

ソースは一から自分で書いたものでしょうか。
どこかで公開されていたものを修正したものでしょうか。

ソースを見るとEJB3を使っているようですね。
そんなこと前のメールには書いてありませんでしたよ。

JBossは初めてですか?
EJB2は経験があるけど、EJB3が初めてということでしょうか。

で、一番重要な、あなたの環境は?
http://www.hyuki.com/writing/techask.html#env

もし原因がJBoss側、つまり、JBossサーバー側のバグ等の問題
が原因だとしたら、JBossのバージョン情報なしに、どうやって
アドバイスをしたらよいのでしょうか。

こういったことを、メールでチャットのように手探りで想像しながら
返信するのでは、竹の内さんの本当に困っていることに誰も到達できません。

まず、整理をお願いします。

Miki

----- Original Message -----
>Date: Fri, 11 May 2007 10:47:57 +0900
>From: 竹の内まり子 <t.ma...@k8.dion.ne.jp>
>To: japan-jb...@lists.sourceforge.jp

----

_______________________________________________

竹の内まり子

unread,
May 12, 2007, 8:09:19 AM5/12/07
to japan-jb...@lists.sourceforge.jp
竹の内と申します。

ご指摘ありがとうございます。
jndi.propertyを使わない理由は特にはございません。

JBOSSは初めてです。
EJBは初めてではございません。

ときに、
context.lookup("HelloBean");
とすると、org.jnp.interfaces.NamingContextが返されます。

お手ほどきのほど、よろしくお願いします。

Fusayuki Minamoto

unread,
May 13, 2007, 9:27:19 AM5/13/07
to japan-jb...@lists.sourceforge.jp
竹の内さん

私の書いた前のメール[jjbug-jboss 14]をちゃんと読んでませんね。
ちょっと返信を書く気力も失せました。これで最後とさせてください。

あなたの質問は、比喩で例えれば、「ファイルをreadしたときFileNotFound
エラーが出ました。どうしてですか」と同等のレベルです。

ファイルのWriteに失敗しているか、Readのときのファイル名が間違っている
のどちらかだと気がつけば、それぞれの箇所をチェックすればよいでしょう。

竹の内さんの問題に戻ると、EJBのJDNI Lookupに失敗している場合、
・EJBのデプロイに失敗している
・Lookupに使ったJNDI名がデプロイしたものと合っていない
のどちらのケースがほとんどでしょう。

デプロイに失敗しているかどうかはデバッグログを確認する。
デプロイに成功しているなら、JNDIにEJBが登録されていることを確認する。
次に、それがLookupした名前と一致していることを確認する、という手順に
なります。

前の私のメールで「環境はなにか?」と質問したのは、JBoss EJB3の初期実装
ではJNDIのバインディングの方法が現在と異なっていたと思うからです。
JBossやEJB3のバージョンくらいは教えてもわらなければ、相談の乗りようも
ありません。

EJB3の最新版を使っているのであれば、せめて、EJB3のチュートリアルくらい
自分で調べてみてください。

http://docs.jboss.org/ejb3/app-server/tutorial/jndibinding/jndi.html

このチュートリアルを動かして、自分のプログラムと比較する。
まずはそこからでしょう。

では、Good Luck!

Miki
----- Original Message -----
>Date: Sat, 12 May 2007 21:09:19 +0900
>From: 竹の内まり子 <t.ma...@k8.dion.ne.jp>
>To: japan-jb...@lists.sourceforge.jp
>Subject: [jjbug-jboss 15] Re:
> jboss の sessionbean を他 VM から呼び出し方 (was Re: jboss のデータソースを
java アプリから使えますか )
>
>

----

_______________________________________________

竹の内まり子

unread,
May 14, 2007, 10:36:15 AM5/14/07
to japan-jb...@lists.sourceforge.jp
Miki様、

厳しいご指摘ありがとうございます。
ちなみに利用しているのは4.2.0CR2です。

単に不思議に思ったのは
クライアント側で(HelloTest.javaとします)

public class HelloTest {
@EJB
private static HelloRemote hello;
}
では何故だめなのか?
という点でございました。

Reply all
Reply to author
Forward
0 new messages