設定の上書き

グローバルデフォルト​​として機能する設定内のパラメーターでは、他の操作およびソースで使用されるデフォルト値または動作を指定します。そのパラメーターの値を上書きするアプリケーション内のコンポーネントの場合、​@ConfigOverride​ を使用できます。

設定の上書きとは?

この機能は、ソースまたは操作からのパラメーターを設定内のパラメーターにバインドします。パラメーターに ​@ConfigOverride​ のアノテーションが付加されていて DSL でその値が指定されていない場合、​完全に​同じ名前のパラメーターの設定値が挿入されます。

@ConfigOverride​ アノテーションは、操作メソッドの引数またはソースの項目に適用できます。ただし、設定や接続には使用できません。

たとえば、設定内でパラメーターが次のように宣言されているとします。

@Parameter
@Optional(defaultValue = "10")
int maxRetries;

また、上記の設定が次の操作で使用されているとします。

public void request(@Config ConfigType config, @ConfigOverride int maxRetries)
  // ...
}

上記の ​request​ 操作の ​maxRetries​ パラメーターは、いくつかの方法でその値を受け取ることができます。

  • maxRetries​ パラメーター設定で指定されたデフォルト値は、操作および設定 (下記の XML を参照) が ​maxRetries​ の値を​提供しない​ときに使用される。

    <extension:config name="sampleConfig">
    
    <flow name="requestFlow">
      <extension:request config-ref="sampleConfig">
    </flow>

    操作では、​maxRetries​ パラメーターは ​10​ のデフォルト値を取得します。

  • 設定 (下記を参照) の ​maxRetries​ に指定された値は、パラメーターの値が操作で指定されず、設定内で明示的に指定されているときに使用される。

    <extension:config name="sampleConfig" maxRetries=2>
    
    <flow name="requestFlow">
       <extension:request config-ref="sampleConfig">
    </flow>

    操作では、​maxRetries​ は値 ​2​ を取得します。

  • 操作の ​maxRetries​ パラメーターに指定された値は、このパラメーターが DSL に明示的に追加されたときに使用される。

    <extension:config name="sampleConfig" maxRetries=2>
    
    <flow name="requestFlow">
       <extension:request config-ref="sampleConfig" maxRetries=5>
    </flow>

    操作では、​maxRetries​ パラメーターは値 ​5​ を取得します。

この機能は、設定で指定された値を変更しません。設定値をパラメーターに挿入するか、指定された値を保持するだけです。

設定の上書き要件

設定パラメーターを上書きするための要件はいくつかあります。

  • 設定のパラメーターの名前と型は、​@ConfigOverride​ のアノテーションが付加されているものと同じ必要がある。

  • 操作に ​@ConfigOverride​ のアノテーションが付加されたパラメーターがある場合、パラメーターとして対応する設定も含まれる必要がある。

  • ソースに ​@ConfigOverride​ のアノテーションが付加された項目がある場合、項目として対応する設定も含まれる必要がある。

パラメーターグループ内の設定の上書きパラメーター

このアノテーションは、次のように設定内の ​ParameterGroup​ に属する ​Parameter​ を参照するためにも使用できます。

public class ConfigType{

  @ParameterGroup(name = "Strategy")
  private RetryStrategy retryStrategy;

  // ... Parameter getters
}
public class RetryStrategy{

  @Parameter
  private int maxRetries;

  @Parameter
  private String retriesExhaustedMessage;

  // ... Parameter getters
}

この操作は、​RetryStrategy​ クラス内の ​maxRetries​ を参照する ​@ConfigOverride​ を使用します。

public void request(@Config ConfigType config, @ConfigOverride int maxRetries)
  // ...
}

POJO を使用した設定の上書き

設定で、POJO であるパラメーターを上書きできます。操作またはソース内の POJO パラメーターのコンテンツは、設定によって完全に定義されるか、操作によって完全に定義されます。つまり、部分的に入力された POJO を定義し、残りの POJO に設定値が挿入されることは期待できません。

使用する値を決定するロジックは、単純な Java 型の場合と同じです。

デフォルト値のない設定パラメーター

省略可能な設定パラメーターにはデフォルト値がないため、​@ConfigOverride​ でそれを参照する操作またはソースパラメーターでは、その値はデフォルトで null になります。

次の例のパラメーターは、設定内で宣言されています。

@Parameter
@Optional
private String retriesExhaustedMessage;

次の例では、操作に設定パラメーターと設定の上書きパラメーターがあります。

public void request(@Config ConfigType config, @ConfigOverride String retriesExhaustedMessage)
  // ...
}

設定および操作で ​retriesExhaustedMessage​ が指定されていない場合、その値は null になります。

設定の上書き例

このセクションでは、​@ConfigOverride​ を使用した簡単な例を示します。

設定の定義は次のとおりです。

@Configuration(name = "config")
@Operations({AmqpConsume.class, AmqpPublish.class, AmqpPublishConsume.class, })
public class AmqpConfig {

  @Parameter
  @Expression(NOT_SUPPORTED)
  @Optional(defaultValue = "*/*")
  private String contentType;


  @Expression(NOT_SUPPORTED)
  @ParameterGroup(name = "Consumer Config", showInDsl = true)
  private AmqpConsumerConfig consumerConfig;


  // ... All parameter getters

}

次の例では、​AmqpConsumerConfig​ クラスに ​@ConfigOverride​ アノテーションによって参照されるパラメーターがあります。

public final class AmqpConsumerConfig {

  @Parameter
  @Optional(defaultValue = "IMMEDIATE")
  @Expression(NOT_SUPPORTED)
  private AckMode ackMode;

  @Parameter
  @Optional(defaultValue = "false")
  @Expression(NOT_SUPPORTED)
  private boolean noLocal;

  @Parameter
  @Optional(defaultValue = "false")
  @Expression(NOT_SUPPORTED)
  private boolean exclusiveConsumers;

  @Parameter
  @Optional(defaultValue = "4")
  @Expression(NOT_SUPPORTED)
  private int numberOfConsumers;

  // ... All parameter getters
}

次のソースには、​AmqpConfig​、および ​ConfigOverride​ アノテーションが付加されたパラメーターがあります。

@Alias("listener")
@EmitsResponse
@MetadataScope(outputResolver = AmqpOutputResolver.class)
public class AmqpListener extends Source<Object, AmqpMessageAttributes> {


  @Connection
  private ConnectionProvider<AmqpTransactionalConnection> connectionProvider;

  private AmqpTransactionalConnection connection;

  @Config
  private AmqpConfig config; (1)

  @Parameter
  private String queueName;

  @Parameter
  @ConfigOverride
  private AckMode ackMode; (2)

  @Parameter
  @ConfigOverride
  private int numberOfConsumers; (2)

  @Parameter
  @Optional
  private String consumerTag;


  @Override
  public void onStart(SourceCallback<Object, AmqpMessageAttributes> sourceCallback) throws MuleException {
    // ...
  }
  // ...
  @Override
  public void onStop() {
    // ...
  }
  // ...
}
1 @ConfigOverride​ アノテーションが付加されたパラメーターを上書きする値を指定する設定。
2 操作で指定されていないパラメーターは、​完全に​同じ名前のパラメーターの設定値を継承します。これらの名前のパラメーターは ​ParameterGroup​ に属します。

次の例は、上書きの動作を示しています。

<amqp:config name="config">
 <amqp:connection host="localhost" port="5671" virtualHost="/" username="guest" password="guest"/>
 <amqp:consumer-config numberOfConsumers="16" /> (1)
</amqp:config>

<flow name="amqpStatisticsListen">
  <amqp:listener config-ref="config" queueName="statisticsQueue" numberOfConsumers="1"/> (2)
  <!-- process statistics -->
  <logger level="INFO" message="#[payload]"/>
</flow>
1 設定では、​numberOfConsumers​ は ​16​ に明示的に設定されていますが、​ackMode​ はデフォルト値を取得します。
2 ソースでは、​numberOfConsumers​ が指定されているため、値 ​1​ を取得します。​ackMode​ は指定されていないため、設定からの値 ​IMMEDIATE​ を取得します。