Nachrichtenfluss für Banküberweisungsanforderung erstellen

Befolgen Sie die nachfolgenden Anweisungen, um den Nachrichtenfluss für die Banküberweisungsanforderung zu erstellen.

  1. Erstellen Sie einen neuen Nachrichtenfluss:
    1. Klicken Sie mit der rechten Maustaste auf das vorhandene Nachrichtenbrokerprojekt SCANodesSample und klicken Sie auf Neu > Nachrichtenfluss.
    2. Setzen Sie Nachrichtenflussname auf BankTransferRequest und klicken Sie auf Fertigstellen.
  2. Fügen Sie im Nachrichtenflusseditor die in der folgenden Tabelle aufgelisteten Knoten hinzu und benennen Sie diese um.

    Knotentyp Knotenname
    HTTPEmpfang HTTP Input
    JavaCompute-Knoten SetupTransferRequest
    SCAAsyncRequest SCA Asynchronous Request
    SCAAsyncResponse SCA Asynchronous Response
    JavaCompute-Knoten SetupTransferReply
    JavaCompute-Knoten SetupTransferFailedReply
    HTTPAntwort HTTP Reply

  3. Verbinden Sie die Knoten entsprechend den Anweisungen in der nachfolgenden Tabelle miteinander.

    Knotenname Terminal Mit diesem Knoten verbinden
    HTTP Input Ausgangsterminal SetupTransferRequest
    SetupTransferRequest Fehlerterminal SetupTransferFailedReply
    SetupTransferFailedReply Ausgangsterminal HTTP Reply
    SetupTransferRequest Ausgangsterminal SCA Asynchronous Request
    SCA Asynchronous Response Ausgangsterminal SetupTransferReply
    SetupTransferReply Ausgangsterminal HTTP Reply
  4. Passen Sie den Knoten 'HTTP Input' an:
    1. Klicken Sie mit der rechten Maustaste auf den Knoten 'HTTP Input' und klicken Sie auf Eigenschaften.
    2. Klicken Sie auf Grundeinstellung und setzen Sie Pfadsuffix für URL auf /TransferRequestSample.
    3. Klicken Sie auf Syntaxanalyse der Eingabenachricht. Wählen Sie für die Eigenschaft Nachrichtendomäne MIME aus der Liste aus.
  5. Passen Sie den Knoten 'SetupTransferRequest' an:
    1. Klicken Sie doppelt auf den Knoten 'SetupTransferRequest', überprüfen Sie, ob der Projektname SCANodesSampleJava lautet, und klicken Sie auf Weiter.
    2. Vergewissern Sie sich, dass die Felder Source folders on build path (Quellenordner in Erstellungspfad) und Default output folder (Standardausgabeordner) 'SCANodesSampleJava' enthalten, und klicken Sie auf Weiter.
    3. Setzen Sie Package (Paket) auf sca.broker.sample.banktransfer und klicken Sie auf Weiter.
    4. Wählen Sie die Schablone Nachrichtenklasse erstellen aus und klicken Sie auf Fertigstellen.
    5. Klicken Sie mit der rechten Maustaste auf den Knoten 'SetupTransferRequest' und klicken Sie auf Java öffnen.
    6. Fügen Sie folgende Importanweisung hinzu:
      import java.math.BigDecimal;
      		
    7. Fügen Sie folgenden Java-Code hinzu:
      //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. Entfernen Sie folgenden Java-Code, da er zu der gerade erstellten Message Broker-Nachrichtenassemblierung (MbMessageAssembly) im Widerspruch steht:
      MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outMessage);
         		
  6. Passen Sie den Knoten 'SCA Asynchronous Request' an:
    1. Ziehen Sie die Datei BankTransferRequest.outsca vom Projekt 'BankTransferMS' auf den Knoten. Sie finden die Datei BankTransferRequest.outsca im Ordner BankTransferMS > Broker-SCA-Definitionen > Abgehend (SCA-Export aufrufen).
    2. Heben Sie im Fenster "Serviceaufruf auf dem WPS konfigurieren" die Auswahl des Kontrollkästchens Synchron aufrufen auf und klicken Sie auf OK.
    3. Klicken Sie auf Grundeinstellung und setzen Sie Eindeutige ID auf SCA.
  7. Passen Sie den Knoten 'SCA Asynchronous Response' an:
    1. Ziehen Sie die Datei BankTransferRequest.outsca vom Projekt 'BankTransferMS' auf den Knoten und setzen Sie Eindeutige ID auf SCA.
  8. Passen Sie den Knoten 'SetupTransferReply' an:
    1. Klicken Sie doppelt auf den Knoten 'SetupTransferReply', überprüfen Sie, ob der Projektname SCANodesSampleJava lautet, und klicken Sie auf Weiter.
    2. Vergewissern Sie sich, dass die Felder Source folders on build path (Quellenordner in Erstellungspfad) und Default output folder (Standardausgabeordner) 'SCANodesSampleJava' enthalten, und klicken Sie auf Weiter.
    3. Setzen Sie Package (Paket) auf sca.broker.sample.banktransfer und klicken Sie auf Weiter.
    4. Wählen Sie die Schablone Nachrichtenklasse erstellen aus und klicken Sie auf Fertigstellen.
    5. Klicken Sie mit der rechten Maustaste auf den Knoten 'SetupTransferReply' und klicken Sie auf Java öffnen.
    6. Fügen Sie folgende Importanweisung hinzu:
      import java.math.BigDecimal;
      		
    7. Fügen Sie folgenden Java-Code hinzu:
      //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. Entfernen Sie folgenden Java-Code, da er zu der gerade erstellten Message Broker-Nachrichtenassemblierung (MbMessageAssembly) im Widerspruch steht:
      MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outMessage);
         		
  9. Passen Sie den Knoten 'SetupTransferFailedReply' an:
    1. Klicken Sie doppelt auf den Knoten 'SetupTransferFailedReply', überprüfen Sie, ob der Projektname SCANodesSampleJava lautet, und klicken Sie auf Weiter.
    2. Vergewissern Sie sich, dass die Felder Source folders on build path (Quellenordner in Erstellungspfad) und Default output folder (Standardausgabeordner) 'SCANodesSampleJava' enthalten, und klicken Sie auf Weiter.
    3. Setzen Sie Package (Paket) auf sca.broker.sample.banktransfer und klicken Sie auf Weiter.
    4. Wählen Sie die Schablone Nachrichtenklasse ändern aus und klicken Sie auf Fertigstellen.
    5. Klicken Sie mit der rechten Maustaste auf den Knoten 'SetupTransferFailedReply' und klicken Sie auf Java öffnen.
    6. Fügen Sie folgenden Java-Code hinzu:
      //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());
              

Zurück zur Erstellung des Mustercodes

Zurück zum Beginn des Mustercodes