2016-08-10 12 views
1

具体的な方法はありますか?私はここで解決策を見つけようとしましたが、必要なものを見つけることができませんでした。私は、コマンドラインから複数の引数を受け付けるSpringブートアプリケーションを持っています。問題の引数はキュー名(つまり宛先)です。私たちの多くのキューのうちの1つになることができます。 JmsListenerは、私は基本的にこの@ JmsListenerの宛先パラメタの値を渡して使用する

public class Arguments { 
private static queue 
private static antoherArg 
: 
: 
getters and setters 
} 

のように見え、私がdestination = Arguments.getQueue()で言いたいクラスを持っているフォーム

@JmsListener(destination="dest_goes_here") 
public void processOrder(Message message){. . .} 

であるが、destinationだけstatic final変数ことができそうですか?私は、エラーがそのことを暗示する小さなツールチップを提示するので、これを仮定します。

私はobvioulsy定数が含まれていることをConstantsと呼ばれるさらに別のクラスを持っているように、そしてpublic static final String QUEUE = "MyQ";としてIハードコードキュー名は、それはそれでokですdestination = Constants.QUEUE言うならば、私はまた、それをテストしました。

それで、私はリスナークラスでこのようなことをすることができると仮定しました。private static final String QUEUE = Arguments.getQueue();しかし、どちらも好きではありません。ああ、私は困惑しています。

だから誰かが知識共有に喜んでいるなら、ここには本当に2つの質問があります。なぜ@JmsListenerdestinationが私の2番目の解決策に設定されていますが、最初と最後ではありません。

次に、コマンドラインからの変数(つまり動的なもの)に目的地を設定するためにどのような戦略をとることができますか?

編集:値をコマンドラインから取得し、destinationとして使用するJmsListenerクラスに渡す必要があるため、明示するために、Constantsクラスの値を保持できません。

答えて

2

これはJavaの仕組みであり、destinationはコンパイル時の定数式でなければならず、関数の呼び出しは1つではありません。 the official language specification for more detailsをご覧ください。 編集:this answerもご覧ください。

2番目(さらに重要な)質問が出る限り、私はいくつかの提案をしています。

まず、コンフィグレーションプロパティからdestination="${jms.queue.name1}"のキュー名を読み取ることができます。ここで、jms.queue.name1はコンフィグレーションプロパティです。その後、Springブートを使用しているので、コマンドライン引数を使用して設定プロパティをオーバーライドできます(externalized configuration documentation for more details参照)。こうすれば、実行時に--jms.queue.name1=fooのようにコマンドライン引数として渡すことで、キュー名を指定することができます。

第二に、あなたはprogrammatic listener registrationを使用することができ、そのよう:

@Configuration 
@EnableJms 
public class AppConfig implements JmsListenerConfigurer { 

    @Override 
    public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) { 
     SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint(); 
     endpoint.setId("myJmsEndpoint"); 
     endpoint.setDestination(Arguments.getQueue()); 
     endpoint.setMessageListener(message -> { 
      // processing 
     }); 
     registrar.registerEndpoint(endpoint); 
    } 
} 
+0

ああ、私はそれが春のジャワ自体としない仕様だった認識に失敗しました。私はこれらのうちの1つを行って、それがどのようになっているかを見て、非常に有望であるように見えるでしょう。 –

+0

最小限の労力を要するので、まずプロパティを試してみることをおすすめします。 –

+0

私の誤解から苦労していくつかのコードを移動し、 'PropertySourcesPlaceholderConfigurer' beanクラスを設定する必要がありましたが、プロパティ提案のオーバーライドは魅力的に機能しました。ありがとう。 –

関連する問題