10 Replies Latest reply: Apr 1, 2012 10:56 PM by nakamura takuya RSS

AS7でJNDIを指定:EJB 2.1を使用して移動すること

nakamura takuya Newbie

いつもお世話になっております。

何度も質問申し分けございません。

 

JBoss7.1.0 Final移行について質問させていただきます。


現況といたしましては、
WebLogicからJBossAS7へのマイグレーションを実施しております。

 

 

現在の問題・課題点は、
WebLogic用の資産をJBossAS7に載せ替えをしようとしていて、

デプロイまでは進んでおりますが、実際にEJBをlookupする際のHomeインターフェイス名が
既存資産が意図するJNDI名と全然違うGlobalJNDI名でデプロイされて
しまうため、lookupを行おうとしているすべての個所をJBossAS7用に
書き換えしなくてはならないことを懸念しております。

 

開発ガイド
https://docs.jboss.org/author/display/AS7/How+do+I+migrate+my+application+from+AS5+or+AS6+to+AS7

 

の、「Update application JNDI namespace names」の章を見ると、
GlobalJNDIに書き換えよとの記述があるものの、対象資産が膨大に
あるので、どうしても避けて通れないのだと思うのですが、

 

参考記事
https://community.jboss.org/thread/171998

 

を見る限りでは、jboss-ejb3.xml等関連するXMLファイルの記述にて
lookupする際のHomeインターフェイス名として、移行前の旧Homeインターフェイス名
に読み換えを行ってくれるような仕組みが存在しているような気がするのですが
この記事自体が、議論中な状態という風に見えますので、実際そういう実装に
なったのかどうか?という風にも見えますが、

そもそもJNDI名の付与自体もAPサーバーのミドルによって
まちまちであるという情報も一般に目にします。

 

理想的には、アプリ資産のポータビリティー維持も踏まえて考えますと、
名前の読み換えの仕組みはあってしかるべきと考えますが、

皆さんはこういう問題に直面した場合、どう対処をお考えになりますか?

 

 

些細なことでも結構です。ご意見いただけたらと思います。

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

  • 1. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    TANABE Junnichi Newbie

    なかむらさん:

    田邉です。

     

    参考記事の方法でできませんでしたか?

  • 2. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    nakamura takuya Newbie

    田邉様

     

    早速の返答ありがとうございます。

     

     

     

    参考記事の方法でできませんでしたか?

     

    参考記事同様にjboss-ejb3.xmlを作成しまして、lookupをかけたところname not found になってしまいました。

    lookupの際、取得名に不足があったのか、lookupのさせ方に問題があるのかもしれませんが・・・。

     

  • 3. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    TANABE Junnichi Newbie

    なかむらさん:

     

    EJB に jboss-ejb3.xml を置いたのでしょうか? war 側に置いたのでしょうか?

     

    もう少し情報が欲しいです。

  • 4. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    nakamura takuya Newbie

    田邉様

     

    返信ありがとうございます。

     

    jboss-ejb3.xml はejb-jar.xmlと同じ場所で配置しております。

    META-INFの配下です。

     

     

  • 5. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    TANABE Junnichi Newbie

    なるほど・・・

     

    sed か何かで一括変換で対応するという方向は難しいのですか?

  • 6. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    nakamura takuya Newbie

    田邉様

     

    返信ありがとうございます。

     

     

    sed か何かで一括変換で対応するという方向は難しいのですか?

     

    おっしゃる通りです。

    ・・・ができれば既存資産を変更せずに対応したいと考えております。

    申し訳ございません。

     

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

     

  • 7. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    nakamura takuya Newbie

    補足なのですが・・・

     

    既存の資産を変更したくない理由としては、WebLogicでもJBossでもどちらでも

    動作するようにしたいためです。

     

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

  • 8. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    Takayoshi Kimura Novice

    ・・・ができれば既存資産を変更せずに対応したいと考えております。

    これは難しいですね。基本的にJava EEコンテナは「アプリケーションのデプロイメントディスクリプタは変更可能」という前提で作られています。アプリケーションがまったく変更不可能、というシナリオは考えられていません。

     

    ejb-refを使っているならデプロイメントディスクリプタを、コンテナ依存グローバルJNDIをソースコードから直接使っているならソースコードを変更することになると思います。ServiceLocatorパターンを利用しているのであればソースコード一ヶ所変更などで済むケースや、JNDI名がプロパティファイルで変更可能になっているようなケースもあるでしょう。このへんはアプリケーションを作成した人がどれだけポータビリティを考慮していたかに依存します。

     

    http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html

     

    ポータビリティの無い既存資産を移行する場合どうしてもこのようなコストがいろいろ発生するのが悩みどころですね。Java EE 6からはポータブルJNDI名がありますし、そもそもインジェクションが使えるのでJNDIルックアップは利用せず、このような問題は発生しません。

  • 9. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    Takayoshi Kimura Novice
    http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html

    java.sun.com が最近死んでしまったので見れなくなってますね。代わりの情報は "ServiceLocator" でグーグル検索してください。

  • 10. Re: AS7でJNDIを指定:EJB 2.1を使用して移動すること
    nakamura takuya Newbie

    Takayoshi Kimura 様

     

     

    返信ありがとうございます。

     


    本来ですと、オンコーディングでJNDI名を持たせるというのは甚だ問題であると存じますが、
    現状がそのやり方でリリースされてしまっているので、ユーザー側からするとそれを変更する
    のは、物凄い抵抗を感じられるようなので、色々検討いたしまして

    1つの一例として、下記の対応の方法も有効ではないかと思います。

     

    全体図

    EJBTEST-EARアプリケーション

     

    EJBTEST.ear

    EJB
    jp.co.company.TestService
       

    TEST.jarとしてアーカイブ

    WEB
    webapp/
    test1.jsp
    WEB-INF/
    jboss-web.xml
    web.xml
    lib/GYOMU.jar ・・・ このjar内から、"jp.co.company.TestService"のEJBをlookupしたい。(既存から修正していない)


    このJARはユーザー側が自由にいじってよいjarになり、ここの実装は基本変えたくなかったわけです。

    TESTWEB.warとしてアーカイブ

    lib/

    共通的な関数(lookupを行う処理等)
    COMMON.jar

    EJBは、
    java:app/TEST!jp.co.company.TestServiceHome
    という名前でデプロイされる。

    元々、WebLogicでは、jp.co.company.TestServiceでlookupしていたので、当然JNDI名が変わるから
    そのままではlookup不可。

    そこで、

    web.xmlに、

     

    <ejb-ref>
    <ejb-ref-name>jp.co.company.TestService</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <home>jp.co.company.TestServiceHome</home>
    <remote>jp.co.company.TestService</remote>
    </ejb-ref>

     

    の記述を加えました。
    ejb-ref-nameの部分に、元々lookupに使っていたJNDI名を指定。

    さらに、web.infと同じ場所にjboss-web.xmlを作成する。

     

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE jboss-app PUBLIC "-//JBoss//DTD Java EE Application 5.0//EN" "http://www.jboss.org/j2ee/dtd/jboss-app_5_0.dtd">
    <jboss-web>
    <ejb-ref>
    <ejb-ref-name>jp.co.company.TestService</ejb-ref-name>
    <jndi-name>java:app/TEST!jp.co.company.TestServiceHome</jndi-name>
    </ejb-ref>
    </jboss-web>

     

    とする。

    上記の対応を行うことで、当該のEJBは、ENC(Environment Naming Context)名でたどることが出来るように
    なりました。

    lib/
    共通的な関数(lookupを行う処理等)・・・ここはユーザーがいじれない部分。
    COMMON.jar
    の中で、lookupをしている処理を改造(ここで、ENC名として編集しlookupさせる)

    ENC名 = "java:comp/env/" + web.xmlで宣言しているejb-ref-name

    これを使って、lookup。

     

    結果・・・lookup出来るようになりました。

    今回の経験を踏まえると、アプリケーション側では固有のJNDIをじかに書くのはやめて、
    アプリケーションサーバー毎に結構バラバラでデプロイされる名前を吸収できる構造として
    作成するのが、望ましいと考えられます。

     

    参考サイト:http://www.atmarkit.co.jp/fjava/rensai3/jboss04/jboss04.html

     

    以上