Chamar processos de longa vida centrados no ser humano :headding-anchor:invoking-human-centric-long-lived-processes
Você pode chamar programaticamente processos de longa vida centrados em humanos que foram criados no Workbench usando estes aplicativos clientes:
- Uma aplicação cliente baseada na Web Java que usa a API de chamada. (Consulte Chamada de AEM Forms usando a API Java(https://experienceleague.adobe.com/docs/experience-manager-65/content/forms/developer-reference/programming-aem-forms-jee/invoking-aem-forms-jee-apis/invoking-aem-forms-using-java.html?lang=pt-BR#invoking-aem-forms-using-the-java-api).)
- Um aplicativo ASP.NET que usa serviços da Web. (Consulte Chamar O AEM Forms Usando Serviços Da Web.)
- Um aplicativo cliente criado com o Flex que usa Comunicação Remota. (Consulte Chamar o AEM Forms usando (obsoleto para formulários AEM) AEM Forms Remoting.)
O processo de longa duração chamado é denominado FirstAppSolution/PreLoanProcess. Você pode criar esse processo seguindo o tutorial especificado em Criando seu Primeiro Aplicativo AEM Forms.
Um processo centrado no ser humano envolve uma tarefa à qual um usuário pode responder usando o Workspace. Por exemplo, usando o Workbench, você pode criar um processo que permite que um gerente bancário aprove ou negue um aplicativo de empréstimo. A ilustração a seguir mostra o processo FirstAppSolution/PreLoanProcess.
O processo FirstAppSolution/PreLoanProcess aceita um parâmetro de entrada chamado formData cujo tipo de dados é XML. Os dados XML são mesclados com um design de formulário chamado PreLoanForm.xdp. A ilustração a seguir mostra um formulário que representa uma tarefa atribuída a um usuário para aprovar ou negar um aplicativo de empréstimo. O usuário aprova ou nega o aplicativo usando o Workspace. O usuário do Workspace pode aprovar a solicitação de empréstimo clicando no botão Approve mostrado na ilustração a seguir. Da mesma forma, o usuário pode negar a solicitação de empréstimo clicando no botão negar.
Um processo de longa duração é chamado de forma assíncrona e não pode ser chamado de forma síncrona devido aos seguintes fatores:
- Um processo pode se estender por um período significativo.
- Um processo pode ultrapassar os limites organizacionais.
- Um processo precisa de entrada externa para ser concluído. Por exemplo, considere uma situação em que um formulário é enviado a um gerente, que está fora do escritório. Nessa situação, o processo não é concluído até que o gerente retorne e preencha o formulário.
Quando um processo de longa duração é chamado, o AEM Forms cria um valor de identificador de invocação como parte da criação de um registro. O registro rastreia o status do processo de longa duração e é armazenado no banco de dados do AEM Forms. Usando o valor do identificador de invocação, você pode rastrear o status do processo de longa duração. Além disso, você pode usar o valor do identificador de invocação do processo para executar operações do Process Manager, como encerrar uma instância de processo em execução.
O processo FirstAppSolution/PreLoanProcess
é chamado quando um candidato envia um aplicativo, que é representado como dados XML. O nome da variável de processo de entrada é formData
e seu tipo de dados é XML. Para os fins desta discussão, suponha que os dados XML a seguir sejam usados como entrada para o processo FirstAppSolution/PreLoanProcess
.
<?xml version="1.0" encoding="UTF-8"?>
<LoanApp>
<Name>Sam White</Name>
<LoanAmount>250000</LoanAmount>
<PhoneOrEmail>(555)555-5555</PhoneOrEmail>
<ApprovalStatus>PENDING APPROVAL</ApprovalStatus>
</LoanApp>
Os dados XML passados para um processo devem corresponder aos campos no formulário usado no processo. Caso contrário, os dados não serão exibidos no formulário. Todos os aplicativos que invocam o processo FirstAppSolution/PreLoanProcess
devem passar esta fonte de dados XML. Os aplicativos criados em Chamando processos de longa duração centrados no ser humano criam dinamicamente a fonte de dados XML a partir de valores que um usuário inseriu em um cliente da Web.
Usando um aplicativo cliente, você pode enviar o processo FirstAppSolution/PreLoanProcess para os dados XML necessários. Um processo de longa duração retorna um valor identificador de invocação como seu valor de retorno. A ilustração a seguir mostra os aplicativos clientes que chamam o processo de longa vida FirstAppSolution/PreLoanProcess. Os aplicativos clientes enviam dados XML e retornam um valor de string que representa o valor do identificador de invocação.
Consulte também
Criar uma aplicação Web Java que invoca um processo de longa vida centrado no ser humano
Criação de um aplicativo web ASP.NET que invoca um processo de longa vida centrado no ser humano
Criar uma aplicação Web Java que invoca um processo de longa vida centrado no ser humano :headding-anchor:creating-a-java-web-application-that-invokes-a-human-centric-long-lived-process
Você pode criar um aplicativo baseado na Web que use um servlet Java para chamar o processo FirstAppSolution/PreLoanProcess
. Para chamar esse processo de um servlet Java, use a API de chamada dentro do servlet Java. (Consulte Chamar o AEM Forms usando a API Java.)
A ilustração a seguir mostra um aplicativo cliente baseado na Web que publica valores de nome, telefone (ou email) e valor. Esses valores são enviados para o servlet Java quando o usuário clica no botão Enviar aplicação.
O servlet Java executa as seguintes tarefas:
- Recupera os valores publicados da página de HTML para o servlet Java.
- Cria dinamicamente uma fonte de dados XML para passar para o processo FirstAppSolution/PreLoanProcess. Os valores de nome, telefone (ou email) e valor são especificados na fonte de dados XML.
- Invoca o processo FirstAppSolution/PreLoanProcess usando a API de Invocação do AEM Forms.
- Retorna o valor do identificador de invocação para o navegador da Web do cliente.
Resumo das etapas :headding-anchor:summary-of-steps
Para criar um aplicativo Java baseado na Web que chame o processo FirstAppSolution/PreLoanProcess
, execute as seguintes etapas:
Criar um projeto da Web :headding-anchor:create-a-web-project
A primeira etapa para criar uma aplicação web é criar um projeto web. O Java IDE no qual este documento se baseia é o Eclipse 3.3. Usando o Eclipse IDE, crie um projeto da Web e adicione os arquivos JAR necessários ao seu projeto. Adicione uma página HTML chamada index.html e um servlet Java ao seu projeto.
A lista a seguir especifica os arquivos JAR a serem incluídos no projeto da Web:
- adobe-livecycle-client.jar
- adobe-usermanager-client.jar
- J2EE.jar
Para obter o local desses arquivos JAR, consulte Incluindo arquivos da biblioteca Java do AEM Forms.
Criar um projeto da Web
- Inicie o Eclipse e clique em Arquivo > Novo projeto.
- Na caixa de diálogo Novo Projeto, selecione Web > Projeto Dinâmico da Web.
- Digite
InvokePreLoanProcess
como o nome do seu projeto e clique em Concluir.
Adicionar arquivos JAR necessários ao seu projeto
- Na janela Project Explorer, clique com o botão direito do mouse no projeto
InvokePreLoanProcess
e selecione Propriedades. - Clique em Caminho de compilação do Java e clique na guia Bibliotecas.
- Clique no botão Adicionar JARs externos e navegue até os arquivos JAR para incluir.
Adicionar um servlet Java ao projeto
- Na janela Project Explorer, clique com o botão direito do mouse no projeto
InvokePreLoanProcess
e selecione Novo > Outros. - Expanda a pasta Web, selecione Servlet e clique em Avançar.
- Na caixa de diálogo Criar Servlet, digite
SubmitXML
para o nome do servlet e clique em Concluir.
Adicionar uma página de HTML ao seu projeto
- Na janela Project Explorer, clique com o botão direito do mouse no projeto
InvokePreLoanProcess
e selecione Novo > Outros. - Expanda a pasta Web, selecione HTML e clique em Avançar.
- Na caixa de diálogo Novo HTML, digite
index.html
para o nome do arquivo e clique em Concluir.
Criar lógica de aplicação Java para o servlet :headding-anchor:create-java-application-logic-for-the-servlet
Crie uma lógica de aplicação Java que chame o processo FirstAppSolution/PreLoanProcess
de dentro do servlet Java. O código a seguir mostra a sintaxe do Servlet Java SubmitXML
:
public class SubmitXML extends HttpServlet implements Servlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp
throws ServletException, IOException {
doPost(req,resp);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp
throws ServletException, IOException {
//Add code here to invoke the FirstAppSolution/PreLoanProcess process
}
Normalmente, você não colocaria o código do cliente em um método doGet
ou doPost
de servlet Java. Uma prática de programação recomendada é colocar esse código em uma classe separada. Em seguida, instancie a classe de dentro do método doPost
(ou método doGet
) e chame os métodos apropriados. No entanto, para abreviar o código, os exemplos de código são mantidos no mínimo e são colocados no método doPost
.
Para invocar o processo FirstAppSolution/PreLoanProcess
usando a API de Invocação, execute as seguintes tarefas:
-
Inclua arquivos JAR do cliente, como adobe-livecycle-client.jar, no caminho de classe do projeto Java. Para obter informações sobre o local desses arquivos, consulte Incluindo arquivos da biblioteca Java do AEM Forms.
-
Recupere o nome, o telefone e os valores de valor enviados da página de HTML. Use esses valores para criar dinamicamente uma fonte de dados XML que é enviada para o processo
FirstAppSolution/PreLoanProcess
. Você pode usar classesorg.w3c.dom
para criar a fonte de dados XML (esta lógica de aplicativo é mostrada no exemplo de código a seguir). -
Crie um objeto
ServiceClientFactory
que contenha propriedades de conexão. (Consulte Definindo propriedades de conexão.) -
Crie um objeto
ServiceClient
usando seu construtor e transmitindo o objetoServiceClientFactory
. Um objetoServiceClient
permite invocar uma operação de serviço. Ela lida com tarefas como localização, despacho e solicitações de chamada de roteamento. -
Crie um objeto
java.util.HashMap
usando seu construtor. -
Invoque o método
put
do objetojava.util.HashMap
para que cada parâmetro de entrada passe para o processo de longa duração. Certifique-se de especificar o nome dos parâmetros de entrada do processo. Como o processoFirstAppSolution/PreLoanProcess
requer um parâmetro de entrada do tipoXML
(denominadoformData
), você só precisa invocar o métodoput
uma vez.code language-java //Get the XML to pass to the FirstAppSolution/PreLoanProcess process org.w3c.dom.Document inXML = GetDataSource(name,phone,amount); //Create a Map object to store the parameter value Map params = new HashMap(); params.put("formData", inXML);
-
Crie um objeto
InvocationRequest
invocando o métodocreateInvocationRequest
do objetoServiceClientFactory
e transmitindo os seguintes valores:- Um valor de string que especifica o nome do processo de longa duração a ser chamado. Para invocar o processo
FirstAppSolution/PreLoanProcess
, especifiqueFirstAppSolution/PreLoanProcess
. - Um valor de string que representa o nome da operação do processo. O nome da operação de processo de longa duração é
invoke
. - O objeto
java.util.HashMap
que contém os valores de parâmetro exigidos pela operação de serviço. - Um valor booliano que especifica
false
, o que cria uma solicitação assíncrona (esse valor é aplicável para invocar um processo de longa duração).
note note NOTE Um processo de vida curta pode ser invocado transmitindo o valor true como o quarto parâmetro do método createInvocationRequest. Transmitir o valor true cria uma solicitação síncrona. - Um valor de string que especifica o nome do processo de longa duração a ser chamado. Para invocar o processo
-
Envie a solicitação de invocação à AEM Forms invocando o método
invoke
do objetoServiceClient
e transmitindo o objetoInvocationRequest
. O métodoinvoke
retorna um objetoInvocationReponse
. -
Um processo de longa duração retorna um valor de string que representa um valor de identificação de invocação. Recupere este valor chamando o método
getInvocationId
do objetoInvocationReponse
.code language-java //Send the invocation request to the long-lived process and //get back an invocation response object InvocationResponse lcResponse = myServiceClient.invoke(lcRequest); String invocationId = lcResponse.getInvocationId();
-
Grave o valor de identificação de invocação no navegador da Web do cliente. Você pode usar uma instância
java.io.PrintWriter
para gravar esse valor no navegador Web cliente.
Início Rápido: Chamar um processo de longa duração usando a API de Chamada :headding-anchor:quick-start-invoking-a-long-lived-process-using-the-invocation-api
O código Java a seguir representa o servlet Java que chama o processo FirstAppSolution/PreLoanProcess
.
/*
* This Java Quick Start uses the following JAR files
* 1. adobe-livecycle-client.jar
* 2. adobe-usermanager-client.jar
*
* (Because this quick start is implemented as a Java servlet, it is
* not necessary to include J2EE specific JAR files - the Java project
* that contains this quick start is exported as a WAR file which
* is deployed to the J2EE application server)
*
* These JAR files are in the following path:
* <install directory>/sdk/client-libs/common
*
* For complete details about the location of these JAR files,
* see "Including AEM Forms library files" in Programming with AEM forms
* */
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import com.adobe.idp.dsc.clientsdk.ServiceClientFactory;
import com.adobe.idp.dsc.clientsdk.ServiceClientFactoryProperties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import com.adobe.idp.dsc.InvocationRequest;
import com.adobe.idp.dsc.InvocationResponse;
import com.adobe.idp.dsc.clientsdk.ServiceClient;
import org.w3c.dom.Element;
public class SubmitXML extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
public SubmitXML() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try{
//Set connection properties required to invoke AEM Forms
Properties connectionProps = new Properties();
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://localhost:1099");
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
//Create a ServiceClientFactory object
ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps);
//Create a ServiceClient object
ServiceClient myServiceClient = myFactory.getServiceClient();
//Get the values that are passed from the Loan HTML page
String name = (String)request.getParameter("name");
String phone = (String)request.getParameter("phone");
String amount = (String)request.getParameter("amount");
//Create XML to pass to the FirstAppSolution/PreLoanProcess process
org.w3c.dom.Document inXML = GetDataSource(name,phone,amount);
//Create a Map object to store the XML input parameter value
Map params = new HashMap();
params.put("formData", inXML);
//Create an InvocationRequest object
InvocationRequest lcRequest = myFactory.createInvocationRequest(
"FirstAppSolution/PreLoanProcess", //Specify the long-lived process name
"invoke", //Specify the operation name
params, //Specify input values
false); //Create an asynchronous request
//Send the invocation request to the long-lived process and
//get back an invocation response object
InvocationResponse lcResponse = myServiceClient.invoke(lcRequest);
String invocationId = lcResponse.getInvocationId();
//Create a PrintWriter instance
PrintWriter pp = response.getWriter();
//Write the invocation identifier value back to the client web browser
pp.println("The job status identifier value is: " +invocationId);
}catch (Exception e) {
System.out.println("The following exception occurred: "+e.getMessage());
}
}
//Create XML data to pass to the long-lived process
private static org.w3c.dom.Document GetDataSource(String name, String phone, String amount)
{
org.w3c.dom.Document document = null;
try
{
//Create DocumentBuilderFactory and DocumentBuilder objects
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
//Create a Document object
document = builder.newDocument();
//Create MortgageApp - the root element in the XML
Element root = (Element)document.createElement("LoanApp");
document.appendChild(root);
//Create an XML element for Name
Element nameElement = (Element)document.createElement("Name");
nameElement.appendChild(document.createTextNode(name));
root.appendChild(nameElement);
//Create an XML element for Phone
Element phoneElement = (Element)document.createElement("PhoneOrEmail");
phoneElement.appendChild(document.createTextNode(phone));
root.appendChild(phoneElement);
//Create an XML element for amount
Element loanElement = (Element)document.createElement("LoanAmount");
loanElement.appendChild(document.createTextNode(amount));
root.appendChild(loanElement);
//Create an XML element for ApprovalStatus
Element approveElement = (Element)document.createElement("ApprovalStatus");
approveElement.appendChild(document.createTextNode("PENDING APPROVAL"));
root.appendChild(approveElement);
}
catch (Exception e) {
System.out.println("The following exception occurred: "+e.getMessage());
}
return document;
}
}
Criar a página da Web para o aplicativo Web :headding-anchor:create-the-web-page-for-the-web-application
A página da Web index.html fornece um ponto de entrada para o servlet Java que invoca o processo FirstAppSolution/PreLoanProcess
. Esta página da Web é um formulário HTML básico que contém um formulário HTML e um botão enviar. Quando o usuário clica no botão enviar, os dados do formulário são postados no servlet Java SubmitXML
.
O servlet Java captura os dados publicados na página HTML usando o seguinte código Java:
//Get the values that are passed from the Loan HTML page
String name = request.getParameter("name");
String phone = request.getParameter("phone");
String amount = request.getParameter("amount");
O código de HTML a seguir representa o arquivo index.html criado durante a configuração do ambiente de desenvolvimento. (Consulte Criar um projeto da Web.)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<table>
<TBODY>
<TR>
<td><img src="financeCorpLogo.jpg" width="172" height="62"></TD>
<td><FONT size="+2"><strong>Java Loan Application Page</strong></FONT></TD>
<td> </TD>
<td> </TD>
</TR>
</TBODY>
</TABLE>
<FORM action="https://hiro-xp:8080/PreLoanProcess/SubmitXML" method="post">
<table>
<TBODY>
<TR>
<td><LABEL for="name">Name: </LABEL></TD>
<td><INPUT type="text" name="name"></TD>
<td><input type="submit" value="Submit Application"></TD>
</TR>
<TR>
<td> <LABEL for="phone">Phone/Email: </LABEL></TD>
<td><INPUT type="text" name="phone"></TD>
<td></TD>
</TR>
<TR>
<td><LABEL for="amount">Amount: </LABEL></TD>
<td><INPUT type="text" name="amount"></TD>
<td></TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</body>
</html>
Empacotar a aplicação Web em um arquivo WAR :headding-anchor:package-the-web-application-to-a-war-file
Para implantar o servlet Java que chama o processo FirstAppSolution/PreLoanProcess
, empacote seu aplicativo web em um arquivo WAR. Certifique-se de que os arquivos JAR externos dos quais a lógica de negócios do componente depende, como adobe-livecycle-client.jar e adobe-usermanager-client.jar, também estejam incluídos no arquivo WAR.
A ilustração a seguir mostra o conteúdo do projeto Eclipse, que é empacotado em um arquivo WAR.
Empacotar um aplicativo Web em um arquivo WAR:
- Na janela Project Explorer, clique com o botão direito do mouse no projeto
InvokePreLoanProcess
e selecione Exportar > arquivo WAR. - Na caixa de texto Módulo Web, digite
InvokePreLoanProcess
para o nome do projeto Java. - Na caixa de texto Destino, digite
PreLoanProcess.war
para o nome do arquivo, especifique o local do arquivo WAR e clique em Concluir.
Implante o arquivo WAR para o servidor de aplicativos J2EE que hospeda o AEM Forms :headding-anchor:deploy-the-war-file-to-the-j2ee-application-server-hosting-aem-forms
Implante o arquivo WAR no servidor da aplicação J2EE no qual o AEM Forms é implantado. Para implantar o arquivo WAR no servidor de aplicativos J2EE, copie o arquivo WAR do caminho de exportação para [AEM Forms Install]\Adobe\Adobe Experience Manager Forms\jboss\server\lc_turnkey\deploy
.
Testar seu aplicativo web :headding-anchor:test-your-web-application
Depois de implantar a aplicação Web, você pode testá-la usando um navegador da Web. Supondo que você esteja usando o mesmo computador que hospeda o AEM Forms, é possível especificar a seguinte URL:
-
http://localhost:8080/PreLoanProcess/index.html
Insira valores nos campos do formulário HTML e clique no botão Submeter Requisição. Se ocorrerem problemas, consulte o arquivo de log do servidor de aplicativos J2EE.
Criação de um aplicativo web ASP.NET que invoca um processo de longa vida centrado no ser humano :headding-anchor:creating-an-asp-net-web-application-that-invokes-a-human-centric-long-lived-process
Você pode criar um aplicativo ASP.NET que chame o processo FirstAppSolution/PreLoanProcess
. Para chamar esse processo de um aplicativo ASP.NET, use os serviços da Web. (Consulte Chamar o AEM Forms usando Serviços da Web.)
A ilustração a seguir mostra um aplicativo cliente ASP.NET obtendo dados de um usuário final. Os dados são colocados em uma fonte de dados XML e enviados ao processo FirstAppSolution/PreLoanProcess
quando o usuário clica no botão Enviar Aplicativo.
Observe que depois que o processo é chamado, um valor identificador de invocação é exibido. Um valor de identificador de invocação é criado como parte de um registro que rastreia o status do processo de longa duração.
O aplicativo ASP.NET executa as seguintes tarefas:
- Recupera os valores que o usuário inseriu na página da Web.
- Cria dinamicamente uma fonte de dados XML que é passada para o* processo FirstAppSolution/PreLoanProcess *. Os três valores são especificados na fonte de dados XML.
- Chama o processo * FirstAppSolution/PreLoanProcess * usando os serviços da Web.
- Retorna o valor do identificador de invocação e o status da operação de longa duração para o navegador da Web do cliente.
Resumo das etapas :headding-anchor:summary_of_steps-1
Para criar um aplicativo ASP.NET que possa chamar o processo FirstAppSolution/PreLoanProcess, execute as seguintes etapas:
Criar um aplicativo web ASP.NET :headding-anchor:create-an-asp-net-web-application
Crie um aplicativo Web Microsoft .NET C# ASP.NET. A ilustração a seguir mostra o conteúdo do projeto ASP.NET denominado InvokePreLoanProcess.
Aviso em Referências de serviço, há dois itens. O primeiro item é denominado* JobManager*. Essa referência permite que o aplicativo ASP.NET chame o serviço Gerenciador de trabalhos. Este serviço retorna informações sobre o status de um processo de longa duração. Por exemplo, se o processo estiver em execução, esse serviço retornará um valor numérico que especifica que o processo está em execução no momento. A segunda referência chama-se PreLoanProcess. Esta referência de serviço representa a referência ao* processo FirstAppSolution/PreLoanProcess *. Depois de criar uma Referência de serviço, os tipos de dados associados ao serviço AEM Forms ficam disponíveis para uso no projeto .NET.
Criar um projeto ASP.NET:
- Inicie o Microsoft Visual Studio 2008.
- No menu Arquivo, selecione Novo, Site.
- Na lista Modelos, selecione Site ASP.NET.
- Na caixa Local, selecione um local para o projeto. Nomeie seu projeto InvokePreLoanProcess.
- Na caixa Idioma, selecione Visual C#
- Clique em OK.
Adicionar referências de serviço:
-
No menu Projeto, selecione Adicionar Referência de Serviço.
-
Na caixa de diálogo Endereço, especifique o WSDL para o serviço Gerenciador de Trabalhos.
code language-java https://hiro-xp:8080/soap/services/JobManager?WSDL&lc_version=9.0.1
-
No campo Namespace, digite
JobManager
. -
Clique em Ir e em OK.
-
No menu Projeto, selecione Adicionar Referência de Serviço.
-
Na caixa de diálogo Endereço, especifique o WSDL para o processo FirstAppSolution/PreLoanProcess.
code language-java https://hiro-xp:8080/soap/services/FirstAppSolution/PreLoanProcess?WSDL&lc_version=9.0.1
-
No campo Namespace, digite
PreLoanProcess
. -
Clique em Ir e em OK.
hiro-xp
pelo endereço IP do servidor de aplicativos J2EE que hospeda o AEM Forms. A opção lc_version
garante a disponibilidade da funcionalidade do AEM Forms, como MTOM. Sem especificar a opção lc_version
, não é possível invocar o AEM Forms usando MTOM. (Consulte Chamar o AEM Forms usando MTOM.)Criar uma página ASP que chame FirstAppSolution/PreLoanProcess :headding-anchor:create-an-asp-page-that-invokes-firstappsolution-preloanprocess
No projeto ASP.NET, adicione um formulário web (um arquivo ASPX) responsável por exibir uma página de HTML para o solicitante do empréstimo. O formulário web é baseado em uma classe derivada de System.Web.UI.Page
. A lógica do aplicativo C# que invoca FirstAppSolution/PreLoanProcess
está no método Button1_Click
(esse botão representa o botão Enviar Aplicativo).
A ilustração a seguir mostra o aplicativo ASP.NET
A tabela a seguir lista os controles que fazem parte desse aplicativo ASP.NET.
A lógica do aplicativo que faz parte do aplicativo ASP.NET deve criar dinamicamente uma fonte de dados XML para passar para o processo FirstAppSolution/PreLoanProcess
. Os valores inseridos pelo candidato na página HTML devem ser especificados na fonte de dados XML. Esses valores de dados são mesclados no formulário quando ele é visualizado no Workspace. As classes no namespace System.Xml
são usadas para criar a fonte de dados XML.
Ao chamar um processo que requer dados XML de um aplicativo ASP.NET, um tipo de dados XML está disponível para você usar. Ou seja, você não pode passar uma instância System.Xml.XmlDocument
para o processo. O nome totalmente qualificado desta instância XML para passar para o processo é InvokePreLoanProcess.PreLoanProcess.XML
. Converta a instância System.Xml.XmlDocument
em InvokePreLoanProcess.PreLoanProcess.XML
. Você pode executar essa tarefa usando o código a seguir.
//Create the XML to pass to the FirstAppSolution/PreLoanProcess process
XmlDocument myXML = CreateXML(userName, phone, amount);
//Convert the XML to a InvokePreLoanProcess.PreLoanProcess.XML instance
StringWriter sw = new StringWriter();
XmlTextWriter xw = new XmlTextWriter(sw);
myXML.WriteTo(xw);
InvokePreLoanProcess.PreLoanProcess.XML inXML = new XML();
inXML.document = sw.ToString();
Para criar uma página ASP que chame o processo FirstAppSolution/PreLoanProcess
, execute as seguintes tarefas no método Button1_Click
:
-
Crie um objeto
FirstAppSolution_PreLoanProcessClient
usando seu construtor padrão. -
Crie um objeto
FirstAppSolution_PreLoanProcessClient.Endpoint.Address
usando o construtorSystem.ServiceModel.EndpointAddress
. Transmita um valor de string que especifique o WSDL para o serviço AEM Forms e o tipo de codificação:code language-java https://hiro-xp:8080/soap/services/FirstAppSolution/PreLoanProcess?blob=mtom
Você não precisa usar o atributo
lc_version
. Esse atributo é usado quando você cria uma referência de serviço. No entanto, certifique-se de especificar?blob=mtom
.note note NOTE Substitua hiro-xp
* pelo endereço IP do servidor de aplicativos J2EE que hospeda o AEM Forms. * -
Crie um objeto
System.ServiceModel.BasicHttpBinding
obtendo o valor do membro de dadosFirstAppSolution_PreLoanProcessClient.Endpoint.Binding
. Converter o valor de retorno emBasicHttpBinding
. -
Defina o membro de dados
MessageEncoding
do objetoSystem.ServiceModel.BasicHttpBinding
comoWSMessageEncoding.Mtom
. Esse valor garante que a MTOM seja usada. -
Ative a autenticação HTTP básica executando as seguintes tarefas:
- Atribua o nome de usuário dos formulários AEM ao membro de dados
FirstAppSolution_PreLoanProcessClient.ClientCredentials.UserName.UserName
. - Atribua o valor de senha correspondente ao membro de dados
FirstAppSolution_PreLoanProcessClient.ClientCredentials.UserName.Password
. - Atribua o valor constante
HttpClientCredentialType.Basic
ao membro de dadosBasicHttpBindingSecurity.Transport.ClientCredentialType
. - Atribua o valor constante
BasicHttpSecurityMode.TransportCredentialOnly
ao membro de dadosBasicHttpBindingSecurity.Security.Mode
.
O código de exemplo a seguir mostra essas tarefas.
code language-as3 //Enable BASIC HTTP authentication BasicHttpBinding b = (BasicHttpBinding)mortgageClient.Endpoint.Binding; b.MessageEncoding = WSMessageEncoding.Mtom; mortgageClient.ClientCredentials.UserName.UserName = "administrator"; mortgageClient.ClientCredentials.UserName.Password = "password"; b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; b.MaxReceivedMessageSize = 2000000; b.MaxBufferSize = 2000000; b.ReaderQuotas.MaxArrayLength = 2000000;
- Atribua o nome de usuário dos formulários AEM ao membro de dados
-
Recupere o nome, o telefone e os valores de valor inseridos pelo usuário na página da Web. Use esses valores para criar dinamicamente uma fonte de dados XML que é enviada para o processo
FirstAppSolution/PreLoanProcess
. Crie umSystem.Xml.XmlDocument
que represente a fonte de dados XML a ser transmitida para o processo (esta lógica de aplicativo é mostrada no exemplo de código a seguir). -
Converta a instância
System.Xml.XmlDocument
emInvokePreLoanProcess.PreLoanProcess.XML
(esta lógica de aplicativo é mostrada no exemplo de código a seguir). -
Invoque o processo
FirstAppSolution/PreLoanProcess
invocando o métodoinvoke_Async
do objetoFirstAppSolution_PreLoanProcessClient
. Este método retorna um valor de string que representa o valor do identificador de invocação do processo de longa duração. -
Crie um
JobManagerClient
usando o construtor is. (Certifique-se de ter definido uma referência de serviço para o serviço Gerenciador de Jobs.) -
Repita as etapas 1 a 5. Especifique a seguinte URL para a etapa 2:
https://hiro-xp:8080/soap/services/JobManager?blob=mtom
. -
Crie um objeto
JobId
usando seu construtor. -
Defina o membro de dados
id
do objetoJobId
com o valor de retorno do métodoinvoke_Async
do objetoFirstAppSolution_PreLoanProcessClient
. -
Atribua o
value
true ao membro de dadospersistent
do objetoJobId
. -
Crie um objeto
JobStatus
invocando o métodogetStatus
do objetoJobManagerService
e transmitindo o objetoJobId
. -
Obtenha o valor de status recuperando o valor do membro de dados
statusCode
do objetoJobStatus
. -
Atribua o valor do identificador de invocação ao campo
LabelJobID.Text
. -
Atribua o valor de status ao campo
LabelStatus.Text
.
Início rápido: chamar um processo de longa duração usando a API do serviço da Web :headding-anchor:quick-start-invoking-a-long-lived-process-using-the-web-service-api
O exemplo de código C# a seguir invoca o processo FirstAppSolution/PreLoanProcess
.
???/**
* Ensure that you create a .NET project that uses
* MS Visual Studio 2008 and version 3.5 of the .NET
* framework. This is required to invoke a
* AEM Forms service using MTOM.
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.ServiceModel;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Xml;
using System.IO;
//A reference to FirstAppSolution/PreLoanProcess
using InvokePreLoanProcess.PreLoanProcess;
//A reference to JobManager service
using InvokePreLoanProcess.JobManager;
namespace InvokePreLoanProcess
{
public partial class _Default : System.Web.UI.Page
{
//This method is called when the Submit Application button is
//Clicked
protected void Button1_Click(object sender, EventArgs e)
{
//Create a FirstAppSolution_PreLoanProcessClient object
FirstAppSolution_PreLoanProcessClient mortgageClient = new FirstAppSolution_PreLoanProcessClient();
mortgageClient.Endpoint.Address = new System.ServiceModel.EndpointAddress("https://hiro-xp:8080/soap/services/FirstAppSolution/PreLoanProcess?blob=mtom");
//Enable BASIC HTTP authentication
BasicHttpBinding b = (BasicHttpBinding)mortgageClient.Endpoint.Binding;
b.MessageEncoding = WSMessageEncoding.Mtom;
mortgageClient.ClientCredentials.UserName.UserName = "administrator";
mortgageClient.ClientCredentials.UserName.Password = "password";
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
b.MaxReceivedMessageSize = 2000000;
b.MaxBufferSize = 2000000;
b.ReaderQuotas.MaxArrayLength = 2000000;
//Retrieve values that user entered into the web page
String userName = TextBoxName.Text;
String phone = TextBoxPhone.Text;
String amount = TextBoxAmount.Text;
//Create the XML to pass to the FirstAppSolution/PreLoanProcess process
XmlDocument myXML = CreateXML(userName, phone, amount);
StringWriter sw = new StringWriter();
XmlTextWriter xw = new XmlTextWriter(sw);
myXML.WriteTo(xw);
InvokePreLoanProcess.PreLoanProcess.XML inXML = new XML();
inXML.document = sw.ToString();
//INvoke the FirstAppSolution/PreLoanProcess process
String invocationID = mortgageClient.invoke_Async(inXML);
//Create a JobManagerClient object to obtain the status of the long-lived operation
JobManagerClient jobManager = new JobManagerClient();
jobManager.Endpoint.Address = new System.ServiceModel.EndpointAddress("https://hiro-xp:8080/soap/services/JobManager?blob=mtom");
//Enable BASIC HTTP authentication
BasicHttpBinding b1 = (BasicHttpBinding)jobManager.Endpoint.Binding;
b1.MessageEncoding = WSMessageEncoding.Mtom;
jobManager.ClientCredentials.UserName.UserName = "administrator";
jobManager.ClientCredentials.UserName.Password = "password";
b1.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
b1.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
b1.MaxReceivedMessageSize = 2000000;
b1.MaxBufferSize = 2000000;
b1.ReaderQuotas.MaxArrayLength = 2000000;
//Create a JobID object that represents the status of the
//long-lived operation
JobId jobId = new JobId();
jobId.id = invocationID;
jobId.persistent = true;
JobStatus jobStatus = jobManager.getStatus(jobId);
System.Int16 val2 = jobStatus.statusCode;
LabelJobID.Text = "The job status identifier value is " + invocationID;
LabelStatus.Text = "The status of the long-lived operation is " + getJobDescription(val2);
}
private static XmlDocument CreateXML(String name, String phone, String amount)
{
//This method dynamically creates a DDX document
//to pass to the FirstAppSolution/PreLoanProcess process
XmlDocument xmlDoc = new XmlDocument();
//Create the root element and append it to the XML DOM
System.Xml.XmlElement root = xmlDoc.CreateElement("LoanApp");
xmlDoc.AppendChild(root);
//Create the Name element
XmlElement nameElement = xmlDoc.CreateElement("Name");
nameElement.AppendChild(xmlDoc.CreateTextNode(name));
root.AppendChild(nameElement);
//Create the LoanAmount element
XmlElement LoanAmount = xmlDoc.CreateElement("LoanAmount");
LoanAmount.AppendChild(xmlDoc.CreateTextNode(amount));
root.AppendChild(LoanAmount);
//Create the PhoneOrEmail element
XmlElement PhoneOrEmail = xmlDoc.CreateElement("PhoneOrEmail");
PhoneOrEmail.AppendChild(xmlDoc.CreateTextNode(phone));
root.AppendChild(PhoneOrEmail);
//Create the ApprovalStatus element
XmlElement ApprovalStatus = xmlDoc.CreateElement("ApprovalStatus");
ApprovalStatus.AppendChild(xmlDoc.CreateTextNode("PENDING APPROVAL"));
root.AppendChild(ApprovalStatus);
//Return the XmlElement instance
return xmlDoc;
}
//Returns the String value of the Job Manager status code
private String getJobDescription(int val)
{
switch(val)
{
case 0:
return "JOB_STATUS_UNKNOWN";
case 1:
return "JOB_STATUS_QUEUED";
case 2:
return "JOB_STATUS_RUNNING";
case 3:
return "JOB_STATUS_COMPLETED";
case 4:
return "JOB_STATUS_FAILED";
case 5:
return "JOB_STATUS_COMPLETED";
case 6:
return "JOB_STATUS_SUSPENDED";
case 7:
return "JOB_STATUS_COMPLETE_REQUESTED";
case 8:
return "JOB_STATUS_TERMINATE_REQUESTED";
case 9:
return "JOB_STATUS_SUSPEND_REQUESTED";
case 10:
return "JOB_STATUS_RESUME_REQUESTED";
}
return "";
}
}
}
Execute o aplicativo ASP.NET :headding-anchor:run-the-asp-net-application
Após compilar e implantar o aplicativo ASP.NET, é possível executá-lo usando um navegador da Web. Considerando que o nome do projeto ASP.NET seja InvokePreLoanProcess, especifique a seguinte URL em um navegador da Web:
*http://localhost:1629/InvokePreLoanProcess/*Default.aspx
onde localhost é o nome do servidor Web que hospeda o projeto ASP.NET e 1629 é o número da porta. Quando você compila e cria seu aplicativo ASP.NET, o Microsoft Visual Studio o implanta automaticamente.
Criar um aplicativo cliente criado com o Flex que chame um processo de longa vida centrado no ser humano :headding-anchor:creating-a-client-application-built-with-flex-that-invokes-a-human-centric-long-lived-process
Você pode criar um aplicativo cliente compilado com o Flex para invocar o processo FirstAppSolution/PreLoanProcess. Este aplicativo usa Comunicação Remota para invocar o processo FirstAppSolution/PreLoanProcess. (Consulte Chamar o AEM Forms usando (obsoleto para formulários AEM) AEM Forms Remoting.)
A ilustração a seguir mostra um aplicativo cliente criado com o Flex coletando dados de um usuário final. Os dados são colocados em uma fonte de dados XML e enviados ao processo.
Observe que depois que o processo é chamado, um valor identificador de invocação é exibido. Um valor de identificador de invocação é criado como parte de um registro que rastreia o status do processo de longa duração.
O aplicativo cliente criado com o Flex executa as seguintes tarefas:
- Recupera os valores que o usuário inseriu na página da Web.
- Cria dinamicamente uma fonte de dados XML que é passada para o processo FirstAppSolution/PreLoanProcess. Os três valores são especificados na fonte de dados XML.
- Invoca o processo FirstAppSolution/PreLoanProcess usando Comunicação Remota.
- Retorna o valor do identificador de invocação do processo de longa duração.
Resumo das etapas :headding-anchor:summary_of_steps-2
Para criar um aplicativo cliente criado com o Flex que possa chamar o processo FirstAppSolution/PreLoanProcess, execute as seguintes etapas:
-
Inicie um novo projeto do Flex.
-
Inclua o arquivo adobe-remoting-provider.swc no caminho de classe do projeto. (Consulte Incluindo o arquivo da biblioteca Flex do AEM Forms.)
-
Crie uma instância
mx:RemoteObject
por meio do ActionScript ou MXML. (Consulte Criando uma instância mx:RemoteObject) -
Configure uma instância
ChannelSet
para se comunicar com o AEM Forms e associá-la à instânciamx:RemoteObject
. (Consulte Criar um canal para o AEM Forms.) -
Chame o método
login
do ChannelSet ou o métodosetCredentials
do serviço para especificar o valor do identificador do usuário e a senha. (Consulte Usando logon único.) -
Crie a fonte de dados XML para passar para o processo
FirstAppSolution/PreLoanProcess
criando uma instância XML. (Essa lógica de aplicação é mostrada no seguinte exemplo de código.) -
Crie um objeto do tipo Object usando seu construtor. Atribua o XML ao objeto especificando o nome do parâmetro de entrada do processo, conforme mostrado no código a seguir:
code language-csharp //Get the XML data to pass to the AEM Forms process var xml:XML = createXML(); var params:Object = new Object(); params["formData"]=xml;
-
Chame o processo
FirstAppSolution/PreLoanProcess
chamando o métodoinvoke_Async
da instânciamx:RemoteObject
. Passe oObject
que contém o parâmetro de entrada. (Consulte Passagem dos valores de entrada.) -
Recupere o valor de identificação de invocação retornado de um processo de longa vida, conforme mostrado no seguinte código:
code language-csharp // Handles async call that invokes the long-lived process private function resultHandler(event:ResultEvent):void { ji = event.result as JobId; jobStatusDisplay.text = "Job Status ID: " + ji.jobId as String; }
Chamar um processo de longa duração usando Comunicação Remota :headding-anchor:invoking-a-long-lived-process-using-remoting
O exemplo de código Flex a seguir invoca o processo FirstAppSolution/PreLoanProcess
.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns="*" backgroundColor="#FFFFFF"
creationComplete="initializeChannelSet();">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import flash.net.navigateToURL;
import mx.messaging.ChannelSet;
import mx.messaging.channels.AMFChannel;
import mx.collections.ArrayCollection;
import mx.rpc.livecycle.JobId;
import mx.rpc.livecycle.JobStatus;
import mx.rpc.livecycle.DocumentReference;
import mx.formatters.NumberFormatter;
// Holds the job ID returned by LC.JobManager
private var ji:JobId;
private function initializeChannelSet():void
{
var cs:ChannelSet= new ChannelSet();
cs.addChannel(new AMFChannel("remoting-amf", "https://hiro-xp:8080/remoting/messagebroker/amf"));
LC_MortgageApp.setCredentials("tblue", "password");
LC_MortgageApp.channelSet = cs;
}
private function submitApplication():void
{
//Get the XML data to pass to the AEM Forms process
var xml:XML = createXML();
var params:Object = new Object();
params["formData"]=xml;
LC_MortgageApp.invoke_Async(params);
}
// Handles async call that invokes the long-lived process
private function resultHandler(event:ResultEvent):void
{
ji = event.result as JobId;
jobStatusDisplay.text = "Job Status ID: " + ji.jobId as String;
}
private function createXML():XML
{
//Calculate the Mortgage value to place in the XML data
var propertyPrice:String = txtAmount.text ;
var name:String = txtName.text ;
var phone:String = txtPhone.text ;;
var model:XML =
<LoanApp>
<Name>{name}</Name>
<LoanAmount>{propertyPrice}</LoanAmount>
<PhoneOrEmail>{phone}</PhoneOrEmail>
<ApprovalStatus>PENDING APPROVAL</ApprovalStatus>
</LoanApp>
return model;
}
]]>
</mx:Script>
<!-- Declare the RemoteObject and set its destination to the mortgage-app remoting endpoint defined in AEM Forms. -->
<mx:RemoteObject id="LC_MortgageApp" destination="FirstAppSolution/PreLoanProcess" result="resultHandler(event);">
<mx:method name="invoke_Async" result="resultHandler(event)"/>
</mx:RemoteObject>
<mx:Grid x="229" y="186">
<mx:GridRow width="100%" height="100%">
<mx:GridItem width="100%" height="100%">
<mx:Image>
<mx:source>file:///D|/LiveCycle_9/FirstApp/financeCorpLogo.jpg</mx:source>
</mx:Image>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
<mx:Label text="Flex Loan Application Page" fontSize="20"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
</mx:GridItem>
</mx:GridRow>
<mx:GridRow width="100%" height="100%">
<mx:GridItem width="100%" height="100%">
<mx:Label text="Name:" fontSize="12" fontWeight="bold"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
<mx:TextInput id="txtName"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
<mx:Button label="Submit Application" click="submitApplication()"/>
</mx:GridItem>
</mx:GridRow>
<mx:GridRow width="100%" height="100%">
<mx:GridItem width="100%" height="100%">
<mx:Label text="Phone/Email:" fontSize="12" fontWeight="bold"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
<mx:TextInput id="txtPhone"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
</mx:GridItem>
</mx:GridRow>
<mx:GridRow width="100%" height="100%">
<mx:GridItem width="100%" height="100%">
<mx:Label text="Amount:" fontSize="12" fontWeight="bold"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
<mx:TextInput id="txtAmount"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
</mx:GridItem>
</mx:GridRow>
<mx:GridRow width="100%" height="100%">
<mx:GridItem width="100%" height="100%">
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
<mx:Label text="Label" id="jobStatusDisplay" enabled="true" fontSize="12" fontWeight="bold"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
</mx:GridItem>
</mx:GridRow>
</mx:Grid>
</mx:Application>