Show Menu
ARGOMENTI×

Generazione di più comunicazioni interattive mediante l'API Batch

Potete utilizzare l'API Batch per produrre più comunicazioni interattive da un modello. Il modello è una comunicazione interattiva senza alcun dato. L'API Batch combina i dati con un modello per produrre una comunicazione interattiva. L'API è utile nella produzione di massa di comunicazioni interattive. Ad esempio, bollette telefoniche, estratti conto della carta di credito per più clienti.
L'API Batch accetta i record (dati) in formato JSON e da un modello dati modulo. Il numero di comunicazioni interattive prodotte è uguale ai record specificati nel file JSON di input nel modello dati modulo configurato. Potete utilizzare l'API per produrre sia output di stampa che output Web. L'opzione STAMPA produce un documento PDF e l'opzione WEB produce dati in formato JSON per ciascun record.

Utilizzo dell'API Batch

Potete utilizzare l'API Batch insieme alle cartelle esaminate o come API di riposo standalone. Potete configurare un modello, un tipo di output (HTML, PRINT o Entrambi), impostazioni internazionali, un servizio di precompilazione e un nome per le comunicazioni interattive generate per l'utilizzo dell'API Batch.
È possibile combinare un record con un modello di comunicazione interattiva per produrre una comunicazione interattiva. Le API Batch possono leggere i record (dati per i modelli di comunicazione interattivi) direttamente da un file JSON o da un'origine dati esterna a cui si accede tramite il modello dati del modulo. È possibile conservare ciascun record in un file JSON separato o creare un array JSON per conservare tutti i record in un unico file.
Un singolo record in un file JSON
{
   "employee": {
       "name": "Sara",
       "id": 3,
       "mobileNo": 9871996463,
       "age": 37
   }
}

Più record in un file 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
   }
}]

Utilizzo dell'API Batch con le cartelle esaminate

Per semplificare l'utilizzo dell'API, in AEM Forms è disponibile un servizio per cartelle esaminate configurato per l'utilizzo dell'API Batch. È possibile accedere al servizio tramite l'interfaccia utente di AEM Forms per generare più comunicazioni interattive. Potete anche creare servizi personalizzati in base alle vostre esigenze. Potete utilizzare i metodi elencati di seguito per utilizzare l'API Batch con la cartella esaminata:
  • Specificare i dati di input (record) in formato JSON per produrre una comunicazione interattiva
  • Utilizzare i dati di input (record) salvati in un'origine dati esterna ed accessibili tramite un modello dati modulo per produrre una comunicazione interattiva

Specificare i record di dati di input nel formato di file JSON per produrre una comunicazione interattiva

È possibile combinare un record con un modello di comunicazione interattiva per produrre una comunicazione interattiva. Potete creare un file JSON separato per ciascun record o creare un array JSON per conservare tutti i record in un unico file:
Per creare una comunicazione interattiva dai record salvati in un file JSON:
  1. Create una cartella creating-configure-watched-folder.html esaminata e configuratela per utilizzare l'API Batch:
    1. Accedete all'istanza di creazione di AEM Forms.
    2. Passare a Strumenti > Moduli > Configura cartella esaminata. Toccate Nuovo .
    3. Specificate il Nome e il Percorso fisico della cartella. Esempio, c:\batchprocessing .
    4. Selezionare l'opzione Servizio nel campo Elabora file con .
    5. Selezionate il servizio com.adobe.fd.ccm.multicanale.batch.impl.service.InteractiveCommunicationBatchServiceImpl nel campo Nome ​servizio.
    6. Specificare un pattern di file di output. Ad esempio, il pattern %F/ specifica che la cartella esaminata può trovare i file di input in una sottocartella della cartella Watched Folder\input.
  2. Configurare i parametri avanzati:
    1. Aprite la scheda Avanzate e aggiungete le seguenti proprietà personalizzate:
      Proprietà
      Tipo
      Descrizione
      templatePath
      Stringa
      Specificate il percorso del modello di comunicazione interattiva da utilizzare. Ad esempio, /content/dam/formsanddocuments/testsample/mediumic. È una proprietà obbligatoria.
      recordPath
      Stringa
      Il valore del campo recordPath consente di impostare il nome di una comunicazione interattiva. È possibile impostare il percorso di un campo di un record come valore del campo recordPath. Ad esempio, se specificate /dipendente/Id, il valore del campo id diventa nome per la corrispondente comunicazione interattiva. Il valore predefinito è un UUID casuale casuale.
      usePrefillService
      Booleano
      Impostare il valore su False. Potete utilizzare il parametro usePrefillService per precompilare la comunicazione interattiva con i dati recuperati dal servizio di precompilazione configurato per la comunicazione interattiva corrispondente. Quando usePrefillService è impostato su true, i dati JSON di input (per ciascun record) vengono trattati come argomenti FDM. Il valore predefinito è false.
      batchType
      Stringa
      Impostare il valore su STAMPA, WEB o WEB_AND_PRINT. Il valore predefinito è WEB_AND_PRINT.
      locale
      Stringa
      Specificate le impostazioni internazionali della comunicazione interattiva di output. Il servizio out-of-the-box non utilizza l'opzione delle impostazioni internazionali, ma è possibile creare un servizio personalizzato per generare comunicazioni interattive localizzate. Il valore predefinito è en_US
    2. Toccate Crea la cartella esaminata creata.
  3. Utilizzate la cartella esaminata per generare comunicazioni interattive:
    1. Aprite la cartella esaminata. Passate alla cartella di input.
    2. Create una cartella nella cartella di input e inserite il file JSON nella nuova cartella creata.
    3. Attendete che la cartella esaminata elabori il file. All'avvio dell'elaborazione, il file di input e la sottocartella contenente il file vengono spostati nella cartella di gestione temporanea.
    4. Aprite la cartella di output per visualizzare l’output:
      • Quando si specifica l'opzione PRINT in Configurazione cartelle esaminate, viene generato l'output PDF per la comunicazione interattiva.
      • Quando specificate l'opzione WEB in Configurazione cartelle esaminate, viene generato un file JSON per record. Potete usare il file JSON per precompilare un modello Web.
      • Quando si specificano sia le opzioni STAMPA che WEB, vengono generati sia i documenti PDF che un file JSON per record.

Utilizzare i dati di input salvati in un'origine dati esterna e accessibili tramite il modello dati del modulo per produrre una comunicazione interattiva

È possibile combinare i dati (record) salvati in un'origine dati esterna con un modello di comunicazione interattiva per produrre una comunicazione interattiva. Quando si crea una comunicazione interattiva, è possibile collegarla a un'origine dati esterna tramite un modello dati modulo (FDM) per accedere ai dati. È possibile configurare il servizio di elaborazione batch Cartelle esaminate per recuperare i dati utilizzando lo stesso modello dati modulo da un'origine dati esterna. Per creare una comunicazione interattiva dai record salvati in un'origine dati esterna:
  1. Configurare il modello dati modulo del modello:
    1. Aprire il modello dati modulo associato al modello di comunicazione interattiva.
    2. Selezionare l'OGGETTO MODELLO DI LIVELLO SUPERIORE e toccare Modifica proprietà.
    3. Selezionare il recupero o ottenere il servizio dal campo Servizio lettura nel riquadro Modifica proprietà.
    4. Toccate l'icona a forma di matita per l'argomento del servizio di lettura per associare l'argomento a un attributo di richiesta e specificare il valore di binding. Questo vincola l'argomento del servizio all'attributo di binding o al valore letterale specificato, che viene passato al servizio come argomento per recuperare i dettagli associati al valore specificato dall'origine dati.
    5. Salvare le proprietà e il modello dati modulo.
  2. Configura valore per attributo richiesta:
    1. Create un file .json sul file system e apritelo per la modifica.
    2. Create un array JSON e specificate l'attributo principale per recuperare i dati dal modello dati del modulo. Ad esempio, il seguente JSON richiede a FDM di inviare i dati dei record dove id è 27126 o 27127:
          [
              {
                  "id": 27126
              },
              {
                  "id": 27127
              }
          ]
      
      
    3. Salvate e chiudete il file.
  3. Create una cartella creating-configure-watched-folder.html esaminata e configuratela per utilizzare il servizio API Batch:
    1. Accedete all'istanza di creazione di AEM Forms.
    2. Passare a Strumenti > Moduli > Configura cartella esaminata. Toccate Nuovo .
    3. Specificate il Nome e il Percorso fisico della cartella. Esempio, c:\batchprocessing .
    4. Selezionare l'opzione Servizio nel campo Elabora file con .
    5. Selezionate il servizio com.adobe.fd.ccm.multicanale.batch.impl.service.InteractiveCommunicationBatchServiceImpl nel campo Nome ​servizio.
    6. Specificare un pattern di file di output. Ad esempio, il pattern %F/ specifica che la cartella esaminata può trovare i file di input in una sottocartella della cartella Watched Folder\input.
  4. Configurare i parametri avanzati:
    1. Aprite la scheda Avanzate e aggiungete le seguenti proprietà personalizzate:
      Proprietà
      Tipo
      Descrizione
      templatePath
      Stringa
      Specificate il percorso del modello di comunicazione interattiva da utilizzare. Ad esempio, /content/dam/formsanddocuments/testsample/mediumic. È una proprietà obbligatoria.
      recordPath
      Stringa
      Il valore del campo recordPath consente di impostare il nome di una comunicazione interattiva. È possibile impostare il percorso di un campo di un record come valore del campo recordPath. Ad esempio, se specificate /dipendente/Id, il valore del campo id diventa nome per la corrispondente comunicazione interattiva. Il valore predefinito è un UUID casuale casuale.
      usePrefillService
      Booleano
      Impostate il valore su True. Il valore predefinito è false. Quando il valore è impostato su true, l'API Batch legge i dati dal modello dati modulo configurato e li riempie alla comunicazione interattiva. Quando usePrefillService è impostato su true, i dati JSON di input (per ciascun record) vengono trattati come argomenti FDM.
      batchType
      Stringa
      Impostare il valore su STAMPA, WEB o WEB_AND_PRINT. Il valore predefinito è WEB_AND_PRINT.
      locale
      Stringa
      Specificate le impostazioni internazionali della comunicazione interattiva di output. Il servizio out-of-the-box non utilizza l'opzione delle impostazioni internazionali, ma è possibile creare un servizio personalizzato per generare comunicazioni interattive localizzate. Il valore predefinito è en_US.
    2. Toccate Crea la cartella esaminata creata.
  5. Utilizzate la cartella esaminata per generare comunicazioni interattive:
    1. Aprite la cartella esaminata. Passate alla cartella di input.
    2. Create una cartella nella cartella di input. Inserite il file JSON creato al punto 2 nella nuova cartella creata.
    3. Attendete che la cartella esaminata elabori il file. All'avvio dell'elaborazione, il file di input e la sottocartella contenente il file vengono spostati nella cartella di gestione temporanea.
    4. Aprite la cartella di output per visualizzare l’output:
      • Quando si specifica l'opzione PRINT in Configurazione cartelle esaminate, viene generato l'output PDF per la comunicazione interattiva.
      • Quando specificate l'opzione WEB in Configurazione cartelle esaminate, viene generato un file JSON per record. Potete usare il file JSON per precompilare un modello Web.
      • Quando si specificano sia le opzioni STAMPA che WEB, vengono generati sia i documenti PDF che un file JSON per record.

Richiama l'API Batch utilizzando le richieste REST

Puoi richiamare l'API Batch tramite le richieste REST (Rappresentational State Transfer). Consente di fornire un endpoint REST ad altri utenti per accedere all'API e configurare i propri metodi per l'elaborazione, la memorizzazione e la personalizzazione delle comunicazioni interattive. Potete sviluppare un servlet Java personalizzato per distribuire l'API sull'istanza AEM.
Prima di distribuire il servlet Java, accertatevi di disporre di una comunicazione interattiva e che i file di dati corrispondenti siano pronti. Per creare e distribuire il servlet Java, effettuate le seguenti operazioni:
  1. Accedete alla vostra istanza di AEM e create una comunicazione interattiva. Per utilizzare la comunicazione interattiva indicata nel codice di esempio riportato di seguito, fai clic qui .
  2. Aggiungi AEM Forms Client SDK versione 6.0.12 o successiva nell'elenco delle dipendenze del file POM del progetto AEM. Ad esempio,
        <dependency>
            <groupId>com.adobe.aemfd</groupId>
            <artifactId>aemfd-client-sdk</artifactId>
            <version>6.0.122</version>
        </dependency>
    
    
  3. Aprite il progetto Java, create un file .java, ad esempio CCMBatchServlet.java. Aggiungi al file il codice seguente:
            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";
                }
    
    
            }
    
    
  4. Nel codice precedente, sostituisci il percorso del modello (setTemplatePath) con il percorso del modello e imposta il valore dell’API setBatchType:
    • Quando si specifica l'opzione PRINT, viene generato l'output PDF per la comunicazione interattiva.
    • Quando specificate l'opzione WEB, viene generato un file JSON per record. Potete usare il file JSON per precompilare un modello Web.
    • Quando si specificano sia le opzioni STAMPA che WEB, vengono generati sia i documenti PDF che un file JSON per record.
  5. Richiamate l'API batch per generare la comunicazione interattiva. L'API batch consente di stampare un flusso di file PDF e .json in base al numero di record. Potete usare il file JSON per precompilare un modello Web. Se utilizzate il codice riportato sopra, l'API viene distribuita in http://localhost:4502/bin/batchServlet . Il codice stampa e restituisce un flusso di file PDF e JSON.

Pre-compilare un modello Web

Quando impostate batchType per eseguire il rendering del canale Web, l'API genera un file JSON per ogni record di dati. Per unire il file JSON con il canale Web corrispondente, potete usare la sintassi seguente per generare una comunicazione interattiva:
Sintassi http://host:port/<template-path>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=<guide-merged-json-path>
Esempio Se il file JSON si trova in C:\batch\mergedJsonPath.json e si utilizza il seguente modello di comunicazione interattiva: http://host:port/content/dam/formsanddocuments/testsample/mediumic/jcr:content?channel=web
Quindi, il seguente URL sul nodo di pubblicazione visualizza il canale Web della comunicazione interattiva http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=file:///C:/batch/mergedJsonData.json
Oltre a salvare i dati sul file system, si memorizzano i file JSON nel repository CRX, nel file system, nel server Web o possono accedere ai dati tramite il servizio di precompilazione OSGI. Sintassi per l'unione dei dati tramite vari protocolli:
  • Protocollo CRX http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=crx:///tmp/fd/af/mergedJsonData.json
  • Protocollo file http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=file:///C:/Users/af/mergedJsonData.json
  • Protocollo Prefill Service http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=service://[SERVICE_NAME]/[IDENTIFIER]
    SERVICE_NAME fa riferimento al nome del servizio di precompilazione OSGI. Fate riferimento a Creare ed eseguire un servizio di precompilazione.
    IDENTIFIER fa riferimento a tutti i metadati richiesti dal servizio di precompilazione OSGI per recuperare i dati di precompilazione. Un identificatore per l’utente connesso è un esempio di metadati che possono essere utilizzati.
  • protocollo HTTP http://host:port/<path-to-ic>/jcr:content?channel=web&mode=preview&guideMergedJsonPath=http://localhost:8000/somesamplexmlfile.xml
Solo il protocollo CRX è abilitato per impostazione predefinita. Per abilitare altri protocolli supportati, consultate Configurazione del servizio di precompilazione tramite Configuration Manager .