调用以人为中心的长寿命进程

您可以使用以下客户端应用程序以编程方式调用在Workbench中创建的以人为中心的长生命周期流程:

调用的长期进程名为​FirstAppSolution/PreLoanProcess。 您可以按照创建您的第一个AEM Forms应用程序中指定的教程创建此过程。

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

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

由于以下因素,可异步调用长生命周期进程,且无法同步调用:

  • 流程可以跨越大量时间。
  • 流程可以跨组织边界。
  • 进程需要外部输入才能完成。 例如,假设某个表单被发送给不在办公室的经理。 在这种情况下,在管理器返回并填写表单之前,该过程不会完成。

在调用长生命周期进程时,AEM Forms会创建调用标识符值,以作为创建记录的一部分。 该记录跟踪长寿命进程的状态,并存储在AEM Forms数据库中。 使用调用标识符值,可以跟踪长生命周期进程的状态。 此外,您还可以使用进程调用标识符值来执行进程管理器操作,如终止正在运行的进程实例。

注意

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

当申请人提交以XML数据表示的申请时,将调用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数据源。 在​调用以人为中心的长寿命进程​中创建的应用程序会根据用户输入到Web客户端的值动态创建XML数据源。

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

另请参阅

创建一个Java Web应用程序,该应用程序会调用以人为中心的长寿过程

创建ASP.NET Web应用程序,该应用程序调用以人为中心的长生命周期流程

创建使用Flex构建的客户端应用程序,该应用程序会调用以人为中心的长寿过程

创建Java Web应用程序,该应用程序调用以人为中心的长生命周期进程

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

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

Java Servlet执行以下任务:

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

步骤的摘要

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

  1. 创建Web项目
  2. 为servlet创建Java应用程序逻辑
  3. 为Web应用程序创建网页
  4. 将Web应用程序打包到WAR文件
  5. 将WAR文件部署到托管AEM Forms的J2EE应用程序服务器
  6. 测试Web应用程序
注意

其中某些步骤取决于部署了AEM Forms的J2EE应用程序。 例如,您用于部署WAR文件的方法取决于您所使用的J2EE应用程序服务器。 假定AEM Forms部署在JBoss®上。

创建Web项目

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

以下列表指定要包含在Web项目中的JAR文件:

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

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

注意

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

创建Web项目

  1. 启动Eclipse并单击​文件 > 新建项目
  2. 在​新建项目​对话框中,选择​Web > 动态Web项目
  3. 键入InvokePreLoanProcess作为项目名称,然后单击​完成

将所需的JAR文件添加到您的项目中

  1. 在“项目资源管理器”窗口中,右键单击InvokePreLoanProcess项目并选择​属性
  2. 单击​Java构建路径,然后单击​​选项卡。
  3. 单击​添加外部JAR​按钮并浏览到要包含的JAR文件。

将Java Servlet添加到您的项目

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

将HTML页面添加到项目

  1. 在“项目资源管理器”窗口中,右键单击InvokePreLoanProcess项目,然后选择​新建 > 其他
  2. 展开​Web​文件夹,选择​HTML,然后单击​Next
  3. 在“新建HTML”对话框中,键入index.html作为文件名,然后单击​完成
注意

有关创建调用SubmitXML Java Servlet的HTML内容的信息,请参阅为Web应用程序创建网页

为servlet创建Java应用程序逻辑

在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方法中。

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

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

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

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

  4. 使用其构造函数创建ServiceClient对象,并传递ServiceClientFactory对象。 ServiceClient对象允许您调用服务操作。 它处理诸如查找、调度和路由调用请求等任务。

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

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

     //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,用于创建异步请求(此值适用于调用长生命周期进程)。
    注意

    通过将值true作为createInvocationRequest方法的第四个参数传递,可以调用短时的进程。传递值true会创建同步请求。

  8. 通过调用ServiceClient对象的invoke方法并传递InvocationRequest对象,将调用请求发送到AEM Forms。 invoke方法返回一个InvocationReponse对象。

  9. 长生命周期进程返回表示调用标识值的字符串值。 通过调用InvocationReponse对象的getInvocationId方法来检索此值。

     //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实例将此值写入客户端Web浏览器。

快速入门:使用调用API调用长生命周期的进程

以下Java代码示例表示调用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 located 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 new 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;
          }
         }

为Web应用程序创建网页

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文件。 (请参阅创建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>

将Web应用程序打包到WAR文件

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

下图显示了Eclipse项目的内容,该内容已打包到WAR文件中。

注意

在上图中,JPG文件可被任何JPG图像文件替换。

将Web应用程序打包到WAR文件:

  1. 在​项目资源管理器​窗口中,右键单击InvokePreLoanProcess项目并选择​导出 > WAR文件
  2. 在​Web模块​文本框中,键入InvokePreLoanProcess作为Java项目的名称。
  3. 在​Destination​文本框中,键入​文件名的PreLoanProcess.war,指定WAR文件的位置,然后单击“完成”。

将WAR文件部署到托管AEM Forms的J2EE应用程序服务器

将WAR文件部署到部署了AEM Forms的J2EE应用程序服务器。 要将WAR文件部署到J2EE应用程序服务器,请将WAR文件从导出路径复制到[AEM Forms Install]\Adobe\Adobe Experience Manager Forms\jboss\server\lc_turnkey\deploy

注意

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

测试Web应用程序

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

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

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

注意

要确认Java应用程序调用了该过程,请启动Workspace并接受贷款。

创建ASP.NET Web应用程序,该应用程序调用以人为中心的长生命周期进程

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

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

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

ASP.NET应用程序执行以下任务:

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

步骤的摘要

要创建能够调用FirstAppSolution/PreLoanProcess进程的ASP.NET应用程序,请执行以下步骤:

  1. 创建ASP.NET Web应用程序
  2. 创建调用FirstAppSolution/PreLoanProcess的ASP页面
  3. 运行ASP.NET应用程序

创建ASP.NET Web应用程序

创建Microsoft .NET C# ASP.NET Web应用程序。 下图显示了名为​InvokePreLoanProcess​的ASP.NET项目的内容。

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

创建ASP.NET项目:

  1. 启动Microsoft Visual Studio 2008。
  2. 从​文件​菜单中,选择​新建网站
  3. 在​模板​列表中,选择​ASP.NET网站
  4. 在​位置​框中,选择项目的位置。 将项目命名为​InvokePreLoanProcess
  5. 在​语言​框中,选择Visual C#
  6. 单击确定。

添加服务引用:

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

  2. 在​地址​对话框中,为作业管理器服务指定WSDL。

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

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

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

  6. 在​地址​对话框中,将WSDL指定到FirstAppSolution/PreLoanProcess进程。

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

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

注意

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

创建调用FirstAppSolution/PreLoanProcess的ASP页面

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

下图显示了ASP.NET应用程序

下表列出了属于此ASP.NET应用程序的控件。

控件名称

描述

TextBoxName

指定客户的名字和姓氏。

TextBoxPhone

指定客户的电话或电子邮件地址。

TextBoxAmount

指定贷款金额。

按钮1

表示“提交应用程序”按钮。

LabelJobID

一个标签控件,用于指定调用标识符值的值。

LabelStatus

用于指定作业状态值的标签控件。 通过调用作业管理器服务来检索此值。

作为ASP.NET应用程序一部分的应用程序逻辑必须动态创建XML数据源以传递给FirstAppSolution/PreLoanProcess进程。 必须在XML数据源中指定申请人在HTML页面中输入的值。 在工作区中查看表单时,这些数据值会合并到表单中。 位于System.Xml命名空间中的类用于创建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进程的ASP页,请在Button1_Click方法中执行以下任务:

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

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

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

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

    注意

    hiro-xp替换为托管AEM Forms的J2EE应用程序服务器的IP地址。

  3. 通过获取FirstAppSolution_PreLoanProcessClient.Endpoint.Binding数据成员的值,创建System.ServiceModel.BasicHttpBinding对象。 将返回值转换为BasicHttpBinding

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

  5. 通过执行以下任务,启用基本HTTP身份验证:

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

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

     //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数据源。 创建一个System.Xml.XmlDocument,表示要传递到进程的XML数据源(以下代码示例中显示了此应用程序逻辑)。

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

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

  9. 使用is构造函数创建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 true分配给JobId对象的persistent数据成员。

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

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

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

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

快速入门:使用Web服务API调用长期的进程

以下C#代码示例将调用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 "";
            }
       }
 }
 
注意

getJobDescription用户定义的方法中的值与作业管理器服务返回的值相对应。

运行ASP.NET应用程序

编译和部署ASP.NET应用程序后,可以使用Web浏览器执行它。 假设ASP.NET项目的名称为​InvokePreLoanProcess,请在Web浏览器中指定以下URL:

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

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

注意

要确认ASP.NET应用程序调用了该过程,请启动Workspace并接受贷款。

创建使用Flex构建的客户端应用程序,该应用程序会调用以人为中心的长生命周期进程

您可以创建一个使用Flex构建的客户端应用程序,以调用​FirstAppSolution/PreLoanProcess​进程。 此应用程序使用Remoting调用​FirstAppSolution/PreLoanProcess​进程。 (请参阅使用调用AEM Forms(AEM表单已弃用)AEM Forms Remoting。)

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

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

使用Flex构建的客户端应用程序将执行以下任务:

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

步骤的摘要

要创建使用Flex构建的能够调用FirstAppSolution/PreLoanProcess流程的客户端应用程序,请执行以下步骤:

  1. 启动新的Flex项目。

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

  3. 通过ActionScript或MXML创建mx:RemoteObject实例。 (请参阅创建mx:RemoteObject实例

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

  5. 调用ChannelSet的login方法或服务的setCredentials方法以指定用户标识符值和密码。 (请参阅使用单点登录。)

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

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

     //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. 检索从长生命周期进程返回的调用标识值,如以下代码所示:

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

使用Remoting调用长期进程

以下Flex代码示例将调用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>
 

在此页面上