Batch APIを使用すると、テンプレートから複数のインタラクティブな通信を作成できます。 テンプレートは、データを一切使用しないインタラクティブな通信です。 Batch APIは、データとテンプレートを組み合わせてインタラクティブな通信を行います。 このAPIは、インタラクティブ通信の大量生産に役立ちます。 例えば、電話料金、複数の顧客のクレジットカード明細などです。
Batch APIは、JSON形式のレコード(データ)およびフォームデータモデルから受け取ります。 インタラクティブ通信が生成される数は、設定されたフォームデータモデルの入力JSONファイルで指定されたレコードと等しくなります。 このAPIを使用して、印刷出力とWeb出力の両方を生成できます。 「印刷」オプションではPDFドキュメントが生成され、「WEB」オプションでは個々のレコードに対してJSON形式のデータが生成されます。
Batch APIは監視フォルダーと組み合わせて使用することも、スタンドアロンのRest APIとして使用することもできます。 Batch APIを使用するために、生成されるインタラクティブ通信のテンプレート、出力形式(HTML、PRINTまたはその両方)、ロケール、事前入力サービスおよび名前を設定します。
レコードと対話型通信テンプレートを組み合わせて、対話型通信を作成します。 Batch APIは、レコード(インタラクティブな通信テンプレートのデータ)をJSONファイルから、またはフォームデータモデルを介してアクセスされた外部データソースから直接読み取ることができます。 各レコードを個別のJSONファイルに保持するか、すべてのレコードを1つのファイルに保持するJSON配列を作成できます。
JSONファイル内の単一のレコード
{
"employee": {
"name": "Sara",
"id": 3,
"mobileNo": 9871996463,
"age": 37
}
}
JSONファイル内の複数のレコード
[{
"employee": {
"name": "John",
"id": 1,
"mobileNo": 9871996461,
"age": 39
}
},{
"employee": {
"name": "Jacob",
"id": 2,
"mobileNo": 9871996462,
"age": 38
}
},{
"employee": {
"name": "Sara",
"id": 3,
"mobileNo": 9871996463,
"age": 37
}
}]
APIを簡単に体験できるように、AEM FormsではBatch APIを使用するように設定されたWatched Folderサービスをすぐに使用できます。 AEM FormsUIを介してこのサービスにアクセスし、複数の対話型通信を生成できます。 また、必要に応じてカスタムサービスを作成することもできます。 次に示す方法を使用して、監視フォルダーとBatch APIを使用できます。
レコードと対話型通信テンプレートを組み合わせて、対話型通信を作成します。 レコードごとに個別のJSONファイルを作成するか、またはJSON配列を作成してすべてのレコードを単一のファイルに保持することができます。
JSONファイルに保存されたレコードからインタラクティブな通信を作成するには:
c:\batchprocessing
「詳細」タブを開き、次のカスタムプロパティを追加します。
プロパティ | 型 | 説明 |
---|---|---|
templatePath | String | 使用する対話型通信テンプレートのパスを指定します。 例:/content/dam/formsanddocuments/testsample/mediumic これは必須プロパティです。 |
recordPath | 文字列 | recordPathフィールドの値は、インタラクティブ通信の名前を設定するのに役立ちます。 レコードのフィールドのパスは、recordPathフィールドの値として設定できます。 例えば、/employee/Idを指定した場合、idフィールドの値は、対応する対話型通信の名前になります。 デフォルト値はランダムランダムUUIDです。 |
usePrefillService | ブール型 | 値をFalseに設定します。 usePrefillServiceパラメーターを使用すると、対応する対話型通信用に設定された事前入力サービスから取得したデータを使用して、対話型通信を事前入力できます。 usePrefillServiceがtrueに設定されている場合、(各レコードの)入力JSONデータはFDM引数として扱われます。 デフォルト値は false です。 |
batchType | 文字列 | 値をPRINT、WEBまたはWEB_AND_PRINTに設定します。 デフォルト値はWEB_AND_PRINTです。 |
locale | 文字列 | Outputのインタラクティブ通信のロケールを指定します。 標準搭載のサービスではロケールオプションを使用しませんが、カスタムサービスを作成してローカライズされたインタラクティブ通信を生成することができます。 デフォルト値はen_USです。 |
「作成」をタップします。監視フォルダーが作成されます。
外部データソースに保存されたデータ(レコード)を対話型通信テンプレートと組み合わせて、対話型通信を作成します。 インタラクティブな通信を作成する場合は、フォームデータモデル(FDM)を介して外部データソースに接続し、データにアクセスします。 外部データソースから同じフォームデータモデルを使用してデータを取得するように、監視フォルダーバッチプロセスサービスを設定できます。 外部データソースに保存されたレコードから対話型の通信を作成するには:
テンプレートのフォームデータモデルの設定:
インタラクティブ通信テンプレートに関連付けられたフォームデータモデルを開きます。
トップレベルモデルのオブジェクトを選択し、「プロパティを編集」をタップします。
「プロパティの編集」ペインの「サービスの読み取り」フィールドから、取得または取得サービスを選択します。
読み取りサービスの引数に使用する鉛筆アイコンをタップして、引数をリクエスト属性に連結し、連結値を指定します。 これにより、指定したバインド属性またはリテラル値にサービスの引数がバインドされ、それが引数としてサービスに渡され、指定した値に関連付けられている詳細情報がデータソースから取得されます。
プロパティとフォームデータモデルを保存します。
リクエスト属性の値の設定:
ファイルシステム上に.jsonファイルを作成し、編集用に開きます。
JSON配列を作成し、フォームデータモデルからデータを取得するための主な属性を指定します。 例えば、次のJSONは、FDMにIDが27126または27127のレコードのデータを送信するように要求します。
[
{
"id": 27126
},
{
"id": 27127
}
]
ファイルを保存して閉じます。
監視フォルダーを作成し、Batch APIサービスを使用するように設定します。
c:\batchprocessing
高度なパラメーターの設定:
「詳細」タブを開き、次のカスタムプロパティを追加します。
プロパティ | 型 | 説明 |
---|---|---|
templatePath | 文字列 | 使用する対話型通信テンプレートのパスを指定します。 例:/content/dam/formsanddocuments/testsample/mediumic これは必須プロパティです。 |
recordPath | 文字列 | recordPathフィールドの値は、インタラクティブ通信の名前を設定するのに役立ちます。 レコードのフィールドのパスは、recordPathフィールドの値として設定できます。 例えば、/employee/Idを指定した場合、idフィールドの値は、対応する対話型通信の名前になります。 デフォルト値はランダムランダムUUIDです。 |
usePrefillService | ブール型 | 値をTrueに設定します。 デフォルト値は false です。この値をtrueに設定すると、Batch APIは設定されたForm Data Modelからデータを読み取り、インタラクティブ通信に入力します。 usePrefillServiceがtrueに設定されている場合、(各レコードの)入力JSONデータはFDM引数として扱われます。 |
batchType | 文字列 | 値をPRINT、WEBまたはWEB_AND_PRINTに設定します。 デフォルト値はWEB_AND_PRINTです。 |
locale | 文字列 | Outputのインタラクティブ通信のロケールを指定します。 標準搭載のサービスではロケールオプションを使用しませんが、カスタムサービスを作成してローカライズされたインタラクティブ通信を生成することができます。 デフォルト値はen_USです。 |
「作成」をタップします。監視フォルダーが作成されます。
インタラクティブな通信を生成するには、監視フォルダーを使用します。
Representational State Transfer(REST)要求を通じてBatch APIを呼び出すことができます。 これにより、他のユーザーがAPIにアクセスできるようにRESTエンドポイントを提供し、インタラクティブ通信を処理、保存、カスタマイズするための独自のメソッドを設定できます。 独自のカスタムJavaサーブレットを開発し、AEMインスタンスにAPIをデプロイできます。
Javaサーブレットをデプロイする前に、インタラクティブな通信を行い、対応するデータファイルの準備が整っていることを確認します。 次の手順を実行して、Javaサーブレットを作成しデプロイします。
AEMインスタンスにログインし、インタラクティブ通信を作成します。 以下のサンプルコードに記載されている対話型の通信を使用するには、ここをクリックしてください。
AEMインスタンスでApache Mavenonを使用してAEMプロジェクトを構築し、デプロイします。
AEMプロ追加ジェクトのPOMファイルの依存関係リストのAEM FormsクライアントSDKバージョン6.0.12以降。 例:
<dependency>
<groupId>com.adobe.aemfd</groupId>
<artifactId>aemfd-client-sdk</artifactId>
<version>6.0.122</version>
</dependency>
Javaプロジェクトを開き、CCMBatchServlet.javaなどの.javaファイルを作成します。 次のコードをファイルに追加しました。
package com.adobe.fd.ccm.multichannel.batch.integration;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.Servlet;
import org.apache.commons.io.IOUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.json.JSONArray;
import org.json.JSONObject;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import com.adobe.fd.ccm.multichannel.batch.api.builder.BatchConfigBuilder;
import com.adobe.fd.ccm.multichannel.batch.api.factory.BatchComponentBuilderFactory;
import com.adobe.fd.ccm.multichannel.batch.api.model.BatchConfig;
import com.adobe.fd.ccm.multichannel.batch.api.model.BatchInput;
import com.adobe.fd.ccm.multichannel.batch.api.model.BatchResult;
import com.adobe.fd.ccm.multichannel.batch.api.model.BatchType;
import com.adobe.fd.ccm.multichannel.batch.api.model.RecordResult;
import com.adobe.fd.ccm.multichannel.batch.api.model.RenditionResult;
import com.adobe.fd.ccm.multichannel.batch.api.service.BatchGeneratorService;
import com.adobe.fd.ccm.multichannel.batch.util.BatchConstants;
import java.util.Date;
@Component(service=Servlet.class,
property={
"sling.servlet.methods=GET",
"sling.servlet.paths="+ "/bin/batchServlet"
})
public class CCMBatchServlet extends SlingAllMethodsServlet {
@Reference
private BatchGeneratorService batchGeneratorService;
@Reference
private BatchComponentBuilderFactory batchBuilderFactory;
public void doGet(SlingHttpServletRequest req, SlingHttpServletResponse resp) {
try {
executeBatch(req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
private void executeBatch(SlingHttpServletRequest req, SlingHttpServletResponse resp) throws Exception {
int count = 0;
JSONArray inputJSONArray = new JSONArray();
String filePath = req.getParameter("filePath");
InputStream is = new FileInputStream(filePath);
String data = IOUtils.toString(is);
try {
// If input file is json object, then create json object and add in json array, if not then try for json array
JSONObject inputJSON = new JSONObject(data);
inputJSONArray.put(inputJSON);
} catch (Exception e) {
try {
// If input file is json array, then iterate and add all objects into inputJsonArray otherwise throw exception
JSONArray inputArray = new JSONArray(data);
for(int i=0;i<inputArray.length();i++) {
inputJSONArray.put(inputArray.getJSONObject(i));
}
} catch (Exception ex) {
throw new Exception("Invalid JSON Data. File name : " + filePath, ex);
}
}
BatchInput batchInput = batchBuilderFactory.getBatchInputBuilder().setData(inputJSONArray).setTemplatePath("/content/dam/formsanddocuments/[path of the interactive communcation]").build();
BatchConfig batchConfig = batchBuilderFactory.getBatchConfigBuilder().setBatchType(BatchType.WEB_AND_PRINT).build();
BatchResult batchResult = batchGeneratorService.generateBatch(batchInput, batchConfig);
List<RecordResult> recordList = batchResult.getRecordResults();
JSONObject result = new JSONObject();
for (RecordResult recordResult : recordList) {
String recordId = recordResult.getRecordID();
for (RenditionResult renditionResult : recordResult.getRenditionResults()) {
if (renditionResult.isRecordPassed()) {
InputStream output = renditionResult.getDocumentStream().getInputStream();
result.put(recordId +"_"+renditionResult.getContentType(), output);
Date date= new Date();
long time = date.getTime();
// Print output
if(getFileExtension(renditionResult.getContentType()).equalsIgnoreCase(".json")) {
File file = new File(time + getFileExtension(renditionResult.getContentType()));
copyInputStreamToFile(output, file);
} else
{
File file = new File(time + getFileExtension(renditionResult.getContentType()));
copyInputStreamToFile(output, file);
}
}
}
}
PrintWriter writer = resp.getWriter();
JSONObject resultObj = new JSONObject();
resultObj.put("result", result);
writer.write(resultObj.toString());
}
private static void copyInputStreamToFile(InputStream inputStream, File file)
throws IOException {
try (FileOutputStream outputStream = new FileOutputStream(file)) {
int read;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
}
}
private String getFileExtension(String contentType) {
if (contentType.endsWith(BatchConstants.JSON)) {
return ".json";
} else return ".pdf";
}
}
上記のコードで、テンプレートパス(setTemplatePath)をテンプレートのパスに置き換え、setBatchType APIのset値を設定します。
バッチAPIを呼び出して、インタラクティブな通信を生成します。 バッチAPIは、レコード数に応じてPDFファイルと.jsonファイルのストリームを印刷します。 このJSONファイルを使用して、Webテンプレート](#web-template)に事前入力できます。 [上記のコードを使用する場合、APIはhttp://localhost:4502/bin/batchServlet
にデプロイされます。 このコードは、PDFファイルとJSONファイルのストリームを印刷して返します。
batchTypeを設定してWebチャネルをレンダリングする場合、APIは各データレコードに対してJSONファイルを生成します。 次の構文を使用して、JSONファイルと対応するWebチャネルーをマージし、インタラクティブな通信を生成できます。
構文
http://host:port/<template-path>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=<guide-merged-json-path>
例JSONファイルがにあり、 C:\batch\mergedJsonPath.json
次のインタラクティブ通信テンプレートを使用する場合: http://host:port/content/dam/formsanddocuments/testsample/mediumic/jcr:content?channel=web
次に、公開ノード上の次のURLは、対話型通信のWfcチャネルを表示する
http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=file:///C:/batch/mergedJsonData.json
データをファイルシステムに保存する以外にも、JSONファイルをCRX-repository、ファイルシステム、Webサーバーに保存したり、OSGI事前入力サービスを介してデータにアクセスしたりできます。 様々なプロトコルを使用してデータを結合するための構文を次に示します。
CRXプロトコル
http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=crx:///tmp/fd/af/mergedJsonData.json
ファイルプロトコル
http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=file:///C:/Users/af/mergedJsonData.json
事前入力サービスプロトコル
http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=service://[SERVICE_NAME]/[IDENTIFIER]
SERVICE_NAME は OSGI 事前入力サービスの名前を参照します。「事前入力サービスの作成と実行」を参照してください。
IDENTIFIER は、事前入力データを取得するために OSGI 事前入力サービスが必要とするメタデータを参照します。ログイン済みユーザーの識別子は、使用できるメタデータの一例です。
HTTPプロトコル
http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=http://localhost:8000/somesamplexmlfile.xml
デフォルトでは、CRXプロトコルのみが有効になっています。 サポートされている他のプロトコルを有効にするには、Configuration Managerを使用した事前入力サービスの設定を参照してください。