クラス JdbcChannelMessageStore

java.lang.ObjectSE
org.springframework.integration.jdbc.store.JdbcChannelMessageStore
実装されたすべてのインターフェース:
InitializingBeanLifecyclePhasedSmartLifecycleBasicMessageGroupStoreChannelMessageStorePriorityCapableChannelMessageStore

@ManagedResource public class JdbcChannelMessageStore extends ObjectSE implements PriorityCapableChannelMessageStore, InitializingBean, SmartLifecycle

JDBC を介したリレーショナルデータベースを使用した BasicMessageGroupStore のチャネル固有の実装。

このメッセージストアはメッセージチャネルにのみ使用されます。

そのため、JdbcChannelMessageStore はデータベース固有の SQL クエリを使用します。

JdbcMessageStore に反して、この実装はキューのように動作するように最適化された単一のデータベーステーブルを使用します。テーブルを作成するための SQL スクリプトは org/springframework/integration/jdbc/schema-*.sql にパッケージされています。* はターゲットデータベース型を示します。

このクラスは SmartLifecycle を実装し、start()getMessageGroupCount() を呼び出して、必要なテーブルが DB に存在するかどうかを確認します。テーブルが存在しない場合、アプリケーションコンテキストは起動できません。このチェックは setCheckDatabaseOnStart(boolean) を介して無効にすることができます。

導入:
2.2
作成者:
Gunnar Hillert, Artem Bilan, Gary Russell, Meherzad Lahewala, Trung Pham, Johannes Edmeier
  • フィールドの詳細

    • DEFAULT_REGION

      public static final StringSE DEFAULT_REGION
      メッセージストアを分割するために使用されるデフォルトのリージョンプロパティ。例: チャネル名が重複している別の Spring Integration アプリケーションは、個別のリージョン名を指定することにより、同じメッセージストアを使用できます。
      関連事項:
    • DEFAULT_TABLE_PREFIX

      public static final StringSE DEFAULT_TABLE_PREFIX
      テーブルプレフィックスプロパティのデフォルト値。
      関連事項:
  • コンストラクターの詳細

  • メソッドの詳細

    • setDataSource

      public void setDataSource(DataSourceSE dataSource)
      データベースと対話するときに使用する JDBC DataSourceSE。渡された DataSourceSE は、JdbcTemplate.setFetchSize(int) が 1 に設定され、JdbcTemplate.setMaxRows(int) が 1 に設定された JdbcTemplate をインスタンス化するために使用されます。
      パラメーター:
      dataSource - DataSourceSE
    • setDeserializer

      public void setDeserializer(Deserializer<? extends Message<?>> deserializer)
      バイト配列をメッセージにデシリアライズするためのコンバーター。
      パラメーター:
      deserializer - 設定するデシリアライザー
    • addAllowedPatterns

      public void addAllowedPatterns(StringSE... patterns)
      逆直列化できるパッケージ / クラスのパターンを追加します。クラスは完全修飾することも、クラス名の最初または最後にワイルドカード "*" を使用することもできます。例: com.foo.**.MyClass
      パラメーター:
      patterns - パターン。
      導入:
      5.4
    • setJdbcTemplate

      public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
      データベースと対話するときに使用する JdbcOperations。このプロパティまたは dataSource のいずれかを設定できます。fetchSize プロパティが 1 の JdbcTemplate を渡すことを検討してください。これは、Oracle が先入れ先出し (FIFO) メッセージ取得特性を保証するために特に重要です。
      パラメーター:
      jdbcTemplate - JdbcOperations
    • setLobHandler

      public void setLobHandler(LobHandler lobHandler)
      SQL クエリで大きなオブジェクトを作成および解凍するために使用される LobHandler をオーバーライドします。ほとんどすべてのプラットフォームでデフォルトで問題ありませんが、一部の Oracle ドライバーにはネイティブ実装が必要です。
      パラメーター:
      lobHandler - LobHandler
    • setMessageRowMapper

      public void setMessageRowMapper(MessageRowMapper messageRowMapper)
      カスタム MessageRowMapper の受け渡しを許可します。MessageRowMapper は、永続化されたメッセージを表す選択されたデータベース行を実際の Message オブジェクトに変換するために使用されます。
      パラメーター:
      messageRowMapper - null であってはなりません
    • setPreparedStatementSetter

      public void setPreparedStatementSetter(ChannelMessageStorePreparedStatementSetter preparedStatementSetter)
      ChannelMessageStorePreparedStatementSetter を設定して、メッセージをデータベースに挿入します。
      パラメーター:
      preparedStatementSetter - 使用する ChannelMessageStorePreparedStatementSetter。null であってはなりません
      導入:
      5.0
    • setChannelMessageStoreQueryProvider

      public void setChannelMessageStoreQueryProvider(ChannelMessageStoreQueryProvider channelMessageStoreQueryProvider)
      使用するデータベース固有の ChannelMessageStoreQueryProvider を設定します。JdbcChannelMessageStore は、データベースからメッセージを取得するための SQL クエリを提供します。フレームワークによって提供される実装を確認するには、JavaDocs ChannelMessageStoreQueryProvider(すべての既知の実装クラス)を参照してください。

      追加のデータベースをサポートする必要がある場合、および / または要件に合わせてクエリを微調整する必要がある場合は、独自のクエリ実装を提供できます。

      パラメーター:
      channelMessageStoreQueryProvider - null であってはなりません。
    • setRegion

      public void setRegion(StringSE region)
      このストアで保持されるすべてのメッセージの一意のグループ化識別子。複数のリージョンを使用すると、さまざまな目的でストアを(必要に応じて)パーティション化できます。デフォルトは DEFAULT_REGION です。
      パラメーター:
      region - 設定する領域名
    • getRegion

      public StringSE getRegion()
      設定された現在のリージョン、またはデフォルトの DEFAULT_REGION を返します。
      戻り値:
      設定された領域名
      導入:
      6.0
    • setSerializer

      public void setSerializer(Serializer<? super Message<?>> serializer)
      メッセージをストレージ用のバイト配列に直列化するためのコンバーター。
      パラメーター:
      serializer - 設定するシリアライザー
    • setTablePrefix

      public void setTablePrefix(StringSE tablePrefix)
      テーブルプレフィックスプロパティのパブリック setter。これは、クエリが実行される前にすべてのテーブル名の前に付けられます。デフォルトは DEFAULT_TABLE_PREFIX です。
      パラメーター:
      tablePrefix - 設定する tablePrefix
    • setUsingIdCache

      public void setUsingIdCache(boolean usingIdCache)

      複数の並列スレッドを使用してデータベースをトランザクションでポーリングする場合、つまり、構成済みのポーラーがタスクエグゼキューターを使用して構成されている場合は、このプロパティの使用を検討してください。

      課題は、pollMessageFromGroup(Object) が指定されたチャネル (groupKey) と領域 (setRegion(String)) の最も古いエントリを検索することです。これを複数のスレッドで実行し、トランザクションを使用している場合、他のスレッドが同じロックされた行を待機している可能性があります。

      提供されている OracleChannelMessageStoreQueryProvider を使用する場合は、usingIdCache を true に設定しないでください。Oracle クエリはロックされた行を無視するためです。

      JdbcChannelMessageStore は、ID キャッシュを使用して、処理中、各メッセージ ID をメモリ内コレクションに格納します。これにより、ポーリングスレッドは、それらのメッセージをポーリングから明示的に除外します。

      これを機能させるには、対応する TransactionSynchronizationFactory を設定する必要があります。

       
       <int:transaction-synchronization-factory id="syncFactory">
           <int:after-commit   expression="@jdbcChannelMessageStore.removeFromIdCache(headers.id.toString())" />
           <int:after-rollback expression="@jdbcChannelMessageStore.removeFromIdCache(headers.id.toString())" />
       </int:transaction-synchronization-factory>
       
       
      この TransactionSynchronizationFactory は、ポーラーのトランザクション構成で参照されます。
       
       <int:poller fixed-delay="300" receive-timeout="500"
           max-messages-per-poll="1" task-executor="pool">
           <int:transactional propagation="REQUIRED" synchronization-factory="syncFactory"
               isolation="READ_COMMITTED" transaction-manager="transactionManager" />
       </int:poller>
       
       
      パラメーター:
      usingIdCache - true の場合、ID キャッシュが使用されます。
    • setPriorityEnabled

      public void setPriorityEnabled(boolean priorityEnabled)
      このストアでの優先処理を有効にします。
      パラメーター:
      priorityEnabled - 優先処理が有効かどうか。
    • isPriorityEnabled

      public boolean isPriorityEnabled()
      次で指定:
      インターフェース PriorityCapableChannelMessageStoreisPriorityEnabled 
      戻り値:
      このチャネルメッセージストアでメッセージ優先度が有効になっている場合は true。
    • setMessageGroupFactory

      public void setMessageGroupFactory(MessageGroupFactory messageGroupFactory)
      MessageGroupFactory を指定して、必要な場所に MessageGroup オブジェクトを作成します。デフォルトは SimpleMessageGroupFactory です。
      パラメーター:
      messageGroupFactory - 使用する MessageGroupFactory
      導入:
      4.3
    • getMessageGroupFactory

      protected MessageGroupFactory getMessageGroupFactory()
      MessageGroupFactory を返します。
      戻り値:
      MessageGroupFactory
    • afterPropertiesSet

      public void afterPropertiesSet()
      必須プロパティ ( DataSourceSE および setChannelMessageStoreQueryProvider(ChannelMessageStoreQueryProvider) ) を確認してください。setMessageRowMapper(MessageRowMapper) および setPreparedStatementSetter(ChannelMessageStorePreparedStatementSetter) を使用して MessageRowMapper および ChannelMessageStorePreparedStatementSetter がそれぞれ明示的に設定されていない場合は、指定された deserializer および lobHandler を使用してデフォルトの MessageRowMapper および ChannelMessageStorePreparedStatementSetter がインスタンス化されます。また、jdbcTemplate の fetchSize プロパティ ( JdbcTemplate.getFetchSize() ) が 1 でない場合、警告がログに記録されます。JdbcChannelMessageStore を Oracle とともに使用する場合、ポーリングされたメッセージの FIFO 特性を保証するために、fetchSize の値が 1 である必要があります。詳細については、Oracle ChannelMessageStoreQueryProvider を参照してください。
      次で指定:
      インターフェース InitializingBeanafterPropertiesSet 
    • setCheckDatabaseOnStart

      public void setCheckDatabaseOnStart(boolean checkDatabaseOnStart)
      開始時にデータベースチェッククエリを実行するかどうかのフラグ。
      パラメーター:
      checkDatabaseOnStart - データベースチェックを実行しない場合は false。
      導入:
      6.2
    • isAutoStartup

      public boolean isAutoStartup()
      次で指定:
      インターフェース SmartLifecycleisAutoStartup 
    • start

      public void start()
      次で指定:
      インターフェース Lifecyclestart 
    • stop

      public void stop()
      次で指定:
      インターフェース Lifecyclestop 
    • isRunning

      public boolean isRunning()
      次で指定:
      インターフェース LifecycleisRunning 
    • addMessageToGroup

      public MessageGroup addMessageToGroup(ObjectSE groupId, Message<?> message)
      メッセージをデータベースに保存します。groupId は、メッセージを保存するチャネルを識別します。実際の groupId (チャネル識別子) は、文字列ベースの UUID 識別子に変換されることに注意してください。
      次で指定:
      インターフェース BasicMessageGroupStoreaddMessageToGroup 
      パラメーター:
      groupId - メッセージを保存するグループ ID
      message - メッセージ
      戻り値:
      メッセージグループ。
    • getMessageGroup

      public MessageGroup getMessageGroup(ObjectSE groupId)
      完全には使用されていません。指定されたグループ ID のみをラップします。
      次で指定:
      インターフェース BasicMessageGroupStoregetMessageGroup 
      パラメーター:
      groupId - グループ識別子。
      戻り値:
      メッセージのグループ。このキーにメッセージが存在しない場合は空です。
    • getMessageGroupCount

      @ManagedAttribute public int getMessageGroupCount()
      構成済みリージョンのストア内のメッセージグループの数を返します。
      戻り値:
      メッセージグループの数。
    • getQuery

      protected StringSE getQuery(org.springframework.integration.jdbc.store.JdbcChannelMessageStore.Query queryName, SupplierSE<StringSE> queryProvider)
      入力のパターンを置き換えて、有効な SQL クエリを生成します。この実装は、単純なマップベースのキャッシュを遅延して初期化し、名前付きクエリへの最初のアクセスでテーブルプレフィックスのみを置き換えます。後続のアクセスはキャッシュから解決されます。
      パラメーター:
      queryName - 変換される JdbcChannelMessageStore.Query
      queryProvider - クエリテンプレートを提供するサプライヤー。
      戻り値:
      置換を伴う変換されたクエリ。
    • messageGroupSize

      @ManagedAttribute public int messageGroupSize(ObjectSE groupId)
      指定されたチャネル ID (groupId) および指定されたリージョン (setRegion(String)) に保存されているメッセージの数を返します。
      次で指定:
      インターフェース BasicMessageGroupStoremessageGroupSize 
      パラメーター:
      groupId - グループ識別子。
      戻り値:
      メッセージグループのサイズ。
    • removeMessageGroup

      public void removeMessageGroup(ObjectSE groupId)
      インターフェースからコピーされた説明: BasicMessageGroupStore
      この ID のメッセージグループを削除します。
      次で指定:
      インターフェース BasicMessageGroupStoreremoveMessageGroup 
      パラメーター:
      groupId - 削除するグループの ID。
    • pollMessageFromGroup

      public Message<?> pollMessageFromGroup(ObjectSE groupId)
      チャネル識別子を表す特定のグループ ID に対して永続化される新しいメッセージについて、データベースをポーリングします。
      次で指定:
      インターフェース BasicMessageGroupStorepollMessageFromGroup 
      パラメーター:
      groupId - グループ識別子。
      戻り値:
      メッセージ。
    • doPollForMessage

      protected Message<?> doPollForMessage(StringSE groupIdKey)
      このメソッドは、DB への呼び出しを実行して、JdbcChannelMessageStore のコンテキストではチャネル識別子を意味する MessageGroup で最も古いメッセージを取得します。
      パラメーター:
      groupIdKey - メッセージグループ(チャネル)ID の文字列表現
      戻り値:
      メッセージ ; クエリがメッセージを生成しなかった場合は null になる可能性があります
    • removeFromIdCache

      public void removeFromIdCache(StringSE messageId)
      idCache からメッセージ ID を削除します。トランザクションが成功またはロールバックされたら、メッセージ ID キャッシュからメッセージを削除するには、Spring Integration トランザクション同期機能と組み合わせて使用する必要があります。setUsingIdCache(boolean)true に設定されている場合にのみ適用されます。
      パラメーター:
      messageId - メッセージ識別子。
    • getSizeOfIdCache

      @ManagedMetric public int getSizeOfIdCache()
      現在処理中のメッセージのメッセージ ID をキャッシュするメッセージ ID キャッシュのサイズを返します。
      戻り値:
      メッセージ ID キャッシュのサイズ