いくつか Azure 向けの Spring ライブラリを紹介してきましたが、今回はそのまとめです。必要な事は全て以下に書いてあると思います。
Azure Spring Boot
その名の通り、Spring Boot 用のライブラリ群です。基本的に、Spring Boot 2.2/2.3/2.4 に対応しています。
対応しているサービスは、主な物を上げると以下の通り。
- Active Directory / Active Directory B2C
- Cosmos DB
- Key Vault (Secret/Certificate)
- サービスバス
- ストレージ(BLOB)
また、最新版は、以下のような作りになっています。
- バージョンが、3.0 以降
- 名前空間が
com.microsoft.azure
からcom.azure.spring
- Artifact Id が
azure-spring-boot-starter-*
で統一
たまにSDK間で依存関係の不具合がおきたりするので、dependencyManagement
でBOMを指定しましょう。Spring Initializr で作ると、ちゃんと埋め込まれています。BOMとは依存関係のバージョンをしたりすると特殊なPOMらしいです。
Maven Repository: com.azure.spring » azure-spring-boot-bom
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-boot-bom</artifactId>
<version>${azure.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
これに当てはまらないものは、すでに Deprecated になっているライブラリもありますので、使い始める際には注意したほうがよいです。
MSのドキュメントは更新が追いついていないせいか、古いライブラルを紹介している場合も多いので、原文(英語)を確認したり、Githubを当たった方が最新の情報を得られると思います。
Azure Spring Cloud
Spring Cloud は、マイクロサービスベースのアプリを構築するために容易されたフレームワークです。Boot用というわけではなく、Spring アプリともシームレスに統合されているものです。
あまり強調しませんでしたが、以前に説明したKey Vault はBoot用、App Configuration は Cloud用のライブラリです。いまいちどのあたりに、その区切りとなる判断基準があるかわからないのですが、Key Vault だってマイクロサービスで使うでしょうに。
対応しているサービスは、主な物を上げると以下の通り。
- キャッシュ(Azure Redis)
- イベントハブ
- サービスバス トピック&キュー
- ストレージキュー
また、最新版は、以下のような作りになっています。
- バージョンは、2.0 以降
- 名前空間が
com.microsoft.azure
からcom.azure.spring
- Artifact Id が
azure-spring-cloud-*
または、azure-spring-integration-*
で統一
個別にサンプルが用意されているので、試してみると良いと思います。
キュー連携を試してみる
試しに、azure-spring-cloud-starter-storage-queue
を試してみます。Azure Functionsにキュートリガーがあるので、こちらの使いごこちはどのような物かという単なる興味からです。
生のキュークライアントをDIする代わりに、のStorageQueueOperation
を介してキューのオペレーションをスルみたいです。
PostがメンドウだったのでGetでエンキューしていますが、sendAsync
でエンキュー、
receiveAsync
でデキューしています。
チェックポイントクラスで、成功の可否を判定しているのですが、これがどういた意味をなしているかはちょっと分らなかったです。
@Autowired
StorageQueueOperation storageQueueOperation;
@GetMapping("/push")
public String send(@QueryParam("message") String message) {
this.storageQueueOperation
.sendAsync(STORAGE_QUEUE_NAME, MessageBuilder.withPayload(message).build())
.subscribe();
LOGGER.info("Message {} has been sent successfully.", message);
return message;
}
@GetMapping("/pull")
public String receive() {
this.storageQueueOperation.setMessagePayloadType(String.class);
this.storageQueueOperation.setCheckpointMode(CheckpointMode.MANUAL);
Message<?> message = this.storageQueueOperation.receiveAsync(STORAGE_QUEUE_NAME).block();
if (message == null) {
LOGGER.info("You have no new messages.");
return null;
}
LOGGER.info("Message arrived! Payload: " + message.getPayload());
Checkpointer checkpointer = message.getHeaders().get(AzureHeaders.CHECKPOINTER, Checkpointer.class);
checkpointer.success()
.doOnSuccess(Void -> LOGGER.info("Message '{}' successfully checkpointed", message.getPayload()))
.doOnError(e -> LOGGER.error("Fail to checkpoint the message", e))
.subscribe();
return (String) message.getPayload();
}
まとめ
日々変化しているので、数ヶ月前の状況が古くなっていることが多いのですが、一次情報(Github)を当たれば、ソースも公開されていますし、サンプルもありますし、何かあればIssue切れますし、便利な世の中だなと思っている今日この頃です。こまったら、ソース見ましょう。