12

いくつか検索しましたが、サンプル/例が見つかりませんでした。

1 つのテーブル (入力) から地理座標を読み取り、処理して、座標に関連付けられた POI を生成するという要件があります。そのため、1 つの地理座標によって 1 つ以上の POI が生成され、別のテーブル (出力) に挿入する必要があります。

現在、JdbcCursorItemReader と JdbcBatchItemWriter を使用して、1 つの項目/レコードを読み取り、1 つの項目/レコードを書き込みます。指定された地理座標の POI を生成する ItemProcessor もあります。

カスタム JdbcBatchItemWriter はこれを達成するのに役立ちますか?

何か案は?ティア。

4

4 に答える 4

10

あなたが本当に探しているのはスプリッターパターンと呼ばれるものです:

ここに画像の説明を入力

Spring Integrationでの定義方法は次のとおりです。

スプリッターは、入力チャネルからメッセージを受け入れ、そのメッセージを複数のメッセージに分割し、それぞれを出力チャネルに送信するメッセージ エンドポイントの一種です。これは通常、「複合」ペイロード オブジェクトを分割されたペイロードを含むメッセージのグループに分割するために使用されます。

構成は非常に簡単です。

<channel id="inputChannel"/>

<splitter id="splitter" 
  ref="splitterBean" 
  method="split" 
  input-channel="inputChannel" 
  output-channel="outputChannel" />

<channel id="outputChannel"/>

<beans:bean id="splitterBean" class="sample.PojoSplitter"/>

または、注釈を使用できます。

@Splitter
List<LineItem> extractItems(Order order) {
    return order.getItems()
}

JdbcBatchItemWriterもちろん、もっと簡単に感じたら、自分で書くこともできます。ただし、Spring Integration はすでにそれを行っています。

Spring Integration JDBC Support => jdbc:inbound-channel-adapter/および上記のスプリッターを使用jdbc:outbound-channel-adapterして、必要なものと..シンプルさを実現できます。

于 2011-10-26T02:01:38.927 に答える
6

アイテムを別のライターに拡散したい(重複した出力を読み取る)場合は、既存のCompositeItemWriterを使用できます。

ただし、プロセッサがさまざまなアイテムタイプを生成するのか、1つの複雑なアイテムタイプのコンテンツを複数のライターに分散するのかはわかりません。そのような場合は、マルチラインレコードライターの質問に少し変更したバージョンを使用できます。

public class MultiOutputItemWriter implements ItemWriter<Object> {

private JdbcBatchItemWriter<ClassFoo> delegateFoo;
private JdbcBatchItemWriter<ClassBar> delegateBar;

public void write(List<? extends Object> items) throws Exception {
       // if you have different types of items
       // check Object Class
       // add to new List<Classfoo>
       // call delegate e.g. delegateFoo.write(List with ClassFoo);
       //
       // or if you have complex objects
       // same procedure as above, but with
       // add to new List<Classfoo> with item.getClassFoo
 }
}

FlatFileItemWriterを使用する場合は、デリゲートをItemStreamsとして登録することを忘れないでください(Spring Batchがデリゲートを開いたり閉じたりします)。

于 2011-10-25T20:00:40.753 に答える
1

これは、Writer クラス (私の場合は HibernateItemWriter) を拡張することで実現しました。「スプリッター」の使用方法を説明している回答が1つあります。spring-boot-starter-parent を使用する環境でそれがどのように機能するかの実例があれば、ぜひ見てみたいです。私がやっていること (単一のレコードからリストを作成する) については、Spring がリストのリストを処理する書き込みメソッドを提供すれば、はるかに簡単になります。

読み取り/処理される行ごとに複数の書き込みを処理するようにWriterを拡張する方法は次のとおりです。

于 2015-01-05T23:07:12.127 に答える
0

同様のケースがあり、次の再利用可能なコードで解決できました。

@Slf4j
public class ListItemWriter<T> implements ItemWriter<List<T>> {

  private ItemWriter<T> delegate;

  @Setter private int chunkSize = 0;

  public ListItemWriter(ItemWriter<T> delegate) {
    this.delegate = delegate;
  }

  @Override
  public void write(List<? extends List<T>> items) throws Exception {
    if (chunkSize == 0) {
      chunkSize = items.size();
    }
    List<T> allItems = items.stream().flatMap(Collection::stream).collect(Collectors.toList());
    log.info("writing {} items", allItems.size());
    List<List<T>> partitions = ListUtils.partition(allItems, chunkSize);
    for (List<T> partition : partitions) {
      delegate.write(partition);
    }
  }
}

リーダー: A
プロセッサ: A -> List<B>
ライター: new ListItemWriter(ItemWriterForB)

于 2022-01-31T11:53:56.973 に答える