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

                             

                            以上