2013-04-28 4 views
6

जैसा कि यह डीबी लुकअप मध्यस्थ के दस्तावेज़ीकरण में कहता है, यह केवल क्वेरी की पहली पंक्ति देता है, अन्य परिणाम अगर उन्हें अनदेखा किया जाता है।डब्लूएसओ 2 ईएसबी डीबी लुकअप मध्यस्थ क्वेरी कई पंक्तियां

मैं जानना चाहता हूं कि कोई क्वेरी चलाने के लिए "सर्वश्रेष्ठ तरीका" है (एक्स से चुनें *) जो एकाधिक रिकॉर्ड लौटाता है और फिर उन्हें संसाधित करता है। अब एक दिन हम कर रहे हैं जो axis2 सेवाओं को कार्यान्वित कर रहे हैं, लेकिन आवश्यकता है कि wso2 esb द्वारा प्रदान किए गए मध्यस्थों के संयोजन का उपयोग करके एक और तरीका है ??

अग्रिम धन्यवाद।

सैंटियागो।

उत्तर

6

हां डीब्यूलेटअप मध्यस्थ एकाधिक पंक्तियों को वापस नहीं करेगा। आप दो विकल्पों का उपयोग कर सकते हैं।

1) डेटा सेवा बनाने के लिए डब्ल्यूएसओ 2 डेटा सेवा सर्वर का उपयोग करें और कॉल आउट मध्यस्थ का उपयोग करके ईएसबी से उस सेवा का आह्वान करें।

2) आप डेटाबेस से डेटा पूछने के लिए कक्षा मध्यस्थ लिख सकते हैं और फिर उस से एक पेलोड बना सकते हैं और फिर अनुक्रम के माध्यम से भेज सकते हैं।

+1

धन्यवाद के लिए धन्यवाद Shelan। मुझे लगता है कि यह एक बहुत ही सामान्य समस्या है, आपको पता है कि क्यों Synapse या WSO2 आपके उत्तर के विकल्प संख्या 2 बॉक्स से बाहर नहीं प्रदान किया? हो सकता है कि संदेश का पेलोड (क्वेरी का परिणाम बहुत बड़ा है) synapse के संदेश संदर्भ में कुछ कमी हो सकती है ?? या उसमें कोई समस्या नहीं है? फिर से सैंटियागो धन्यवाद। – smontico

+0

हां। यदि परिणाम सेट बहुत बड़ा है तो उन्हें संदेश संदर्भ में जोड़ने की समस्या है। इसके बावजूद यह जिरा संबंधित राज्य https://issues.apache.org/jira/browse/SYNAPSE-533 में उपलब्ध है क्योंकि प्रदान किया गया समाधान सुरुचिपूर्ण नहीं है। –

+0

हां, मैं इसे देखता हूं, इसलिए मैं आपसे क्यों पूछता हूं ... प्रतिक्रिया शेलन के लिए बहुत बहुत धन्यवाद! – smontico

2

डीबी लुकअप मध्यस्थ कमी को दूर करने के लिए एक और सेवा लिखने या एक पूर्ण उड़ा WSO2 डेटा सेवा सर्वर स्थापित करने से बचने के लिए, मैंने मौजूदा मध्यस्थ बढ़ाया लेकिन समय बाधाओं के कारण वह समुदाय को वापस कोड में योगदान नहीं दिया। यहां अद्यतन org.apache.synapse.mediators.db.DBLookupMediator का कोड है।

असल में, यह परिणामसेट को XML प्रारूप में बदल देता है और परिणाम को DB_SEARCH_RESULT प्रॉपर्टी में सेट करता है। इसे शायद दौड़ की स्थिति पर कुछ पॉलिशिंग और परीक्षण की भी आवश्यकता है।

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; 
    } 

} 
0

, बस का उपयोग करें और आप DBLookUp मध्यस्थ का उपयोग कर एकाधिक पंक्तियों प्राप्त नहीं कर सकता JSON परिणाम

2

वापस जाने के लिए यहां https://github.com/ichakios/dbselect-wso2-mediator आसान से DBSelect मध्यस्थ का प्रयोग करें। लेकिन आप डेटा सेवा सर्वर (डीएसएस) का उपयोग कर सकते हैं और प्रश्न बना सकते हैं। फिर आप कॉल मध्यस्थ का उपयोग करके उन्हें मध्यस्थ भेज सकते हैं। डब्ल्यूएसओ 2 ईआई में, डीएसएस भी उपलब्ध है। कृपया प्रलेखन

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

यहाँ देख डेटा (डीएसएस ऑपरेशन में) एक बाकी के रूप में उजागर किया जा सकता है या सोप (डीएसएस संसाधन में)।

संबंधित मुद्दे