Crear el flujo de mensajes de petición de transferencia bancaria

Utilice las instrucciones siguientes para crear el flujo de mensajes de petición de transferencia bancaria.

  1. Cree un nuevo flujo de mensajes:
    1. Pulse el botón derecho del ratón en el proyecto de Message Broker existente, SCANodesSample, pulse Nuevo > Flujo de mensajes.
    2. Establezca Nombre de flujo de mensajes en BankTransferRequest, pulse Finalizar.
  2. En el Editor de flujos de mensajes, añada y renombre los nodos que se listan en la siguiente tabla.

    Tipo de nodo Nombre de nodo
    HTTPInput HTTP Input
    JavaCompute SetupTransferRequest
    SCAAsyncRequest SCA Asynchronous Request
    SCAAsyncResponse SCA Asynchronous Response
    JavaCompute SetupTransferReply
    JavaCompute SetupTransferFailedReply
    HTTPReply HTTP Reply

  3. Conecte los nodos tal como se describe en la siguiente tabla.

    Nombre de nodo Terminal Conectar a este nodo
    HTTP Input Out SetupTransferRequest
    SetupTransferRequest Failure (de anomalías) SetupTransferFailedReply
    SetupTransferFailedReply Out HTTP Reply
    SetupTransferRequest Out SCA Asynchronous Request
    SCA Asynchronous Response Out SetupTransferReply
    SetupTransferReply Out HTTP Reply
  4. Personalice el nodo HTTP Input:
    1. Pulse con el botón derecho del ratón en el nodo HTTP Input, pulse Propiedades.
    2. Pulse Básico, establezca Sufijo de vía de acceso para URL en /TransferRequestSample
    3. Pulse Análisis de mensaje de entrada. Para la propiedad Dominio del mensaje, seleccione MIME de la lista.
  5. Personalice el nodo SetupTransferRequest:
    1. Efectúe una doble pulsación en el nodo SetupTransferRequest, asegúrese de que el Nombre de proyecto sea SCANodesSampleJava y pulse Siguiente.
    2. Asegúrese de que Carpetas origen en la vía de construcción y Carpeta de salida predeterminada contengan SCANodesSampleJava, pulse Siguiente.
    3. Establezca Paquete en sca.broker.sample.banktransfer, pulse Siguiente.
    4. Seleccione la plantilla Crear clase de mensaje, pulse Finalizar.
    5. Pulse el botón derecho del ratón en el nodo SetupTransferRequest, pulse Abrir Java.
    6. Añada la sentencia de importación siguiente:
      import java.math.BigDecimal;
      		
    7. Añada el código Java siguiente:
      //Get the incoming MIME parts
      MbElement inRoot = inMessage.getRootElement();
      MbElement inMime = inRoot.getFirstElementByPath("MIME");
      MbElement inParts = inMime.getFirstElementByPath("Parts");
      //Traverse the local environment for property overrides
      MbElement outRoot = outMessage.getRootElement();			
      MbMessage locEnv = inAssembly.getLocalEnvironment();
      MbMessage newLocEnv = new MbMessage(locEnv);
      MbElement destination = newLocEnv.getRootElement().getFirstElementByPath("Destination");
      MbElement http = destination.getFirstElementByPath("HTTP");
      MbElement requestIdentifier = http.getFirstElementByPath("RequestIdentifier");
      MbElement soap = destination.createElementAsLastChild(MbElement.TYPE_NAME, "SCA", null);
      MbElement request = soap.createElementAsLastChild(MbElement.TYPE_NAME, "Request", null);
      request.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, "UserContext", requestIdentifier.getValue());
              
      //Operation
      String operation = null;
      //Transfer amount
      String amount = null;
      //Get the first part
      MbElement part = inParts.getFirstChild();			
      //Iterate through all of the parts dynamically setting SCA overrides
      while (part != null) {
        //Strip out the property 
        String content = (String)part.getFirstChild().getValue();
        int start = content.indexOf("\"") + 1;
        int end = content.indexOf("\"", start);
        String property = content.substring(start, end);
        //Get the corresponding property data
        MbElement data = part.getLastChild().getFirstElementByPath("BLOB");
        //If there is a data part then setup the relevant property overrides
        if (data != null) {
          //Obtain the byte data
          byte[] blobData = (byte[])data.getFirstElementByPath
          ("BLOB").getValue(); 
          //Convert to a string
          String dataString = new String(blobData);
          //Set LE properties
          if (property.equals("Operation")) { 
            request.createElementAsLastChild
            (MbElement.TYPE_NAME_VALUE, property, dataString);
            operation = dataString;
          } 
          else if (property.equals("Amount")) {
            amount = dataString;						
            try {
              BigDecimal bigDecimal = new BigDecimal(amount);
              if (bigDecimal.scale() > 2 || bigDecimal.scale() < 0) {
                throw new Exception ("Invalid currency format specified!");
              }
            } catch (NumberFormatException nfe) {
              throw new Exception ("Invalid amount specified!");
            }
          }
        } else {
          throw new Exception("No amount specified!");				
        }
        //Get the next part
        part = part.getNextSibling();
      }
              
      //Delete the HTTPInputHeader since we don't need this in our MQ message request
      MbElement httpInputHeader = outRoot.getFirstElementByPath("HTTPInputHeader");
      httpInputHeader.detach();			
      //Create the Broker XMLNSC Parser element
      MbElement outParser = outRoot.createElementAsLastChild(MbXMLNSC.PARSER_NAME);
      MbElement service = outParser.createElementAsLastChild(MbElement.TYPE_NAME, operation, null);
      service.setNamespace("http://SavingsAccount/SavingsAccountInterface");
      MbElement transferin = service.createElementAsLastChild(MbElement.TYPE_NAME, "transferin", null);
      transferin.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, "amount", amount);			
      //Create the new assembly with the new property overrides
      MbMessageAssembly outAssembly = new MbMessageAssembly(
      					inAssembly,
      					newLocEnv,
      					inAssembly.getExceptionList(),
      					outMessage);
              
    8. Elimine el código Java siguiente porque entra en conflicto con el nodo MbMessageAssembly que acaba de crear:
      MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outMessage);
         		
  6. Personalice el nodo SCA Asynchronous Request:
    1. Arrastre BankTransferRequest.outsca del proyecto BankTransferMS al nodo. Puede encontrar BankTransferRequest.outsca en la carpeta BankTransferMS > Definiciones SCA de intermediario > De salida (invocar una Exportación SCA).
    2. En la ventana "Configurar la invocación de servicio en WPS", borre el recuadro de selección Invocar de forma asíncrona y pulse Aceptar.
    3. Pulse Básica, establezca Identificador exclusivo en SCA.
  7. Personalice el nodo SCA Asynchronous Response:
    1. Arrastre BankTransferRequest.outsca del proyecto BankTransferMS al nodo, establezca Identificador exclusivo en SCA.
  8. Personalice el nodo SetupTransferReply:
    1. Efectúe una doble pulsación en el nodo SetupTransferReply, asegúrese de que el Nombre de proyecto sea SCANodesSampleJava y pulse Siguiente.
    2. Asegúrese de que Carpetas origen en la vía de construcción y Carpeta de salida predeterminada contengan SCANodesSampleJava, pulse Siguiente.
    3. Establezca Paquete en sca.broker.sample.banktransfer, pulse Siguiente.
    4. Seleccione la plantilla Crear clase de mensaje, pulse Finalizar.
    5. Pulse el botón derecho del ratón en el nodo SetupTransferReply, pulse Abrir Java.
    6. Añada la sentencia de importación siguiente:
      import java.math.BigDecimal;
      		
    7. Añada el código Java siguiente:
      //Traverse the local environment for property overrides
      MbMessage locEnv = inAssembly.getLocalEnvironment();
      MbMessage newLocEnv = new MbMessage(locEnv);
      MbElement locEnvRoot = newLocEnv.getRootElement();
      MbElement soap = locEnvRoot.getFirstElementByPath("SCA");
      MbElement response = soap.getFirstElementByPath("Response");
      MbElement userContext = response.getFirstElementByPath("UserContext");
      MbElement destination = locEnvRoot.getFirstElementByPath("Destination");
      MbElement http = destination.createElementAsLastChild(MbElement.TYPE_NAME, "HTTP", null);
      http.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, "RequestIdentifier", userContext.getValue());
      //Obtain response message values
      MbElement inRoot = inMessage.getRootElement();			
      MbElement XMLNSC = inRoot.getFirstElementByPath("XMLNSC");
      MbElement transferResponse = XMLNSC.getLastChild();
      MbElement transferOut = transferResponse.getFirstElementByPath("transferout");
      String amount = new BigDecimal(transferOut.getFirstElementByPath("amount").getValue().toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
      String oldBalance = new BigDecimal(transferOut.getFirstElementByPath("oldbalance").getValue().toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
      String newBalance = new BigDecimal(transferOut.getFirstElementByPath("newbalance").getValue().toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
      String accept = transferOut.getFirstElementByPath("accept").getValue().toString();
              
      //Construct confirmation message
      StringBuffer html = new StringBuffer();
      html.append("<HTML><HEAD>");
      html.append("<META http-equiv='Content-Type' content='text/html; 
      charset=ISO-8859-1'></HEAD>");				  
      html.append("<BODY><form action='/TransferRequestForm' method=post>");
      if (accept.equals("yes")) {
      	html.append("<h1>Your transfer of " + amount +" has been successful!</h1>");
      	html.append("<h3>Your old savings balance was " + oldBalance + "</h3>");				
      	html.append("<h3>Your new savings balance is " + newBalance + "</h3>");				
      } else {
      	html.append("<h1><font color=\"#ff0000\">
      	Your transfer of " + amount + " has been unsuccessful due to insufficient funds!
      	</font></h1>");				
      	html.append("<h3>Your savings balance remains unchanged at " + 
      	newBalance + "</h3>");				
      }
      html.append("<tr><td><input type='submit' name='OK' 
      value='OK'></td></tr>");
      html.append("</form></BODY></HTML>");
              
      //Set the content type to be html so that it may be viewed by a browser
      MbElement outRoot = outMessage.getRootElement();			
      MbElement outProperties = outRoot.getFirstElementByPath("Properties");	
      MbElement contentType = outProperties.getFirstElementByPath("ContentType");			
      contentType.setValue("text/html");	
      //Delete the MQMD header since we don't need this in our HTTP reply
      MbElement mqmd = outRoot.getFirstElementByPath("MQMD");
      mqmd.detach();			
      //Create the Broker Blob Parser element
      MbElement outParser = outRoot.createElementAsLastChild(MbBLOB.PARSER_NAME);
      //Create the BLOB element in the Blob parser domain with the required text
      outParser.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, "BLOB", html.toString().getBytes());
      //Create the new assembly with the new property overrides
      MbMessageAssembly outAssembly = new MbMessageAssembly(
      					inAssembly,
      					newLocEnv,
      					inAssembly.getExceptionList(),
      					outMessage);
              
    8. Elimine el código Java siguiente porque entra en conflicto con el nodo MbMessageAssembly que acaba de crear:
      MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outMessage);
         		
  9. Personalice el nodo SetupTransferFailedReply:
    1. Efectúe una doble pulsación en el nodo SetupTransferFailedReply, asegúrese de que el Nombre de proyecto sea SCANodesSampleJava y pulse Siguiente.
    2. Asegúrese de que Carpetas origen en la vía de construcción y Carpeta de salida predeterminada contengan SCANodesSampleJava, pulse Siguiente.
    3. Establezca Paquete en sca.broker.sample.banktransfer, pulse Siguiente.
    4. Seleccione la plantilla Modificar clase de mensaje, pulse Finalizar.
    5. Pulse el botón derecho del ratón en el nodo SetupTransferFailedReply, pulse Abrir Java.
    6. Añada el código Java siguiente:
      //Set the content type to be html so that it can be viewed by a browser
      MbElement outRoot = outMessage.getRootElement();
      MbElement outProperties = outRoot.getFirstElementByPath("Properties");	
      MbElement contentType = outProperties.getFirstElementByPath("ContentType");			
      contentType.setValue("text/html");	
      //Clear out any messages 
      outRoot.getLastChild().detach();
              
      //Get the exception reported
      MbElement exception = inAssembly.getExceptionList().getRootElement().getFirstElementByPath("RecoverableException").getFirstElementByPath("UserException").getFirstElementByPath("UserException");
      //Create a HTML response
      StringBuffer buffer = new StringBuffer();			
      String head = "<html><body text=\"#ff0000\">
      <form action=\"/TransferRequestForm\" method=post>";			
      buffer.append(head);
      //Iterate through the exception stacktrace and add the reason text to the message response
      MbElement insert = exception.getFirstElementByPath("Insert");
      for (int i=0;i<5;i++) {
        insert = insert.getNextSibling();
      }
      String text = (String)insert.getFirstElementByPath("Text").getValue();
      if (text.length() > 0) {
        buffer.append("<h1>");					
        buffer.append(text);
        buffer.append("</h1>");					
      }
      //Complete the HTML body
      String tail = "<br><input type=\"submit\" name=\"OK\" value=\"OK\">
      </form></body></html>";
      buffer.append(tail);
              
      //Create the Broker Blob Parser element
      MbElement outParser = outRoot.createElementAsLastChild(MbBLOB.PARSER_NAME);
      //Create the BLOB element in the Blob parser domain with the required text
      outParser.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, "BLOB", buffer.toString().getBytes());
              

Volver a Compilar el ejemplo

Volver a la página inicial del ejemplo