Spring AMQP学習のRabbiitAdmin

10578 ワード

目次
 
公式の住所 4.1.11.Configling the Broker
ラビイトAdminはどんなキャラクターですか?
AmqpAdminはどのインターフェースを定義しましたか?
デフォルト実装クラスRabitAdmin
ラビットAdmin設定により、ステートメント異常および傍受異常情報を無視する
rabbitAdminでHeaders Exchangeを設定します.
JAVAでAMQPベースの骨格を設定する
1.6作成者モードのキューとスイッチを提供しています.
一括宣言コンポーネント
条件付き宣言(非起動宣言)
公式の住所 4.1.11.Configling the BrokerRabbitAdmin ?AMQP仕様では、どのようにqueues,exchanges,and bindings on the brookを構成するかを指定しています.この部分の動作はorg.springframe ebork.amqp.comパッケージの下のAmqpAdmin ( 0.8 ), RabbiitMQで表現されています.  org.springfraamew ork.amqp.rabit.com包下的RabbitAdmin .
まとめてみますと、AmqpAdminインターフェースは、queues、exchanges、and bindings on the brook erをどのように配置するかを定義しています.RabbitAdminはこのインターフェースを実現し、具体的な操作をしました.すなわちRabbitAdminの役割は、キュー、スイッチのbrookにおけるバインディング関係を宣言することである.
AmqpAdminはどのインターフェースを定義しましたか?
public interface AmqpAdmin {

    // Exchange Operations
    //      
    void declareExchange(Exchange exchange);
    //      
    void deleteExchange(String exchangeName);

    // Queue Operations
    /**
      *    ,        
      *      exclusive=true, autoDelete=true, and durable=false
      */
    Queue declareQueue();

    /**
      *            
      * name          AnonymousQueue,         uuid  ,
      * durable=false,exclusive=true,autoDelete=true
      * 2.1  ,       x-queue-master-locator   client-local
      */
    String declareQueue(Queue queue);
    //    
    void deleteQueue(String queueName);
    //    
    void deleteQueue(String queueName, boolean unused, boolean empty);
    //    
    void purgeQueue(String queueName, boolean noWait);

    // Binding Operations
    //    
    void declareBinding(Binding binding);
    //    
    void removeBinding(Binding binding);
    /**      
     *    count    count ...
     */
    Properties getQueueProperties(String queueName);

}
デフォルト実装クラスRabitAdmin
spring xmlに基づく構成:


CachingConnectionFactory CHANNEL ,RabbitAdmin applicationContext ( broker ) , 。ラビットAdmin設定により、ステートメント異常および傍受異常情報を無視する
デフォルトの場合、RabbitAdmin 異常が発生した時には、すべてのコンポーネントの声明を直接停止します.これは、1つのキューの声明が異常に後続のキューの声明に影響を与えます.このような状況を回避するために、RabbitAdmin ignore-declaration-exceptionsをtrueに設定することができ、この設定はRabitAdminに異常ログを印刷してから他の要素を宣言することができる.javaでは、この属性keyはignoreDeclaration Exceptionsであり、異常発生時にDeclaration Exception Eventイベントを発表します.このイベントはApplicationEventです. タイプのものは、容器中のApplicationListenerを通過することができます. を用いて傍受を行い、イベントソースにはadminのマッピング、声明の要素及び投げ出しの異常が含まれている.
rabbitAdminでHeaders Exchangeを設定します.

    
        
            
                
                
                
            
        
    
1.6以降、rabitAdminを通じてスイッチをinternal ( false), true ,RabbitMq , exchange-to-exchange bindingにセットすることができます.このようにすれば、他の人がこのスイッチにメッセージを発表する心配がないです.
JAVAでAMQPベースの骨格を設定する
@Configuration
public abstract class AbstractStockAppRabbitConfiguration {

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory =
            new CachingConnectionFactory("localhost");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        return connectionFactory;
    }

    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());
        template.setMessageConverter(jsonMessageConverter());
        configureRabbitTemplate(template);
        return template;
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public TopicExchange marketDataExchange() {
        return new TopicExchange("app.stock.marketdata");
    }

    // additional code omitted for brevity

}
Abstract StockApRabitConfigrationに基づいて配置されたserver端配置.プロジェクト起動時に自動声明TopicExchange およびQueue ,server端にバインドされていないTopicExchange Queue, client ,server 。
@Configuration
public class RabbitServerConfiguration extends AbstractStockAppRabbitConfiguration  {

    @Bean
    public Queue stockRequestQueue() {
        return new Queue("app.stock.request");
    }
}
Abstract StockApRabitConfigrationに基づいて配置されたclient端配置
@Configuration
public class RabbitClientConfiguration extends AbstractStockAppRabbitConfiguration {

    @Value("${stocks.quote.pattern}")
    private String marketDataRoutingKey;

    /**
      *   AmqpAdmin declareQueue      
    @Bean
    public Queue marketDataQueue() {
        return amqpAdmin().declareQueue();
    }

    /**
     *   market data exchange       routing key   
     */
    @Bean
    public Binding marketDataBinding() {
        return BindingBuilder.bind(
                marketDataQueue()).to(marketDataExchange()).with(marketDataRoutingKey);
    }

    // additional code omitted for brevity

}
1.6作成者モードのキューとスイッチを提供しています.
@Bean
public Queue queue() {
    return QueueBuilder.nonDurable("foo")
        .autoDelete()
        .exclusive()
        .withArgument("foo", "bar")
        .build();
}

@Bean
public Exchange exchange() {
  return ExchangeBuilder.directExchange("foo")
      .autoDelete()
      .internal()
      .withArgument("foo", "bar")
      .build();
}
2.2バージョンは建築者モードを最適化しました.
@Bean
public Queue allArgs1() {
    return QueueBuilder.nonDurable("all.args.1")
            .ttl(1000)
            .expires(200_000)
            .maxLength(42)
            .maxLengthBytes(10_000)
            .overflow(Overflow.rejectPublish)
            .deadLetterExchange("dlx")
            .deadLetterRoutingKey("dlrk")
            .maxPriority(4)
            .lazy()
            .masterLocator(MasterLocator.minMasters)
            .singleActiveConsumer()
            .build();
}

@Bean
public DirectExchange ex() {
    return ExchangeBuilder.directExchange("ex.with.alternate")
            .durable(true)
            .alternate("alternate")
            .build();
}
一括宣言コンポーネント
@Configuration
public static class Config {

    @Bean
    public ConnectionFactory cf() {
        return new CachingConnectionFactory("localhost");
    }

    @Bean
    public RabbitAdmin admin(ConnectionFactory cf) {
        return new RabbitAdmin(cf);
    }

    @Bean
    public DirectExchange e1() {
    	return new DirectExchange("e1", false, true);
    }

    @Bean
    public Queue q1() {
    	return new Queue("q1", false, false, true);
    }

    @Bean
    public Binding b1() {
    	return BindingBuilder.bind(q1()).to(e1()).with("k1");
    }

    @Bean
    public Declarables es() {
        return new Declarables(
                new DirectExchange("e2", false, true),
                new DirectExchange("e3", false, true));
    }

    @Bean
    public Declarables qs() {
        return new Declarables(
                new Queue("q2", false, false, true),
                new Queue("q3", false, false, true));
    }

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public Declarables prototypes() {
        return new Declarables(new Queue(this.prototypeQueueName, false, false, true));
    }

    @Bean
    public Declarables bs() {
        return new Declarables(
                new Binding("q2", DestinationType.QUEUE, "e2", "k2", null),
                new Binding("q3", DestinationType.QUEUE, "e3", "k3", null));
    }

    @Bean
    public Declarables ds() {
        return new Declarables(
                new DirectExchange("e4", false, true),
                new Queue("q4", false, false, true),
                new Binding("q4", DestinationType.QUEUE, "e4", "k4", null));
    }

}
2.2バージョンはDeclarablesにgetDeclarablesByTypeを追加しました. 方法は、listener containerを宣言する時にもっと便利です.
public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
        Declarables mixedDeclarables, MessageListener listener) {

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
    container.setQueues(mixedDeclarables.getDeclarablesByType(Queue.class).toArray(new Queue[0]));
    container.setMessageListener(listener);
    return container;
}
条件付き宣言(非起動宣言)
デフォルトでは、すべてのqueuesが、 exchanges、and bindingsは全部でRabbitAdminです. 例はaut-startup=「true」という形で容器内で宣言します.2.0.9以降、RabbitAdmin 新しい属性があります. (デフォルトfalse)この属性がtrueに設定されている場合、どのような宣言が明確にされているかを示すbeansのみになります.各要素はDeclarableを実現しています.Declarableには二つの方法があります.一つはexplicitDeclarationsOnlyです. ,一つはshouldDeclare()です.getDeclaringAdmins(),rabbitadmin bean。


















	
		
	
2.0バージョンが同時に一つの要素にidとnameを設置している場合、nameは別名として登録されません.もしqueueとexchangeを同じ名前に登録するなら、idを提供しなければなりません.nameが一つしかないなら、beanはbindingの時に依然としてnameを通じて(通って)影射することができて、もし名前の中でAELの表現によってならば、beanはbindingの時nameを通じて(通って)影射してはいけません.