Spring AMQP学習のRabbiitAdmin
目次
公式の住所 4.1.11.Configling the Broker
ラビイトAdminはどんなキャラクターですか?
AmqpAdminはどのインターフェースを定義しましたか?
デフォルト実装クラスRabitAdmin
ラビットAdmin設定により、ステートメント異常および傍受異常情報を無視する
rabbitAdminでHeaders Exchangeを設定します.
JAVAでAMQPベースの骨格を設定する
1.6作成者モードのキューとスイッチを提供しています.
一括宣言コンポーネント
条件付き宣言(非起動宣言)
公式の住所 4.1.11.Configling the Broker
まとめてみますと、AmqpAdminインターフェースは、queues、exchanges、and bindings on the brook erをどのように配置するかを定義しています.
AmqpAdminはどのインターフェースを定義しましたか?
spring xmlに基づく構成:
デフォルトの場合、
rabbitAdminでHeaders Exchangeを設定します.
JAVAでAMQPベースの骨格を設定する
デフォルトでは、すべてのqueuesが、 exchanges、and bindingsは全部で
公式の住所 4.1.11.Configling the Broker
ラビイトAdminはどんなキャラクターですか?
AmqpAdminはどのインターフェースを定義しましたか?
デフォルト実装クラスRabitAdmin
ラビットAdmin設定により、ステートメント異常および傍受異常情報を無視する
rabbitAdminでHeaders Exchangeを設定します.
JAVAでAMQPベースの骨格を設定する
1.6作成者モードのキューとスイッチを提供しています.
一括宣言コンポーネント
条件付き宣言(非起動宣言)
公式の住所 4.1.11.Configling the Broker
RabbitAdmin ?
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);
}
デフォルト実装クラスRabitAdminspring 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を通じて(通って)影射してはいけません.