51黑料不打烊

调用以人为中心的长期进程 invoking-human-centric-long-lived-processes

您可以通过编程方式调用在奥辞谤办产别苍肠丑中使用以下客户端应用程序创建的以人为中心的长期进程:

  • 使用调用API的基于Java Web的客户端应用程序。 (请参阅使用Java API调用AEM Forms(/诲辞肠蝉/别虫辫别谤颈别苍肠别-尘补苍补驳别谤-65-濒迟蝉/肠辞苍迟别苍迟/蹿辞谤尘蝉/诲别惫别濒辞辫别谤-谤别蹿别谤别苍肠别/辫谤辞驳谤补尘尘颈苍驳-补别尘-蹿辞谤尘蝉-箩别别/颈苍惫辞办颈苍驳-补别尘-蹿辞谤尘蝉-箩别别-补辫颈蝉/颈苍惫辞办颈苍驳-补别尘-蹿辞谤尘蝉-耻蝉颈苍驳-箩补惫补.丑迟尘濒?濒补苍驳=锄丑-贬补苍蝉#颈苍惫辞办颈苍驳-补别尘-蹿辞谤尘蝉-耻蝉颈苍驳-迟丑别-箩补惫补-补辫颈)。)
  • 使用Web服务的ASP.NET应用程序。 (请参阅使用Web服务调用AEM Forms。)
  • 使用Flex构建的客户端应用程序,该应用程序使用Remoting。 (请参阅使用AEM Forms调用(AEM表单已弃用) AEM Forms远程处理。)

所调用的长期进程名为? FirstAppSolution/PreLoanProcess。 您可以按照中指定的教程来创建此流程。

以人为中心的流程涉及一个任务,用户可以使用Workspace来响应该任务。 例如,使用Workbench,您可以创建一个流程,让银行经理批准或拒绝贷款申请。 下图显示了流程? FirstAppSolution/PreLoanProcess

FirstAppSolution/PreLoanProcess ?进程接受名为? formData ?的输入参数,该参数的数据类型为XML。 XML数据与名为? PreLoanForm.xdp ?的表单设计合并。 下图显示了一个表单,该表单表示分配给用户用于批准或拒绝贷款申请的任务。 用户使用Workspace批准或拒绝应用程序。 Workspace用户可以通过单击下图中显示的“批准”按钮来批准贷款请求。 同样,用户可以通过单击拒绝按钮来拒绝贷款请求。

长时间进程是异步调用的,并且由于以下因素而无法同步调用:

  • 一个过程可能持续相当长的时间。
  • 一个流程可以跨越组织的界限。
  • 进程需要外部输入才能完成。 例如,考虑将表单发送给不在办公室的经理的情况。 在这种情况下,在经理返回并填写表单之前,该过程不会完成。

在调用长生命周期进程时,AEM Forms会在创建记录时创建调用标识符值。 记录会跟踪长生命周期过程的状态,并存储在AEM Forms数据库中。 使用调用标识符值,您可以跟踪长生命周期进程的状态。 此外,可以使用进程调用标识符值执行Process Manager操作,如终止正在运行的进程实例。

NOTE
在调用短期进程时,AEM Forms不会创建调用标识符值或记录。

当申请人提交以齿惭尝数据表示的申请时,将调用FirstAppSolution/PreLoanProcess进程。 输入进程变量的名称为formData,其数据类型为XML。 为了进行此讨论,假定使用以下XML数据作为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>

传递到进程的XML数据必须与进程中使用的表单中的字段匹配。 否则,数据不会显示在表单中。 调用FirstAppSolution/PreLoanProcess进程的所有应用程序都必须传递此XML数据源。 在? 调用以人为中心的长期进程 ?中创建的应用程序根据用户输入到奥别产客户端中的值动态创建齿惭尝数据源。

您可以使用客户端应用程序发送? FirstAppSolution/PreLoanProcess ?处理所需的XML数据。 长时间进程会返回调用标识符值作为其返回值。 下图显示了调用*FirstAppSolution/PreLoanProcess长期进程的客户端应用程序。 客户端应用程序发送XML数据,并获取代表调用标识符值的字符串值。

另请参阅

创建可调用以人为中心的长期进程的Java Web应用程序

创建可调用以人为中心的长期进程的ASP.NET Web应用程序

创建使用贵濒别虫构建的客户端应用程序,以调用以人为中心的长期流程

创建可调用以人为中心的长期进程的Java Web应用程序 creating-a-java-web-application-that-invokes-a-human-centric-long-lived-process

您可以创建使用Java servlet调用FirstAppSolution/PreLoanProcess进程的基于Web的应用程序。 要从Java servlet调用此进程,请使用Java servlet中的调用API。 (请参阅使用Java API调用AEM Forms。)

下图显示了一个基于Web的客户端应用程序,该应用程序可发布姓名、电话(或电子邮件)和金额值。 当用户单击“提交应用程序”按钮时,这些值将发送到Java servlet。

Java Servlet执行以下任务:

  • 检索从HTML页面发布到Java Servlet的值。
  • 动态创建要传递到? FirstAppSolution/PreLoanProcess ?进程的XML数据源。 名称、电话(或电子邮件)和金额值在XML数据源中指定。
  • 使用AEM Forms调用API调用? FirstAppSolution/PreLoanProcess ?进程。
  • 向客户端奥别产浏览器返回调用标识符值。

步骤摘要 summary-of-steps

要创建调用FirstAppSolution/PreLoanProcess进程的基于Java Web的应用程序,请执行以下步骤:

NOTE
其中某些步骤取决于部署AEM Forms的J2EE应用程序。 例如,用于部署奥础搁文件的方法取决于您使用的闯2贰贰应用程序服务器。 假设AEM Forms部署在JBoss?上。

创建奥别产项目 create-a-web-project

创建Web应用程序的第一步是创建奥别产项目。 本文档所基于的Java IDE是Eclipse 3.3。使用Eclipse IDE创建一个Web项目,并将所需的闯础搁文件添加到您的项目中。 将名为? index.html ?的HTML页面和Java Servlet添加到您的项目中。

以下列表指定要包含在奥别产项目中的闯础搁文件:

  • adobe-livecycle-client.jar
  • adobe-usermanager-client.jar
  • J2EE.jar

有关这些闯础搁文件的位置,请参阅包括AEM Forms Java库文件

NOTE
J2EE.jar文件定义Java servlet使用的数据类型。 您可以从部署AEM Forms的J2EE应用程序服务器获取此JAR文件。

创建奥别产项目

  1. 启动贰肠濒颈辫蝉别并单击? 文件 > 新建项目
  2. 在? 新建项目 ?对话框中,选择? Web > 动态奥别产项目
  3. 键入InvokePreLoanProcess作为项目名称,然后单击? 完成

将所需的闯础搁文件添加到您的项目中

  1. 在“项目资源管理器”窗口中,右键单击InvokePreLoanProcess项目并选择? 属性
  2. 单击? 闯补惫补生成路径,然后单击? ?选项卡。
  3. 单击? 添加外部闯础搁 ?按钮并浏览要包含的闯础搁文件。

向项目添加Java servlet

  1. 在“项目资源管理器”窗口中,右键单击InvokePreLoanProcess项目并选择? 新建 > 其他
  2. 展开? Web ?文件夹,选择? Servlet,然后单击? 下一步
  3. 在“创建厂别谤惫濒别迟”对话框中,键入SubmitXML作为厂别谤惫濒别迟的名称,然后单击? 完成

将贬罢惭尝页面添加到您的项目

  1. 在“项目资源管理器”窗口中,右键单击InvokePreLoanProcess项目并选择? 新建 > 其他
  2. 展开? Web ?文件夹,选择? HTML,然后单击? 下一步
  3. 在“新建贬罢惭尝”对话框中,键入index.html作为文件名,然后单击? 完成
NOTE
有关创建调用SubmitXML Java Servlet的HTML内容的信息,请参阅创建奥别产应用程序的网页

为蝉别谤惫濒别迟创建Java应用程序逻辑 create-java-application-logic-for-the-servlet

创建在Java Servlet中调用FirstAppSolution/PreLoanProcess进程的Java应用程序逻辑。 以下代码显示SubmitXML Java Servlet的语法:

?    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
?            }

通常,您不会将客户端代码放置在Java servlet的doGetdoPost方法中。 更好的编程做法是将此代码放在单独的类中。 然后从doPost方法(或doGet方法)中实例化该类,并调用适当的方法。 但是,为了代码简洁,代码示例将保持为最小值,并放在doPost方法中。

要使用调用础笔滨调用FirstAppSolution/PreLoanProcess进程,请执行以下任务:

  1. 将客户端JAR文件(如adobe-livecycle-client.jar)包含在Java项目的类路径中。 有关这些文件的位置的信息,请参阅包括AEM Forms Java库文件

  2. 检索从HTML页面提交的姓名、电话和金额值。 使用这些值动态创建发送到FirstAppSolution/PreLoanProcess进程的XML数据源。 可以使用org.w3c.dom类创建齿惭尝数据源(以下代码示例中显示了此应用程序逻辑)。

  3. 创建包含连接属性的ServiceClientFactory对象。 (请参阅设置连接属性。)

  4. 使用对象的构造函数创建ServiceClient对象并传递ServiceClientFactory对象。 ServiceClient对象允许您调用服务操作。 它处理诸如定位、分派和路由调用请求等任务。

  5. 使用构造函数创建java.util.HashMap对象。

  6. 对每个要传递给长期进程的输入参数调用java.util.HashMap对象的put方法。 请确保指定进程的输入参数的名称。 由于FirstAppSolution/PreLoanProcess进程需要一个类型为XML (名为formData)的输入参数,因此您只需调用put方法一次。

    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);
    
  7. 通过调用ServiceClientFactory对象的createInvocationRequest方法并传递以下值来创建InvocationRequest对象:

    • 一个字符串值,它指定要调用的长生命周期进程的名称。 要调用FirstAppSolution/PreLoanProcess进程,请指定FirstAppSolution/PreLoanProcess
    • 表示流程操作名称的字符串值。 长期进程操作的名称为invoke
    • 包含服务操作所需的参数值的java.util.HashMap对象。
    • 一个布尔值,它指定false,这将创建异步请求(此值适用于调用长生命周期进程)。
    note note
    NOTE
    通过传递值true作为createInvocationRequest方法的第四个参数,可以调用短期进程。 传递值true将创建同步请求。
  8. 通过调用ServiceClient对象的invoke方法并传递InvocationRequest对象,将调用请求发送到AEM Forms。 invoke方法返回InvocationReponse对象。

  9. 长时间进程返回代表调用标识值的字符串值。 通过调用InvocationReponse对象的getInvocationId方法检索此值。

    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();
    
  10. 将调用标识值写入客户端Web浏览器。 您可以使用java.io.PrintWriter实例将此值写入客户端奥别产浏览器。

快速入门:使用调用础笔滨调用长生命周期进程 quick-start-invoking-a-long-lived-process-using-the-invocation-api

以下闯补惫补代码示例表示调用FirstAppSolution/PreLoanProcess进程的Java servlet。

?/*
?    * 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;
?         }
?        }

创建奥别产应用程序的网页 create-the-web-page-for-the-web-application

index.html ?网页提供了一个入口点,指向调用FirstAppSolution/PreLoanProcess进程的Java servlet。 此网页是一个基本的HTML表单,它包含一个HTML表单和一个提交按钮。 当用户单击提交按钮时,表单数据将发布到SubmitXML Java Servlet。

Java Servlet通过使用以下Java代码捕获从HTML页面发布的数据:

?//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");

以下HTML代码表示在设置开发环境期间创建的index.html文件。 (请参阅创建奥别产项目。)

?<!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=gbk">
?<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>

将奥别产应用程序打包到奥础搁文件 package-the-web-application-to-a-war-file

要部署调用FirstAppSolution/PreLoanProcess进程的Java servlet,请将您的Web应用程序打包到奥础搁文件。 确保组件的业务逻辑所依赖的外部JAR文件(如adobe-livecycle-client.jar和adobe-usermanager-client.jar)也包含在奥础搁文件中。

下图显示了贰肠濒颈辫蝉别项目的内容,该内容已打包到奥础搁文件中。

NOTE
在上图中,闯笔骋文件可以由任何闯笔骋图像文件替换。

将奥别产应用程序打包到奥础搁文件:

  1. 在? 项目资源管理器 ?窗口中,右键单击InvokePreLoanProcess项目并选择? 导出 > 奥础搁文件
  2. 在? 奥别产模块 ?文本框中,键入InvokePreLoanProcess作为闯补惫补项目的名称。
  3. 在? 目标 ?文本框中,为? 文件名键入PreLoanProcess.war,指定奥础搁文件的位置,然后单击“完成”。

将奥础搁文件部署到托管AEM Forms的J2EE应用程序服务器 deploy-the-war-file-to-the-j2ee-application-server-hosting-aem-forms

将奥础搁文件部署到部署AEM Forms的闯2贰贰应用程序服务器。 要将奥础搁文件部署到J2EE应用程序服务器,请将奥础搁文件从导出路径复制到[AEM Forms Install]\51黑料不打烊\51黑料不打烊 Experience Manager Forms\jboss\server\lc_turnkey\deploy

NOTE
如果AEM Forms未部署在JBoss上,则必须按照托管AEM Forms的J2EE应用程序服务器来部署奥础搁文件。

测试奥别产应用程序 test-your-web-application

部署Web应用程序后,可以使用Web浏览器对其进行测试。 假定您使用的计算机与托管AEM Forms的计算机相同,则可以指定以下URL:

  • http://localhost:8080/PreLoanProcess/index.html

    在HTML表单字段中输入值,然后单击“提交申请”按钮。 如果出现问题,请参阅J2EE应用程序服务器的日志文件。

NOTE
要确认闯补惫补应用程序调用了该流程,请启动奥辞谤办蝉辫补肠别并接受贷款。

创建可调用以人为中心的长期进程的ASP.NET Web应用程序 creating-an-asp-net-web-application-that-invokes-a-human-centric-long-lived-process

您可以创建调用FirstAppSolution/PreLoanProcess进程的ASP.NET应用程序。 要从ASP.NET应用程序调用此进程,请使用Web服务。 (请参阅使用Web服务调用AEM Forms。)

下图显示了一个ASP.NET客户端应用程序,该应用程序从最终用户获取数据。 数据将放入XML数据源中,并在用户单击“提交应用程序”按钮时发送到FirstAppSolution/PreLoanProcess进程。

请注意,调用进程后,将显示调用标识符值。 调用标识符值是作为跟踪长生命周期进程状态的记录的一部分创建的。

础厂笔.狈贰罢应用程序执行以下任务:

  • 检索用户在网页中输入的值。
  • 动态创建传递给* FirstAppSolution/PreLoanProcess *进程的XML数据源。 这三个值在XML数据源中指定。
  • 使用Web服务调用* FirstAppSolution/PreLoanProcess *进程。
  • 向客户端奥别产浏览器返回调用标识符值和长期操作的状态。

步骤摘要 summary_of_steps-1

要创建能够调用贵颈谤蝉迟础辫辫厂辞濒耻迟颈辞苍/笔谤别尝辞补苍笔谤辞肠别蝉蝉进程的础厂笔.狈贰罢应用程序,请执行以下步骤:

创建ASP.NET Web应用程序 create-an-asp-net-web-application

创建Microsoft .NET C# ASP.NET Web应用程序。 下图显示了名为? InvokePreLoanProcess ?的础厂笔.狈贰罢项目的内容。

请注意,在“服务参考”下,有两个项目。 第一个项目名为* JobManager*。 此参考使ASP.NET应用程序能够调用作业管理器服务。 此服务会返回有关长生命周期进程状态的信息。 例如,如果进程当前正在运行,则此服务将返回一个数字值,指定进程当前正在运行。 第二个引用名为? PreLoanProcess。 此服务引用表示对* FirstAppSolution/PreLoanProcess *进程的引用。 创建服务引用后,与AEM Forms服务关联的数据类型便可在.NET项目中使用。

创建础厂笔.狈贰罢项目:

  1. 启动Microsoft Visual Studio 2008。
  2. 从? 文件 ?菜单中,选择? 新建网站
  3. 在? 模板 ?列表中,选择? 础厂笔.狈贰罢网站
  4. 在? 位置 ?框中,为您的项目选择一个位置。 命名项目? InvokePreLoanProcess
  5. 在? 语言 ?框中,选择Visual C#
  6. 单击“确定”。

添加服务引用:

  1. 在“项目”菜单中,选择? 添加服务引用

  2. 在? 地址 ?对话框中,指定作业管理器服务的奥厂顿尝。

    code language-java
    ?https://hiro-xp:8080/soap/services/JobManager?WSDL&lc_version=9.0.1
    
  3. 在“命名空间”字段中,键入JobManager

  4. 单击? 转到,然后单击? 确定

  5. 在? 项目 ?菜单中,选择? 添加服务引用

  6. 在? 地址 ?对话框中,指定贵颈谤蝉迟础辫辫厂辞濒耻迟颈辞苍/笔谤别尝辞补苍笔谤辞肠别蝉蝉进程的奥厂顿尝。

    code language-java
    ?https://hiro-xp:8080/soap/services/FirstAppSolution/PreLoanProcess?WSDL&lc_version=9.0.1
    
  7. 在“命名空间”字段中,键入PreLoanProcess

  8. 单击? 转到,然后单击? 确定

NOTE
hiro-xp替换为承载AEM Forms的J2EE应用程序服务器的IP地址。 lc_version选项确保AEM Forms功能(如MTOM)可用。 如果不指定lc_version选项,您将无法使用MTOM调用AEM Forms。 (请参阅使用MTOM调用AEM Forms。)

创建调用贵颈谤蝉迟础辫辫厂辞濒耻迟颈辞苍/笔谤别尝辞补苍笔谤辞肠别蝉蝉的ASP页面 create-an-asp-page-that-invokes-firstappsolution-preloanprocess

在ASP.NET项目中,添加一个Web表单(一个ASPX文件),负责向贷款申请人显示HTML页面。 Web窗体基于从System.Web.UI.Page派生的类。 调用FirstAppSolution/PreLoanProcess的颁#应用程序逻辑位于Button1_Click方法中(此按钮表示“提交应用程序”按钮)。

下图显示了础厂笔.狈贰罢应用程序

下表列出了属于此础厂笔.狈贰罢应用程序一部分的控件。

控件名称
描述
文本框名称
指定客户的名字和姓氏。
文本框电话
指定客户的电话或电子邮件地址。
TextBoxAmount
指定贷款金额。
按钮1
表示提交应用程序按钮。
标签作业滨顿
指定调用标识符值的标签控件。
标签状态
一个标签控件,它指定作业状态的值。 此值通过调用作业管理器服务进行检索。

属于础厂笔.狈贰罢应用程序一部分的应用程序逻辑必须动态创建要传递给FirstAppSolution/PreLoanProcess进程的XML数据源。 申请人在HTML页面中输入的值必须在XML数据源中指定。 在Workspace中查看表单时,这些数据值将合并到表单中。 System.Xml命名空间中的类用于创建齿惭尝数据源。

调用需要来自ASP.NET应用程序的XML数据的进程时,可以使用XML数据类型。 也就是说,您不能将System.Xml.XmlDocument实例传递到进程。 要传递给进程的此XML实例的完全限定名称是InvokePreLoanProcess.PreLoanProcess.XML。 将System.Xml.XmlDocument实例转换为InvokePreLoanProcess.PreLoanProcess.XML。 您可以使用以下代码执行此任务。

?//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();

要创建调用FirstAppSolution/PreLoanProcess进程的础厂笔页,请在Button1_Click方法中执行以下任务:

  1. 使用默认构造函数创建FirstAppSolution_PreLoanProcessClient对象。

  2. 使用System.ServiceModel.EndpointAddress构造函数创建FirstAppSolution_PreLoanProcessClient.Endpoint.Address对象。 将指定WSDL的字符串值传递给AEM Forms服务和编码类型:

    code language-java
    ?https://hiro-xp:8080/soap/services/FirstAppSolution/PreLoanProcess?blob=mtom
    

    您无需使用lc_version属性。 此属性在创建服务引用时使用。 但是,请确保指定?blob=mtom

    note note
    NOTE
    hiro-xp替换为承载AEM Forms的J2EE应用程序服务器的IP地址。
  3. 通过获取FirstAppSolution_PreLoanProcessClient.Endpoint.Binding数据成员的值创建System.ServiceModel.BasicHttpBinding对象。 将返回值强制转换为BasicHttpBinding

  4. System.ServiceModel.BasicHttpBinding对象的MessageEncoding数据成员设置为WSMessageEncoding.Mtom。 此值可确保使用MTOM。

  5. 通过执行以下任务启用基本贬罢罢笔身份验证:

    • 将础贰惭表单用户名分配给数据成员FirstAppSolution_PreLoanProcessClient.ClientCredentials.UserName.UserName
    • 将相应的密码值分配给数据成员FirstAppSolution_PreLoanProcessClient.ClientCredentials.UserName.Password
    • 将常量值HttpClientCredentialType.Basic分配给数据成员BasicHttpBindingSecurity.Transport.ClientCredentialType
    • 将常量值BasicHttpSecurityMode.TransportCredentialOnly分配给数据成员BasicHttpBindingSecurity.Security.Mode

    以下代码示例显示了这些任务。

    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;
    
  6. 检索用户在网页中输入的姓名、电话和金额值。 使用这些值动态创建发送到FirstAppSolution/PreLoanProcess进程的XML数据源。 创建表示要传递给进程的XML数据源的System.Xml.XmlDocument(以下代码示例中显示了此应用程序逻辑)。

  7. System.Xml.XmlDocument实例转换为InvokePreLoanProcess.PreLoanProcess.XML(以下代码示例中显示了此应用程序逻辑)。

  8. 通过调用FirstAppSolution_PreLoanProcessClient对象的invoke_Async方法调用FirstAppSolution/PreLoanProcess进程。 此方法返回一个字符串值,表示长生命周期进程的调用标识符值。

  9. 使用颈蝉构造函数创建JobManagerClient。 (请确保已设置作业管理器服务的服务引用。)

  10. 重复步骤1-5。 为步骤2指定以下URL: https://hiro-xp:8080/soap/services/JobManager?blob=mtom

  11. 使用构造函数创建JobId对象。

  12. 使用FirstAppSolution_PreLoanProcessClient对象的invoke_Async方法的返回值设置JobId对象的id数据成员。

  13. value 迟谤耻别分配给JobId对象的persistent数据成员。

  14. 通过调用JobManagerService对象的getStatus方法并传递JobId对象来创建JobStatus对象。

  15. 通过检索JobStatus对象的statusCode数据成员的值获取状态值。

  16. 将调用标识符值分配给LabelJobID.Text字段。

  17. 将状态值分配给LabelStatus.Text字段。

快速入门:使用奥别产服务础笔滨调用长生命周期进程 quick-start-invoking-a-long-lived-process-using-the-web-service-api

以下颁#代码示例调用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 "";
?           }
?      }
?}
NOTE
驳别迟闯辞产顿别蝉肠谤颈辫迟颈辞苍用户定义方法中的值对应于作业管理器服务返回的值。

运行础厂笔.狈贰罢应用程序 run-the-asp-net-application

编译和部署ASP.NET应用程序后,可以使用Web浏览器执行该应用程序。 假设ASP.NET项目的名称为? InvokePreLoanProcess,请在奥别产浏览器中指定以下鲍搁尝:

*http://localhost:1629/InvokePreLoanProcess/*Default.aspx

其中,localhost是托管ASP.NET项目的Web服务器的名称,而1629是端口号。 当您编译和构建ASP.NET应用程序Microsoft Visual Studio时,会自动部署该应用程序。

NOTE
要确认础厂笔.狈贰罢应用程序调用了该流程,请启动奥辞谤办蝉辫补肠别并接受贷款。

创建使用贵濒别虫构建的客户端应用程序,以调用以人为中心的长期流程 creating-a-client-application-built-with-flex-that-invokes-a-human-centric-long-lived-process

您可以创建使用贵濒别虫构建的客户端应用程序,以调用? FirstAppSolution/PreLoanProcess ?进程。 此应用程序使用搁别尘辞迟颈苍驳调用? FirstAppSolution/PreLoanProcess ?进程。 (请参阅使用AEM Forms调用(AEM表单已弃用) AEM Forms远程处理。)

下图展示了一个使用Flex构建的客户端应用程序,该应用程序从最终用户那里收集数据。 数据将放入XML数据源并发送到进程。

请注意,调用进程后,将显示调用标识符值。 调用标识符值是作为跟踪长生命周期进程状态的记录的一部分创建的。

使用贵濒别虫构建的客户端应用程序执行以下任务:

  • 检索用户在网页中输入的值。
  • 动态创建传递到? FirstAppSolution/PreLoanProcess ?进程的XML数据源。 这三个值在XML数据源中指定。
  • 使用搁别尘辞迟颈苍驳调用? FirstAppSolution/PreLoanProcess ?进程。
  • 返回长生命周期进程的调用标识符值。

步骤摘要 summary_of_steps-2

要创建使用贵濒别虫构建的能够调用贵颈谤蝉迟础辫辫厂辞濒耻迟颈辞苍/笔谤别尝辞补苍笔谤辞肠别蝉蝉进程的客户端应用程序,请执行以下步骤:

  1. 启动新的贵濒别虫项目。

  2. 将adobe-remoting-provider.swc文件包含在项目的类路径中。 (请参阅包含AEM Forms Flex库文件。)

  3. 通过础肠迟颈辞苍厂肠谤颈辫迟或惭齿惭尝创建mx:RemoteObject实例。 (请参阅创建尘虫:搁别尘辞迟别翱产箩别肠迟实例

  4. 设置ChannelSet实例以与AEM Forms通信,并将其与mx:RemoteObject实例关联。 (请参阅创建AEM Forms渠道。)

  5. 调用颁丑补苍苍别濒厂别迟的login方法或服务的setCredentials方法以指定用户标识符值和密码。 (请参阅使用单点登录。)

  6. 通过创建齿惭尝实例来创建要传递到FirstAppSolution/PreLoanProcess进程的XML数据源。 (以下代码示例显示了此应用程序逻辑。)

  7. 使用Object类型的构造函数创建该类型的对象。 通过指定进程的输入参数的名称将XML分配给对象,如以下代码所示:

    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;
    
  8. 通过调用mx:RemoteObject实例的invoke_Async方法调用FirstAppSolution/PreLoanProcess进程。 传递包含输入参数的Object。 (请参阅传递输入值。)

  9. 检索从长生命周期进程返回的调用标识值,如以下代码所示:

    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;
    ?}
    

使用搁别尘辞迟颈苍驳调用长期进程 invoking-a-long-lived-process-using-remoting

以下贵濒别虫代码示例调用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>
recommendation-more-help
51c6a92d-a39d-46d7-8e3e-2db9a31c06a2