Criar o Fluxo de Mensagens de Pedido de Transferência Bancária

Utilize as seguintes instruções para criar o fluxo de mensagens de pedido de transferência bancária.

  1. Crie um novo fluxo de mensagens:
    1. Clique com o botão direito do mouse no projeto do Message Broker existente, SCANodesSample, clique em Novo > Fluxo de Mensagens.
    2. Configure Nome do Fluxo de Mensagens para BankTransferRequest e clique em Concluir.
  2. No editor de Fluxo de Mensagens inclua e renomeie os nós relacionados na seguinte tabela.

    Tipo de Nó Nome de Nó
    HTTPInput Entrada HTTP
    JavaCompute SetupTransferRequest
    SCAAsyncRequest Pedido Assíncrono SCA
    SCAAsyncResponse Resposta Assíncrona SCA
    JavaCompute SetupTransferReply
    JavaCompute SetupTransferFailedReply
    HTTPReply Resposta HTTP

  3. Conecte os nós como descrito na tabela a seguir.

    Nome de Nó Terminal Conectar a esse Nó
    Entrada HTTP Out SetupTransferRequest
    SetupTransferRequest Falha SetupTransferFailedReply
    SetupTransferFailedReply Out Resposta HTTP
    SetupTransferRequest Out Pedido Assíncrono SCA
    Resposta Assíncrona SCA Out SetupTransferReply
    SetupTransferReply Out Resposta HTTP
  4. Customize o nó de HTTP de entrada:
    1. Clique com o botão direito do mouse no nó de Entrada HTTP, clique em Propriedades.
    2. Clique em Básico, configure Sufixo do Caminho para URL para /TransferRequestSample
    3. Clique em Análise de Mensagem de Entrada. Para a propriedade Domínio de Mensagem, selecione MIME da lista.
  5. Customize o nó SetupTransferRequest:
    1. Dê um clique duplo no nó SetupTransferRequest, assegure que o Nome do projeto seja SCANodesSampleJava e clique em Avançar.
    2. Assegure que Pastas de origem no caminho de construção e Pasta de saída padrão contenham SCANodesSampleJava, clique em Avançar.
    3. Configure o Pacote para sca.broker.sample.banktransfer, clique em Avançar.
    4. Selecione o modelo Criando classe de mensagem, clique em Concluir.
    5. Clique com o botão direito do mouse no nó SetupTransferRequest, clique em Abrir Java.
    6. Inclua a seguinte instrução de importação:
      import java.math.BigDecimal;
      		
    7. Inclua o seguinte código Java:
      //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. Remova o código Java a seguir pois ele está em conflito com o MbMessageAssembly que você acaba de criar:
      MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outMessage);
         		
  6. Customize o nó de Pedido Assíncrono SCA:
    1. Arraste BankTransferRequest.outsca do projeto BankTransferMS no nó. Você pode localizar a pasta BankTransferRequest.outsca no BankTransferMS > Definições SCA do Intermediário > Saída (invocar uma Exportação SCA).
    2. Na janela "Configurar Invocação de Serviço no WPS", desmarque a caixa de opção Invocar de Forma Síncrona, clique em OK.
    3. Clique em Básico, configure Identificador Exclusivo para SCA.
  7. Customizar o nó de Resposta Assíncrona SCA:
    1. Arraste BankTransferRequest.outsca do projeto BankTransferMS dentro do nó, configure Identificador Exclusivo para SCA.
  8. Customize o nó SetupTransferReply:
    1. Dê um clique duplo no nó SetupTransferReply, assegure que o Nome do projeto seja SCANodesSampleJava e clique em Avançar.
    2. Assegure que Pastas de origem no caminho de construção e Pasta de saída padrão contenham SCANodesSampleJava, clique em Avançar.
    3. Configure o Pacote para sca.broker.sample.banktransfer, clique em Avançar.
    4. Selecione o modelo Criando classe de mensagem, clique em Concluir.
    5. Clique com o botão direito do mouse no nó SetupTransferReply, clique em Abrir Java.
    6. Inclua a seguinte instrução de importação:
      import java.math.BigDecimal;
      		
    7. Inclua o seguinte código Java:
      //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. Remova o código Java a seguir pois ele está em conflito com o MbMessageAssembly que você acaba de criar:
      MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outMessage);
         		
  9. Customize o nó SetupTransferFailedReply:
    1. Dê um clique duplo no nó SetupTransferFailedReply, assegure que o Nome do projeto seja SCANodesSampleJava e clique em Avançar.
    2. Assegure que Pastas de origem no caminho de construção e Pasta de saída padrão contenham SCANodesSampleJava, clique em Avançar.
    3. Configure o Pacote para sca.broker.sample.banktransfer, clique em Avançar.
    4. Selecione o modelo Modificando a classe de mensagem, clique em Concluir.
    5. Clique com o botão direito do mouse no nó SetupTransferFailedReply, clique em Abrir Java.
    6. Inclua o seguinte código Java:
      //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());
              

Voltar para Construir Amostra

Voltar para o Início da Amostra