# Azure 向け Spring ライブラリまとめ


いくつか Azure 向けの Spring ライブラリを紹介してきましたが、今回はそのまとめです。必要な事は全て以下に書いてあると思います。

https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/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](https://mvnrepository.com/artifact/com.azure.spring/azure-spring-boot-bom)

```xml
  <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` でデキューしています。

チェックポイントクラスで、成功の可否を判定しているのですが、これがどういた意味をなしているかはちょっと分らなかったです。
    
```java

    @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切れますし、便利な世の中だなと思っている今日この頃です。こまったら、ソース見ましょう。