[Apache Hop] ローコードでETL処理を実装してWebサービスにしてみた(非同期編)

# 紹介したいこと

Apaceh Hopでは、ローコードで実装した処理をWebサービスとして外部に公開できることを、前回に紹介しました。

https://qiita.com/Tadataka_Takahashi/items/b2eab05086ac6a449f3d

続いて、**時間のかかる処理**を呼び出すための**非同期処理(async)のWebサービス**の実装方法について紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/dc6ec219-311e-ed79-d0a1-56f8eac0fd11.png)
- Apaceh Hopで処理の流れ(Workflow)を定義します。Async Web Serviceとして、その処理を登録します。
- ① Webサービスでサービス名を指定して呼び出すことで実行することができます。このときに渡したいデータをJSONなどで渡すこと(Post)ができます。
- ② 実行している処理の状態をクエリして確認することができます。このときには、サービス名とIDを指定して呼び出します。

# 対象者
- Apache Hop (データ統合プラットフォーム) を使ってみたいかた。データ収集、変換処理をしたいかた。
- **ローコードでETL処理を実装してWebサービス**を作成したい方。
- **長い時間のかかる処理**を呼び出したいかた。


# 前提環境
- Apache Hopの環境を構築している
- Webサービス(同期処理)を試したことある
現時点(2022/05/07時点)で最新であるApache Hop 1.2.0を例として説明します。

https://qiita.com/Tadataka_Takahashi/items/f13161b981a8699f46ff

https://qiita.com/Tadataka_Takahashi/items/58f69ceb466a5c3a295a

# 手順の流れ
- 変換処理を定義する
- Webサービスとして公開する
- 動作を確認する

## 変換処理(Workflow)を定義する
- Hop GUIを起動してWorkflowを新規作成します。以下のようなWorkflowを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/b12a9a6e-da25-6784-f5c1-110d17435d04.png)

- GetPostData.hplではPostしたデータを取得することを試しました。Postしたデータは、変数に格納できます。以下の例では変数ASYNC_CONTENTに格納して、Get variablesで取得してText file outputでファイルに出力してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/83a824cb-c08e-6839-64c7-171fc4109b9a.png)

- テストのためWait forでは20秒待機するように定義しました。

## Webサービスとして公開する
- Hop GUIのMetadataタブを開き、Asynchronous Web Serviceを右クリックしてNewで定義を作成します。

- AsyncWebという名前でサービスを定義して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c984e188-e9e5-2278-2cfe-12096950aa1d.png)

Name: Webサービス名前を定義します。
Enabled?: チェックを有効にします。
Filename: 上記で作成したWorkflowのファイルを指定します。
Content variable: ASYNC_CONTENT Postしたデータを格納する変数名

## 動作を確認する
コマンドプロンプトでcurlコマンドでWebサービス(AsyncWeb)を呼び出し非同期処理を実行します。
```
curl -v --user cluster:cluster --request POST 
-o async-run.json -H "Content-Type: application/json" 
--data-binary "@document.json" 
"http://localhost:8181/hop/asyncRun/?service=AsyncWeb&MAX=50000000"
```
サービス名は、AsyncWebを指定しています。
Postしたいjsonデータのファイル(document.json)を指定しています。

async-run.jsonに実行結果が出力されます。以下のidで処理が登録されました。
```
{"name":"dataload","id":"63b824b6-da7f-46ba-8219-e049ac69f1d6"}
```

以下のコマンドを実行して上記で実行した非同期処理の状態を確認します。
```
curl --user cluster:cluster --request GET "http://localhost:8181/hop/asyncStatus/?service=AsyncWeb&id=63b824b6-da7f-46ba-8219-e049ac69f1d6"
```

以下のレスポンスが返ってきます。
```
{
  "service" : "AsyncWeb",
  "id" : "63b824b6-da7f-46ba-8219-e049ac69f1d6",
  "logDate" : "2022-05-07T07:29:58.506+0000",
  "startDate" : "2022-05-07T07:26:52.204+0000",
  "endDate" : "2022-05-07T07:27:12.414+0000",
  "statusDescription" : "Finished",
  "statusVariables" : { },
  "pipelineStatuses" : [ ]
}
```

hop Serverにアクセスすると、登録した非同期処理の状態を確認できます。
http://localhost:8181
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/463bccb7-4b1b-e81d-ca04-a13bcf966ec5.png)

# まとめ
- ローコードで時間のかかるETL処理を実装して、非同期Webサービスとして公開することをためしてみました。このWebサービスの機能は、Apache Hopの特徴の機能の1つとなります。
- もしも、興味をもっていただき詳細を知りたい場合には、公式のWebページを参照ください。

# 参考

https://hop.apache.org/manual/latest/hop-server/async-web-service.html#top