Crear el subflujo de mensajes de débito de cuentas corrientes

Utilice las instrucciones siguientes para crear el subflujo de mensajes de débito de cuentas corrientes.

  1. Cree un nuevo flujo de mensajes:
    1. Pulse el botón derecho del ratón en el proyecto de Message Broker SCANodesSample existente, pulse Nuevo > Flujo de mensajes.
    2. Establezca Nombre de flujo de mensajes en CurrentAccountDebit, 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
    Input Input
    JavaCompute RetrieveCurrentAccountBalance
    JavaCompute DebitCurrentAccountBalance
    JavaCompute UpdateCurrentAccountBalance
    Output Output

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

    Nombre de nodo Terminal Conectar a este nodo
    Input Out RetrieveCurrentAccountBalance
    RetrieveCurrentAccountBalance Out DebitCurrentAccountBalance
    DebitCurrentAccountBalance Out UpdateCurrentAccountBalance
    UpdateCurrentAccountBalance Out Output
  4. Personalice el nodo RetrieveCurrentAccountBalance:
    1. Efectúe una doble pulsación en el nodo RetrieveCurrentAccountBalance, 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.currentaccount, pulse Siguiente.
    4. Seleccione la plantilla Modificar clase de mensaje, pulse Finalizar.
    5. Pulse con el botón derecho del ratón en el nodo RetrieveCurrentAccountBalance, pulse Abrir Java.
    6. Añada las sentencias de importación siguientes:
      import java.io.BufferedReader;
      import java.io.File;
      import java.io.FileReader;
      import java.io.IOException;
      		
    7. Añada el código Java siguiente:
      MbMessage locEnv = inAssembly.getLocalEnvironment();
      // create new message
      MbMessage newLocEnv = new MbMessage(locEnv);
      BufferedReader bufferedReader = null;
      try {
        //Read the current account balance from the local file system
        File file = null;
        String OS = System.getProperty("os.name").toLowerCase();
        if (OS.indexOf("windows") > -1) {
            file = new File("C:\\tmp\\CurrentAccount.txt");        	
        } else {
            file = new File("/tmp/CurrentAccount.txt");        	
        }
        //Construct the BufferedReader object
        bufferedReader = new BufferedReader(new FileReader(file));            
        //Put the current account balance in the LE
        MbElement variables = newLocEnv.getRootElement()
        .createElementAsLastChild
        (MbElement.TYPE_NAME, "Variables", null);
        variables.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
        "oldBalance", 
        bufferedReader.readLine());           
      } catch (Exception e) {
        throw new MbUserException( 
        CurrentAccount_RetrieveCurrentAccountBalance.class.getName(),
      					"evaluate()",
      					"",
      					"",
      					e.getMessage(),
      					null);
      } finally {
        //Close the BufferedReader
        try {
          if (bufferedReader != null)
            bufferedReader.close();
        } catch (IOException e) {
          throw new MbUserException( 
          CurrentAccount_RetrieveCurrentAccountBalance.class.getName(),
          					"evaluate()",
          					"",
          					"",
          					e.getMessage(),
          					null);
        }
      }
      MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly,
      				newLocEnv, inAssembly.getExceptionList(), 
      				inAssembly.getMessage());
              
    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);
         		
  5. Personalice el nodo DebitCurrentAccountBalance:
    1. Efectúe una doble pulsación en el nodo DebitCurrentAccountBalance, 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.currentaccount, pulse Siguiente.
    4. Seleccione la plantilla Crear clase de mensaje, pulse Finalizar.
    5. Pulse con el botón derecho del ratón en el nodo DebitCurrentAccountBalance, pulse Abrir Java.
    6. Añada la sentencia de importación siguiente:
      import java.math.BigDecimal;
      		
    7. Añada el código Java siguiente:
      //Go to tree roots
      MbElement inRoot = inMessage.getRootElement();			
      MbElement outRoot = outMessage.getRootElement();	
      MbMessage locEnv = inAssembly.getLocalEnvironment();
      MbMessage newLocEnv = new MbMessage();
      //Get the operation name
      MbElement sca = locEnv.getRootElement().getFirstElementByPath("SCA");
      MbElement input = sca.getFirstElementByPath("Input");
      MbElement operation = input.getFirstElementByPath("Operation");
      String operationName = operation.getValue().toString();			
      //Get the old balance
      MbElement variables = locEnv.getRootElement().getFirstElementByPath("Variables");
      float oldBalance = Float.parseFloat(variables.getFirstElementByPath("oldBalance").getValue().toString());			
      //Get the amount to transfer
      MbElement soap = inRoot.getFirstElementByPath("SOAP");
      MbElement body = soap.getFirstElementByPath("Body");
      MbElement action = body.getLastChild();
      MbElement request = action.getLastChild();
      MbElement amount = request.getFirstElementByPath("amount");
      float transferValue = Float.parseFloat(amount.getValue().toString());	
      //Calculate the difference
      float newBalance = oldBalance - transferValue;
      MbElement newVariables = newLocEnv.getRootElement().createElementAsLastChild(MbElement.TYPE_NAME, "Variables", null);
      //Setup the message reply
      MbElement newXMLNSC = outRoot.createElementAsLastChild
      (MbXMLNSC.PARSER_NAME);
      MbElement newOperation = newXMLNSC.createElementAsLastChild
      (MbElement.TYPE_NAME, 
      operationName + "Response", null);
      newOperation.setNamespace("http://CurrentAccount/");
      MbElement newResponse = newOperation.createElementAsLastChild
      (MbElement.TYPE_NAME, 
      "CurrentAccountResponse", null);
      //If the difference is negative then do not accept the 
      transfer and retain old balance
      if (newBalance < 0) {	                 
      newVariables.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
      "newBalance", 
      new BigDecimal(oldBalance).setScale
      (2, java.math.BigDecimal.ROUND_HALF_UP).toString());	              
      newResponse.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
      "accept", "no");
      //Otherwise accept the transfer and set new balance in LE
      } else {	              newVariables.createElementAsLastChild
      (MbElement.TYPE_NAME_VALUE, 
      "newBalance", new BigDecimal(newBalance).setScale
      (2, java.math.BigDecimal.ROUND_HALF_UP).toString());	           
       newResponse.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
       "accept", "yes");				
      }
      // 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 UpdateCurrentAccountBalance:
    1. Efectúe una doble pulsación en el nodo UpdateCurrentAccountBalance, 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.currentaccount, pulse Siguiente.
    4. Seleccione la plantilla Filtrado de clase de mensaje, pulse Finalizar.
    5. Pulse con el botón derecho del ratón en el nodo UpdateCurrentAccountBalance, pulse Abrir Java.
    6. Añada las sentencias de importación siguientes:
      import java.io.BufferedWriter;
      import java.io.File;
      import java.io.FileWriter;
      import java.io.IOException;
      import java.math.BigDecimal;
      		
    7. Añada el código Java siguiente:
      MbMessage locEnv = assembly.getLocalEnvironment();		
      //Read the new balance from the LE
      MbElement variables = locEnv.getRootElement().getFirstElementByPath("Variables");
      String newBalance = new BigDecimal(variables.getFirstElementByPath
      ("newBalance").getValue().toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
      BufferedWriter bufferedWriter = null;     
      try {
        //Update current account balance on local file system
        File file = null;;
        String OS = System.getProperty("os.name").toLowerCase();
        if (OS.indexOf("windows") > -1) {
            file = new File("C:\\tmp\\CurrentAccount.txt");        	
        } else {
            file = new File("/tmp/CurrentAccount.txt");        	
        }
        //Construct the BufferedWriter object
        bufferedWriter = new BufferedWriter(new FileWriter(file));
        //Start writing new balance to the output stream
        bufferedWriter.write(newBalance);           
      } catch (Exception e) {
        throw new MbUserException( CurrentAccount_UpdateCurrentAccountBalance.class.getName(),
      					"evaluate()",
      					"",
      					"",
      					e.getMessage(),
      					null);
      } finally {
        //Close the BufferedWriter
        try {
          if (bufferedWriter != null) {
            bufferedWriter.flush();
            bufferedWriter.close();
          }
        } catch (IOException e) {
          throw new MbUserException( CurrentAccount_UpdateCurrentAccountBalance.class.getName(),
          					"evaluate()",
          					"",
          					"",
          					e.getMessage(),
          					null);
        }
      }
              

Ahora puede crear el subflujo de mensajes de crédito de cuentas corrientes, consulte Crear el subflujo de mensajes de crédito de cuentas corrientes.

Volver a Ampliar el ejemplo

Volver a la página inicial del ejemplo