Show Menu
主题×

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

您可以使用以下客户端应用程序以编程方式调用在Workbench中创建的以人为中心的长寿命进程:
调用的长期进程名为 FirstAppSolution/PreLoanProcess 。 您可以按照创建第一个AEM Forms应用程序中指 定的教程创建此过程
以人为中心的流程包括用户可使用Workspace对其进行响应的任务。 例如,使用Workbench,您可以创建一个流程,让银行经理批准或拒绝贷款申请。 下图显示了FirstAppSolution/ PreLoanProcess的过程
FirstAppSolution/ PreLoanProcess 进程接受一个名为 formData 的输入参数,其数据类型为XML。 XML数据与名为PreLoanForm.xdp的表单设 计合并在一起 。 下图显示了一个表单,它表示分配给用户以批准或拒绝贷款申请的任务。 用户使用Workspace批准或拒绝应用程序。 Workspace用户可以单击下图所示的“批准”按钮来批准贷款请求。 同样,用户也可以通过单击拒绝按钮来拒绝贷款请求。
长期进程被异步调用,并且不能同步调用,原因如下:
  • 一个过程可以跨越大量时间。
  • 一个流程可以跨越组织界限。
  • 进程需要外部输入才能完成。 例如,考虑将表单发送给不在办公室的经理的情况。 在这种情况下,只有经理返回并填写表单后,该过程才会完成。
当调用长期进程时,AEM Forms会创建一个调用标识符值,作为创建记录的一部分。 该记录会跟踪长寿命进程的状态,并存储在AEM Forms数据库中。 使用调用标识符值,您可以跟踪长寿命进程的状态。 此外,您可以使用进程调用标识符值来执行进程管理器操作,如终止正在运行的进程实例。
在调用短期进程时,AEM Forms不会创建调用标识符值或记录。
当申 FirstAppSolution/PreLoanProcess 请人提交以XML数据表示的申请时,调用该过程。 输入进程变量的名称为, 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应用程序

您可以创建一个基于Web的应用程序,它使用Java servlet调用该 FirstAppSolution/PreLoanProcess 过程。 要从Java servlet调用此进程,请使用Java servlet中的调用API。 (请参 阅使用Java API调用AEM表单 。)
下图显示了一个基于Web的客户端应用程序,它发布名称、电话(或电子邮件)和金额值。 当用户单击“提交应用程序”按钮时,这些值将发送到Java servlet。
Java servlet执行以下任务:
  • 检索从HTML页发布到Java servlet的值。
  • 动态创建XML数据源以传递到 FirstAppSolution/PreLoanProcess进程 。 名称、电话(或电子邮件)和金额值在XML数据源中指定。
  • 使用 AEM Forms调用API调用FirstAppSolution/PreLoanProcess 进程。
  • 将调用标识符值返回给客户端Web浏览器。

步骤摘要

要创建调用该过程的基于Java Web的应用程 FirstAppSolution/PreLoanProcess 序,请执行以下步骤:
其中某些步骤取决于部署了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 ,然后单击“下 一步 ”。
  3. 在“创建Servlet”对话框中,键 SubmitXML 入servlet的名称,然后单击“完 成”
将HTML页面添加到项目
  1. 在“项目浏览器”窗口中,右键单击项目,然 InvokePreLoanProcess 后选择“新 >其 ”。
  2. 展开 Web文件夹 ,选择 HTML ,然后单击“下 一步 ”。
  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或方 doGet 法中 doPost 。 一个更好的编程实践是将此代码放在一个单独的类中。 然后,从方法(或方法)中实 doPost 例化类,并 doGet 调用相应的方法。 但是,对于代码简捷性,代码示例保持为最小值并放置在方法 doPost 中。
要使用调 FirstAppSolution/PreLoanProcess 用API调用进程,请执行以下任务:
  1. 在Java项目的类路径中包含客户端JAR文件,如adobe-livecycle-client.jar。 有关这些文件的位置的信息,请参 阅包括AEM Forms Java库文件
  2. 检索从HTML页面提交的名称、电话和金额值。 使用这些值动态创建发送到进程的XML数据 FirstAppSolution/PreLoanProcess 源。 可以使用 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. 通过调 InvocationRequest 用对象的方法并 ServiceClientFactory 传递以 createInvocationRequest 下值来创建对象:
    • 一个字符串值,它指定要调用的长寿命进程的名称。 要调用该 FirstAppSolution/PreLoanProcess 进程,请指定 FirstAppSolution/PreLoanProcess
    • 表示进程操作名称的字符串值。 长期处理操作的名称为 invoke
    • java.util.HashMap 含服务操作所需的参数值的对象。
    • 一个布尔值,它指 false 定创建异步请求(此值适用于调用长寿命进程)。
    通过将值true作为createInvocationRequest方法的第四个参数传递,可以调用短时进程。 传递值true将创建同步请求。
  8. 通过调用对象的方法并传递对象,将调 ServiceClient 用请求发 invoke 送到AEM Forms InvocationRequest 。 该方 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代码示例表示调用该进程的Java servlet 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 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 网页为调用进程的Java servlet提供一个入口 FirstAppSolution/PreLoanProcess 点。 此网页是一个基本的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文件

要部署调用该进程的Java servlet FirstAppSolution/PreLoanProcess ,请将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. 在“目 ”文本框中,键 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应用程序

您可以创建调用该进程的ASP.NET应用 FirstAppSolution/PreLoanProcess 程序。 要从ASP.NET应用程序调用此过程,请使用Web服务。 (请参 阅使用Web服务调用AEM表单 。)
下图显示了从最终用户处获取数据的ASP.NET客户端应用程序。 数据将放入XML数据源中,并在用户单击“提交应 FirstAppSolution/PreLoanProcess 用程序”按钮时发送到进程。
注意,调用进程后,将显示调用标识符值。 将调用标识符值创建为记录的一部分,该记录跟踪长寿命进程的状态。
ASP.NET应用程序执行以下任务:
  • 检索用户在网页中输入的值。
  • 动态创建一个XML数据源,它被传递到* FirstAppSolution/PreLoanProcess *进程。 这三个值在XML数据源中指定。
  • 使用Web服务调用* FirstAppSolution/PreLoanProcess *进程。
  • 将调用标识符值和长期操作的状态返回给客户端Web浏览器。

步骤摘要

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

创建ASP.NET Web应用程序

创建Microsoft .NET C# ASP.NETWeb 应用程序。 下图显示了名为InvokePreLoanProcess的ASP.NET项目的 内容
注意,在“服务引用”下,有两个项目。 第一个项目名为* JobManager*。 此引用使ASP.NET应用程序能够调用作业管理器服务。 此服务返回有关长期进程状态的信息。 例如,如果进程当前正在运行,则此服务将返回一个指定进程当前正在运行的数值。 第二个引用名​ 为PreLoanProcess 。 此服务参考代表对* FirstAppSolution/PreLoanProcess *进程的参考。 创建服务参考后,可以在。NET项目中使用与AEM Forms服务关联的数据类型。
创建ASP.NET项目:
  1. 开始Microsoft Visual Studio 2008。
  2. 从“文 ”菜单中,选 择“新建 , 网站”
  3. 在“模 ”列表中 ,选 ​择“ASP.NET网站”。
  4. 在“位 ”框中,选择项目的位置。 将您的项目命 名为InvokePreLoanProcess
  5. 在“语 ”框中,选择“可视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表单 。)

创建调用FirstAppSolution/PreLoanProcess的ASP页

在ASP.NET项目中,添加一个Web表单(ASPX文件),该表单负责向贷款申请人显示HTML页面。 Web表单基于派生自的类 System.Web.UI.Page 。 调用的C#应用程序逻辑 FirstAppSolution/PreLoanProcess 位于方法中( Button1_Click 此按钮表示“提交应用程序”按钮)。
下图显示了ASP.NET应用程序
下表列表了属于此ASP.NET应用程序的控件。
控件名称
描述
TextBoxName
指定客户的名和姓。
TextBoxPhone
指定客户的电话或电子邮件地址。
TextBoxAmount
指定贷款金额。
Button1
表示“提交应用程序”按钮。
LabelJobID
一个Label控件,它指定调用标识符值的值。
LabelStatus
指定作业状态值的“标签”控件。 通过调用作业管理器服务检索此值。
作为ASP.NET应用程序一部分的应用程序逻辑必须动态创建XML数据源以传递给该过 FirstAppSolution/PreLoanProcess 程。 必须在XML数据源中指定申请人在HTML页中输入的值。 在Workspace中查看表单时,这些数据值会合并到表单中。 位于命名空间中的类 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();

要创建调用该进程的ASP页 FirstAppSolution/PreLoanProcess 面,请在方法中执行以下 Button1_Click 任务:
  1. 使用对 FirstAppSolution_PreLoanProcessClient 象的默认构造函数创建对象。
  2. 使用构 FirstAppSolution_PreLoanProcessClient.Endpoint.Address 造函数创建对 System.ServiceModel.EndpointAddress 象。 将指定WSDL的字符串值传递给AEM Forms服务和编码类型:
     https://hiro-xp:8080/soap/services/FirstAppSolution/PreLoanProcess?blob=mtom
    
    
    您无需使用该属 lc_version 性。 在创建服务引用时,会使用此属性。 但是,请确保指定 ?blob=mtom
    hiro-xp 替换为承载AEM Forms的J2EE应用程序服务器的IP地址。
  3. 通过 System.ServiceModel.BasicHttpBinding 获取数据成员的值创建 FirstAppSolution_PreLoanProcessClient.Endpoint.Binding 对象。 将返回值转换为 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. 检索用户在网页中输入的名称、电话和金额值。 使用这些值动态创建发送到进程的XML数据 FirstAppSolution/PreLoanProcess 源。 创建一 System.Xml.XmlDocument 个表示要传递到进程的XML数据源(此应用程序逻辑如下面的代码示例所示)。
  7. 将实 System.Xml.XmlDocument 例转 InvokePreLoanProcess.PreLoanProcess.XML 换为(此应用程序逻辑如下面的代码示例所示)。
  8. 通过调 FirstAppSolution/PreLoanProcess 用对象的方 FirstAppSolution_PreLoanProcessClient 法调用进 invoke_Async 程。 此方法返回一个字符串值,它表示长寿命进程的调用标识符值。
  9. 使用is构 JobManagerClient 造函数创建。 (确保您已经为作业管理器服务设置了服务引用。)
  10. 重复步骤1-5。 为步骤2指定以下URL: https://hiro-xp:8080/soap/services/JobManager?blob=mtom .
  11. 使用对 JobId 象的构造函数创建对象。
  12. 使用对 JobId 象方 id 法的返回值设置对 FirstAppSolution_PreLoanProcessClient 象的数据成 invoke_Async 员。
  13. 为对 value 象的数据 JobId 成员指定 persistent true。
  14. 通过调 JobStatus 用对象的方 JobManagerService 法并传递对 getStatus 象来创建对 JobId 象。
  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表单已弃用)AEM Forms Remoting调用AEM Forms 。)
下图显示了一个使用Flex构建的从最终用户收集数据的客户端应用程序。 数据被放入XML数据源中并发送到进程。
注意,调用进程后,将显示调用标识符值。 将调用标识符值创建为记录的一部分,该记录跟踪长寿命进程的状态。
使用Flex构建的客户端应用程序执行以下任务:
  • 检索用户在网页中输入的值。
  • 动态创建传递到 FirstAppSolution/PreLoanProcess进程的XML数据源 。 这三个值在XML数据源中指定。
  • 通过使用 远程处理调用FirstAppSolution/PreLoanProcess 进程。
  • 返回长期进程的调用标识符值。

步骤摘要

要创建能够调用FirstAppSolution/PreLoanProcess进程的使用Flex构建的客户端应用程序,请执行以下步骤:
  1. 开始新的Flex项目。
  2. 在项目的类路径中包含adobe-remoting-provider.swc文件。 (请参 阅包括AEM Forms Flex库文件 。)
  3. 通过ActionScript mx:RemoteObject 或MXML创建实例。 (请参 阅创建mx:RemoteObject实例 )
  4. 设置一个 ChannelSet 实例以与AEM Forms通信,然后将其与该实例关 mx:RemoteObject 联。 (请参 阅创建AEM表单渠道 。)
  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. 通过调 FirstAppSolution/PreLoanProcess 用实例的方 mx:RemoteObject 法调用进 invoke_Async 程。 传递包 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>