2017-06-02 2 views
0

私は今、自分のプログラムが実行されているときに、データベース内のブール値フィールドを変更できる、rabbitmq、Spring、およびHibernateでプロジェクトを進めています。いつもSpringのrabbitmqキューを作成/バインドとアンバインド/削除する

trueの場合、私のプログラムは新しいキューを作成し、それに所定の交換をバインドします。

falseの場合、私のプログラムはキューをアンバインドして削除します。

しかし、私はすべて見ているチュートリアルはキューを作成するために、アノテーションを使用しているようだと、プログラムが最初に実行したときにバインディング:私の場合は、むしろ注釈を使用するよりも

import org.springframework.amqp.core.*; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Profile; 

@Profile({"tut3", "pub-sub", "publish-subscribe"}) 
@Configuration 
public class Tut3Config { 

    @Bean 
    public FanoutExchange fanout() { 
     return new FanoutExchange("tut.fanout"); 
    } 

    @Profile("receiver") 
    private static class ReceiverConfig { 

     @Bean 
     public Queue autoDeleteQueue1() { 
      return new AnonymousQueue(); 
     } 

     @Bean 
     public Queue autoDeleteQueue2() { 
      return new AnonymousQueue(); 
     } 

     @Bean 
     public Binding binding1(FanoutExchange fanout, 
      Queue autoDeleteQueue1) { 
      return BindingBuilder.bind(autoDeleteQueue1).to(fanout); 
     } 

     @Bean 
     public Binding binding2(FanoutExchange fanout, 
      Queue autoDeleteQueue2) { 
      return BindingBuilder.bind(autoDeleteQueue2).to(fanout); 
     } 

     @Bean 
     public Tut3Receiver receiver() { 
      return new Tut3Receiver(); 
     } 
    } 

    @Profile("sender") 
    @Bean 
    public Tut3Sender sender() { 
     return new Tut3Sender(); 
    } 
} 

を、私はそのようなインタフェースを実装する必要がありますAmqpAdminとして定義し、declareQueue()やdeleteQueueなどのメソッドを明示的に使用してキューを作成および削除できるようにしますか?

これが当てはまる場合、Springはこれらのメソッドを実装するプロジェクトで特定の場所を持っていますか?

ありがとうございました。

+0

フィルタベースのメッセージリスナーで1つのキューを使用しないのはなぜですか? –

答えて

1

あなたの例では、キュー豆autoDeleteQueue1autoDeleteQueue1はスコープシングルトンを使用して作成されているので、彼らは全体のアプリのライフサイクルのためのSpringコンテナの中に住んでいます。

キューBeanをより柔軟に処理する必要がある場合は、以下で説明するように、AmqpAdminのデフォルトの実装を使用できます。

このコードをいくつかのサービスまたはこのロジックを処理するクラスに入れることができます。そのサービスの中で、あなたはここでは、Javaを使用してRabbitMQのためのチュートリアルを見れば、あなたは#2#5チュートリアルを見つけるもnice article with nice examples

1

@Bean 
public ConnectionFactory connectionFactory() { 
    return new CachingConnectionFactory(); 
} 

@Bean 
public AmqpAdmin admin() { 
    return new RabbitAdmin(connectionFactory()); 
} 

@Bean 
public FanoutExchange fanout() { 
    return new FanoutExchange("tut.fanout"); 
} 

詳細はhere

を見つけることができます豆を配線しますあなたのケースに適用されます。

たとえば、キュ​​ーを作成するためにあなたがこれを使用することができます

ConnectionFactory factory = new ConnectionFactory(); 
factory.setHost("localhost"); 
Connection connection = factory.newConnection(); 
Channel channel = connection.createChannel(); 

channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null); 

が結合作成するには、この操作を行うことができます。

ConnectionFactory factory = new ConnectionFactory(); 
factory.setHost("localhost"); 
Connection connection = factory.newConnection(); 
Channel channel = connection.createChannel(); 

channel.exchangeDeclare(EXCHANGE_NAME, "topic"); 
String queueName = channel.queueDeclare().getQueue(); 

if (argv.length < 1) { 
    System.err.println("Usage: ReceiveLogsTopic [binding_key]..."); 
    System.exit(1); 
} 

for (String bindingKey : argv) { 
    channel.queueBind(queueName, EXCHANGE_NAME, bindingKey); 
} 

をお使いの場合には、基本的にあなたが明示的に作成したいですビーンを経由するのではなく、明示的にチャンネルを作成し、バインドします。

これらの操作のそれぞれは、サービスクラスで収集された独自のメソッドとすることができます。

次に、各メソッドの使用にサービスクラスを使用するだけで済みます。この方法で、いつでも作成/バインドできます。

関連する問題