2016-01-28 3 views
6

私のMDBの1つの構成情報を含むejb-jar.xmlがあります。私のプロジェクトをビルドし、パッケージ化し、その後、私は、ユーザーが別のサーバーアドレスを持っているように、この値を変更することができることを確認できるようにする必要があるユーザーにオフに分散されたようGlassFish 4.0でのデプロイ時のejb-jar.xmlの構成プロパティの変更

<activation-config-property> 
     <activation-config-property-name>addressList</activation-config-property-name> 
     <activation-config-property-value>mq://test.server.uk:7676</activation-config-property-value> 
</activation-config-property> 

:そこで はの構成があります。

現在、プロパティファイルにアドレスを設定するオプションがあります。とにかく、プロパティ値を持つglassfish 4.0の配備中にこのxmlを変更できるかどうか

もし私が誰かがアプリケーションを望んでそれを再構築するたびに値を設定しなければならないのでしょうか?

ユーザーがプロパティファイルでサーバーアドレスを設定できるように、動的に設定する必要があるその他の設定については公開しています。

+2

'@ ActivationConfigProperty'で注釈が付けられたMDBを使用して、あなたは[実行時にMDBクラス定義の注釈文字列パラメータを変更できますか?](http://stackoverflow.com/questions/14268981/modify-a-class -definitions-annotation-string-parameter-at-runtime)? – aribeiro

+0

注釈内の値を変更できるようにするには、「@ActivationConfigProperty」を使用してください。私はそれが可能であることを認識していませんでした。 – Softey

+1

ビル・バークの[[実施例7-3](http://docs.oracle.com/cd/E21764_01/web.1111/e15493/annotations.htm#WLMDB10008)に示され、次に使用されるような 'ActivationConfigProperty' @を使用アプローチ](http://bill.burkecentral.com/2008/01/14/scanning-java-annotations-at-runtime/)でアノテーションをスキャンすると、問題が解決する可能性があります。 – aribeiro

答えて

0

glassfish 4.0のアドレスリストを変更する簡単な方法が見つかりました。この解決策はあなたの@ActivationConfigPropertyの残りの部分を引き続き使用することを可能にします。私にとっては、ユーザがインストール用のセットアップスクリプトを使用する場合、私は次のコマンドを実行できます。

asadmin server.jms-service.type = REMOTE 

asadmin set configs.config.server-config.jms-service.jms-host.default_JMS_host.host= 
"testserver.test.te.uk" 

asadmin restart-domain 

あなたはデフォルトJMSホストに定義されたアドレスを使用するようにブローカーを伝え、その後REMOTEこれを入力するには、デフォルトJMSホストを設定します。

次に、ホストアドレスをasadmin setコマンドで設定します。

これが完了したら、グラスフィッシュを再起動する必要があります。

これは明らかにグラスフィッシュの容器に依存していますが、これは私が必要とするものです。

+0

あなたのクライアントのアプリケーションサーバーの設定を変更しても構いませんでした。あなたの質問は、コードベースのソリューションだけを探していたようなものでした – kolossus

3

試してみることの1つは、実行時に@AroundConstructインターセプタを使用してMDBの値を設定することです。 ejb-jar.xmlにプレースホルダを使用することは可能ですが、それは主にコンテナに依存していることに注意してください。Glassfishの特定の仕組みに関する読書の欠如は、あなたの心配の源になるはずです。別に不幸な必要性から

public class AddressListInterceptor { 

    @AroundConstruct 
    private void begin(InvocationContext iCtxt) { 

     /**load your property prior to this point */ 


     ActivationConfigProperty addressList = new ActivationConfigProperty{ 

                public String propertyName(){ 
                return "addressList"; 
                } 
                public String propertyValue(){ 
                return theAddressList; 
                } 

           public Class<? extends Annotation> annotationType(){ 
             return ActivationConfigProperty.class; 
            }     

               }; 

      try { 
       /**get the annotations, with the intention of adding yours (addressList) to the array using the method demonstrated in 
        http://stackoverflow.com/a/14276270/1530938 */ 
       Annotations[] annotations = iCtxt.getClass().getAnnotations(); 

       iCtxt.proceed(); //this will allow processing to continue as normal 
      } catch (Exception ex) { 

      } 
    } 

をスキャンするために、あなたのインターセプタを定義

@MessageDriven 
@Interceptors(AddressListInterceptor.class) 
public class YourMDB 
  • と注釈を変更します。

    1. があなたのMDBにインターセプタを定義しますのは、これを試してみましょうあなた自身が、このアプローチがあなたを購入するのは、あなたがMDBのライフサイクルに入り、 Beanがintantiatedされる直前の注釈の値。 Beanを稼働させるまでには、設定した値がすべて使用されます。

  • +0

    私は、MDBを実際のMDBに適合させるためのあなたの例がどこにあるのか分かりません。アノテーションを使用して注入に関する小さな例を提供できますか? – Softey

    +0

    私はあまりにも早く話したように見えます。何らかの理由で、私はあなたが消費者ではなくメッセージプロデューサーを書いていると仮定しました。実際に注釈をつける以外の方法はありません。私のアップデート@Softeyを参照してください。 P.S.このソリューションをここで利用できるようになったことをここで確認することが重要です。もしそうでなければ、私はこのページの土地を他の誰かに誤解させないように答えを削除する必要があります – kolossus

    +0

    これは@kolossusの仕組みがわかりません。 addressListプロパティを介して接続されているプロデューサからメッセージを受け取った後にのみ開始されるステートレスBean(MDB)から、インターセプタをどのように設定しますか?私はシングルトンのために働いてこのことを理解するであろうが、AroundConstruct' @ステートレスMDB – Softey

    関連する問題