2013-04-28 13 views
6

Jak to jest napisane w dokumentacji Mediator DBLookup zwraca tylko pierwszy wiersz kwerendy, a pozostałe wyniki, jeśli są, zostały zignorowane.WSO2 ESB DBLookup mediator kwerendy wielu wierszy

Chcę wiedzieć, czy istnieje "najlepszy sposób" na uruchomienie zapytania (SELECT * FROM X), które zwraca wiele rekordów, a następnie je przetwarza. Teraz robimy dni, które wdrażają usługi osi2, ale jest inny sposób, w którym połączenie mediatorów zapewnionych przez wso2 esb spełni to wymaganie?

Z góry dziękuję.

Santiago.

Odpowiedz

6

Tak mediator DBlookup nie zwróci wielu wierszy. Możesz użyć dwóch alternatyw.

1) Użyj serwera usług danych WSO2, aby utworzyć usługę danych i wywołać tę usługę z ESB za pomocą mediatora wywołania.

2) Można napisać mediatora klasy, aby wyszukiwać dane z bazy danych, a następnie utworzyć z nich ładunek, a następnie wysłać go za pośrednictwem sekwencji.

+1

Dzięki Shelan za anwser. Myślę, że to bardzo ogólny problem, wiesz, dlaczego Synapse lub WSO2 nie dostarczyły z pudełka opcji numer 2 twojej odpowiedzi? Może jeśli ładunek wiadomości (wynik zapytania jest zbyt duży) może mieć pewne wady w kontekście wiadomości synapsy? Czy nie ma z tym problemu? Jeszcze raz dziękuję Santiago. – smontico

+0

Tak. Jeśli zestaw wyników jest zbyt duży, to problemem jest dodanie ich do kontekstu komunikatu. Wciąż ten JIRA powiązany z tym jest w stanie otwartym https://issues.apache.org/jira/browse/SYNAPSE-533, ponieważ dostarczone rozwiązanie nie jest eleganckie. –

+0

Tak, widzę to, dlatego proszę Cię ... Wielkie dzięki za odpowiedź Shelan! – smontico

2

Aby uniknąć pisania innej usługi lub skonfigurowania serwera WSO2 Data Services Server w celu przezwyciężenia niedociągnięć interfejsu DB Lookup Mediator, rozszerzyłem istniejącego mediatora, ale nie przyczyniłem się do jego powrotu do społeczności ze względu na ograniczenia czasowe. Oto kod zaktualizowanego pliku org.apache.synapse.mediators.db.DBLookupMediator.

Zasadniczo przekształca ResultSet w format XML i ustawia wynik na właściwość DB_SEARCH_RESULT. Prawdopodobnie wymaga również polerowania i testowania warunków wyścigu.

package org.apache.synapse.mediators.db; 

import org.apache.synapse.MessageContext; 
import org.apache.synapse.SynapseException; 
import org.apache.synapse.SynapseLog; 
import org.w3c.dom.Attr; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

import java.io.StringWriter; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.sql.Connection; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

/** 
* Simple database table lookup mediator. Designed only for read/lookup 
*/ 
public class DBLookupMediator extends AbstractDBMediator { 

    public static final String DB_SEARCH_RESULTS_PROPERTY_NAME = "DB_SEARCH_RESULT"; 

    protected void processStatement(Statement stmnt, MessageContext msgCtx) { 

     SynapseLog synLog = getLog(msgCtx); 

     // execute the prepared statement, and extract the first result row and 
     // set as message context properties, any results that have been specified 
     Connection con = null; 
     ResultSet rs = null; 
     try { 
      PreparedStatement ps = getPreparedStatement(stmnt, msgCtx); 
      con = ps.getConnection(); 
      rs = ps.executeQuery(); 

      // convert RS to XML 
      String rsXML = convertRSToXML(rs); 

      // add result XML to the Message Context 
      msgCtx.setProperty(DB_SEARCH_RESULTS_PROPERTY_NAME, rsXML); 

      // rollback to the beginning of ResultSet to allow standard processing 
      rs = ps.executeQuery(); 

      if (rs.next()) { 
       if (synLog.isTraceOrDebugEnabled()) { 
        synLog.traceOrDebug(
         "Processing the first row returned : " + stmnt.getRawStatement()); 
       } 

       for (String propName : stmnt.getResultsMap().keySet()) { 

        String columnStr = stmnt.getResultsMap().get(propName); 
        Object obj; 
        try { 
         int colNum = Integer.parseInt(columnStr); 
         obj = rs.getObject(colNum); 
        } catch (NumberFormatException ignore) { 
         obj = rs.getObject(columnStr); 
        } 

        if (obj != null) { 
         if (synLog.isTraceOrDebugEnabled()) { 
          synLog.traceOrDebug("Column : " + columnStr + 
            " returned value : " + obj + 
            " Setting this as the message property : " + propName); 
         } 
         msgCtx.setProperty(propName, obj.toString()); 
        } else { 
         if (synLog.isTraceOrDebugEnabled()) { 
          synLog.traceOrDebugWarn("Column : " + columnStr + 
            " returned null Skip setting message property : " + propName); 
         } 
        } 
       } 
      } else { 
       if (synLog.isTraceOrDebugEnabled()) { 
        synLog.traceOrDebug("Statement : " 
         + stmnt.getRawStatement() + " returned 0 rows"); 
       } 
      } 

     } catch (SQLException e) { 
      handleException("Error executing statement : " + stmnt.getRawStatement() + 
       " against DataSource : " + getDSName(), e, msgCtx); 
     } finally { 
      if (rs != null) { 
       try { 
        rs.close(); 
       } catch (SQLException e) {} 
      } 
      if (con != null) { 
       try { 
        con.close(); 
       } catch (SQLException ignore) {} 
      } 
     } 
    } 

    private String convertRSToXML(ResultSet rs) throws SQLException { 
     ResultSetMetaData rsmd = rs.getMetaData(); 

     // create XML document 
     DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder; 
     Document doc = null; 
     try { 
      docBuilder = dbfac.newDocumentBuilder(); 
      doc = docBuilder.newDocument(); 
     } catch (ParserConfigurationException pce) { 
      throw new SynapseException("Failed to transform Resultset to XML", pce); 
     } 

     // create Root element 
     Element rootElement = doc.createElement("table"); 
     doc.appendChild(rootElement); 

     while (rs.next()) { 
      // add Record element 
      Element recordElement = doc.createElement("record"); 
      rootElement.appendChild(recordElement); 

      for (int i = 1; i <= rsmd.getColumnCount(); i++) { 
       String columnName = rsmd.getColumnName(i); 
       String columnValue = rs.getObject(i).toString(); 

       // add Field element 
       Element fieldElement = doc.createElement("field"); 
       fieldElement.appendChild(doc.createTextNode(columnValue)); 

       // set Name attribute to Field element 
       Attr nameAttr = doc.createAttribute("name"); 
       nameAttr.setValue(columnName); 
       fieldElement.setAttributeNode(nameAttr);     

       // add Field to Record 
       recordElement.appendChild(fieldElement);        
      } 
     } 

     //Output the XML 
     String xmlString = null; 

     try { 
      //set up a transformer 
      TransformerFactory transfac = TransformerFactory.newInstance(); 
      Transformer trans = transfac.newTransformer(); 
      trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
      trans.setOutputProperty(OutputKeys.INDENT, "yes"); 

      //create string from XML tree 
      StringWriter sw = new StringWriter(); 
      StreamResult result = new StreamResult(sw); 
      DOMSource source = new DOMSource(doc); 
      trans.transform(source, result); 
      xmlString = sw.toString();  
     } catch (javax.xml.transform.TransformerException te) { 
      throw new SynapseException("Failed to transform Resultset to XML", te); 
     } 

     return xmlString; 
    } 

} 
2

powrotu Nie można pobrać wiele wierszy przy użyciu DBLookUp mediatora. Możesz jednak użyć serwera Data Services Server (DSS) i utworzyć zapytania. Następnie możesz ich przywołać za pomocą mediatora telefonicznego lub wysłać mediatora. W WSO2 EI dostępny jest również DSS. Proszę zapoznać się z dokumentacją

https://docs.wso2.com/display/EI611/Generating+a+Data+Service https://docs.wso2.com/display/EI611/Exposing+Data+as+a+REST+Resource

Oto dane mogą być odsłaniając jak reszta (w DSS zasobu) lub mydło (w trybie DSS).