Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Spring Shellの使い方

Naka Sho
November 27, 2024
11

Spring Shellの使い方

Spring Shellの使い方

Naka Sho

November 27, 2024
Tweet

Transcript

  1. 目次 Spring Batchとは 01 02 03 04 05 Spring Shellとは

    なぜシンプルなのか? Spring Shellの使い方 まとめ
  2. Spring Batchとは 特徴 処理の流れを定型化する機能 タスクレットモデル シンプルな処理 自由に処理を記述する方式である。SQLを1回発行するだけ、コマンドを発行す るだけ、といった簡素なケースや 複数のデータベースやファイルにアクセスし ながら処理するような複雑で定型化しにくいケースで用いる。

    チャンクモデル 大量データを効率よく処理 一定件数のデータごとにまとめて入力/加工/出力する方式。データの入力/ 加工/出力といった処理の流れを定型化し、 一部を実装するだけでジョブが実 装できる。 ジョブの管理 実行状況の永続化、データ件数を基準にしたリスタートなどを可能にする。
  3. Spring Batchとは Spring Batch @Bean public Job outputUserDataJob() { return

    jobBuilderFactory.get("outputUserData") .start(outputUserDataStep()) .build(); } @Bean public Step outputUserDataStep() { return stepBuilderFactory.get("outputUserDataStep") .tasklet(fileProcessingTasklet()) // -> タスクレットの場合 .reader(reader()) // -> チャンクモデルの場合 .processor(processor()) // -> チャンクモデルの場合 .writer(writer()) // -> チャンクモデルの場合 .build(); }
  4. Spring Batchとは タスクレット @Bean public Tasklet fileProcessingTasklet() { Files .lines(Paths.get(inputPath))

    // ItemReader .map(line -> String.join(",", line.parts[0], line.parts[1].toUpperCase(), line.parts[2])) // ItemProcessor .forEach(processedLine -> Files.write(Paths.get(outputPath), processedLine.getBytes())); // ItemWriter }
  5. Spring Batchとは チャンクモデル @Bean public FlatFileItemReader<User> reader() { return new

    FlatFileItemReaderBuilder<User>() .name("userItemReader") .resource(new FileSystemResource("input.csv")) .delimited() .names(new String[]{"id", "name", "email"}) .targetType(User.class) .build(); } @Bean public ItemProcessor<User, User> processor() { return user -> user.setName(user.getName().toUpperCase()); } @Bean public FlatFileItemWriter<User> writer() { return new FlatFileItemWriterBuilder<User>() .name("userItemWriter") .resource(new FileSystemResource("output.csv")) .delimited() .names(new String[]{"id", "name", "email"}) .build(); }
  6. Spring Shellとは 概要 Spring Shell プロジェクトのユーザーは、Spring Shell jar に依存し、独自のコマンド (Spring

    Bean のメソッドとして提供される) を追加することで、フル機能のシェル (別名、コ マンド ライン) アプリケーションを簡単に構築できます。 コマンド ライン アプリケーションを作成すると、プロジェクトの REST API と対話したり、 ローカル ファイル コンテンツを操作したりするときに便利です。
  7. Spring Shellとは 特徴 カスタムコマンドを提供するための、シンプルで注釈駆動型のプログラミングモデル コマンドプラグイン戦略の基礎として Spring Boot の自動構成機能を使用する タブ補完、カラー化、スクリプト実行 コマンドプロンプト、シェル履歴ファイル名、結果とエラーの処理のカスタマイズ

    ドメイン固有の基準に基づいたコマンドの動的な有効化 Bean検証APIとの統合 画面クリア、ゴージャスヘルプ、終了などの組み込みコマンド 書式設定、配置、装飾的な境界線などを備えた ASCII アート テーブル。
  8. Spring Shellとは どちらかというとSpring Webに近い Controller -> Service -> Repository のController部分のアノテーションが変わるイメージ

    @Controller,@RestController,@RequestMapping -> @Command(command = "xxx") @RequestParam -> @Option 引数 @Operation -> @Description 概要 (Springdoc-openapi)
  9. Spring Shellとは 先ほどのSpring Batchの例をSpring Shellで実装 @Command public class MyCommands {

    @Command(command= "outputUserData") @Description(desc = “ユーザーデータの作成”) public void mycommand(@Option String userId) throws IOException { Files .lines(Paths.get(inputPath)) // ItemReader .map(line -> String.join(",", line.parts[0], line.parts[1].toUpperCase(), line.parts[2])) // ItemProcessor .forEach(processedLine -> Files.write(Paths.get(outputPath), processedLine.getBytes())); // ItemWriter } }
  10. Spring Shellの使い方 最新ではデフォルトで非対話モード // 非対話モードで必要だったコード @Component @Order(InteractiveShellApplicationRunner.PRECEDENCE - 1) public

    class NonInteractiveRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { InteractiveShellApplicationRunner.disable((configurableEnvironment)); final Object evaluate = shell.evaluate(() -> String.join(" ", args.getSourceArgs())); if (evaluate != null) { System.out.println(evaluate); } } }
  11. Spring Shellの使い方 helpでコマンド一覧が出てくる @Command(command = "user-create", description = "ユーザーを作成するコマンド") public

    String createUser( @Option(shortNames = 'n', longNames = "name", description = "ユーザー名") String name, @Option(shortNames = 'a', longNames = "age", description = "ユーザーの年齢") Integer age ) {} @Command(command = "database-connect", description = "データベースに接続するコマンド") public String connectDatabase( @Option(shortNames = 'h', longNames = "host", description = "データベースホスト") String host, @Option(shortNames = 'p', longNames = "port", description = "データベースポート") Integer port ) {}
  12. Spring Shellの使い方 helpでコマンド一覧が出てくる Available commands: user-create ユーザーを作成するコマンド -n, --name ユーザー名

    -a, --age ユーザーの年齢 database-connect データベースに接続するコマンド -h, --host データベースホスト -p, --port データベースポート
  13. Spring Shellの使い方 helpでコマンド一覧が出てくる > user-create --help Command: user-create Description: ユーザーを作成するコマンド

    Arguments: name String ユーザー名 age Integer ユーザーの年齢 Options: -n, --name ユーザー名 -a, --age ユーザーの年齢
  14. まとめ Spring Shell 使い方簡単でしたよね? Spring Batchとは全くの別物 どちらかというとSpring Webに近い @Controller,@RestController,@RequestMapping ->

    @Command(command = "xxx") @RequestParam -> @Option 引数 @Operation -> @Description 概要 (Springdoc-openapi) デフォルトで非対話モード アノテーションに変更有(旧も使えます) helpでコマンド一覧を出せる