2012-03-13 10 views
8

Sto costruendo un client xmlrpc con Java usando Apache xmlrpc, ma non sono riuscito a capire come registrare l'input/output xml (i dati grezzi ricevuti e inviati). Come faccio a fare questo?logging input/output xml in apache xmlrpc client

Grazie

+0

quadro Cosa registrazione si usa? –

+0

no framework, ho solo bisogno di qualcosa di semplice in realtà, per poter leggere il xml in entrata e in uscita – ndriks

risposta

12

La mia soluzione era quella di utilizzare un trasporto personalizzato come segue. Forse ci sono modi più aggraziati per farlo.

import java.io.BufferedReader; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.apache.xmlrpc.XmlRpcException; 
import org.apache.xmlrpc.client.XmlRpcClient; 
import org.apache.xmlrpc.client.XmlRpcStreamTransport; 
import org.apache.xmlrpc.client.XmlRpcSunHttpTransport; 
import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig; 
import org.xml.sax.SAXException; 


/** 
* This is a custom XML-RPC transport which logs the outgoing and incoming 
* XML-RPC messages. 
*/ 
public class MessageLoggingTransport extends XmlRpcSunHttpTransport 
{ 
    private static final Logger log = Logger.getLogger(MessageLoggingTransport.class.getName()); 


    /** 
    * Default constructor 
    * 
    * @see XmlRpcSunHttpTransport#XmlRpcSunHttpTransport(XmlRpcClient) 
    * @param pClient 
    */ 
    public CookieHandlingTransport(final XmlRpcClient pClient) 
    { 
     super(pClient); 
    } 


    /** 
    * Dumps outgoing XML-RPC requests to the log 
    */ 
    @Override 
    protected void writeRequest(final XmlRpcStreamTransport.ReqWriter pWriter) throws IOException, XmlRpcException, SAXException 
    { 
     final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     pWriter.write(baos); 
     log.info(baos.toString()); 
     super.writeRequest(pWriter); 
    } 


    /** 
    * Dumps incoming XML-RPC responses to the log 
    */ 
    @Override 
    protected Object readResponse(XmlRpcStreamRequestConfig pConfig, InputStream pStream) throws XmlRpcException 
    { 
     final StringBuffer sb = new StringBuffer(); 

     try 
     { 
      final BufferedReader reader = new BufferedReader(new InputStreamReader(pStream)); 
      String line = reader.readLine(); 
      while(line != null) 
      { 
       sb.append(line); 
       line = reader.readLine(); 
      } 
     } 
     catch(final IOException e) 
     { 
      log.log(Level.SEVERE, "While reading server response", e); 
     } 

     log.info(sb.toString()); 

     final ByteArrayInputStream bais = new ByteArrayInputStream(sb.toString().getBytes()); 
     return super.readResponse(pConfig, bais); 
    } 
} 

E poi nel codice che crea il vostro client XML-RPC:

final XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); 
config.setServerURL(new URL(url)); 

final XmlRpcTransportFactory transportFactory = new XmlRpcTransportFactory() 
{ 
    public XmlRpcTransport getTransport() 
    { 
     return new MessageLoggingTransport(client); 
    } 
}; 

client = new XmlRpcClient(); 
client.setTransportFactory(transportFactory); 
client.setConfig(config); 
0

Provare a usare un logger per org.apache.xmlrpc.client; Scommetto che sputerebbe fuori l'xml da qualche parte in quel pacchetto. Prova qualcosa del genere:

<appender name="LOG_FILE" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="Threshold" value="DEBUG"/> 
    <param name="File" value="C:\xmlrpc_client.log"/> 
    <param name="datePattern" value="'.'yyyy-ww" /> 
    <param name="Append" value="true"/> 
      <layout class="org.apache.log4j.PatternLayout"> 
       <param name="ConversionPattern" value="[%p] %t %d{DATE} %M - %m%n"/> 
      </layout> 
    </appender> 

    <logger name="org.apache.xmlrpc.client"> 
    <level value="DEBUG"/> 
</logger> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="LOG_FILE"/> 
    </root> 
+0

Mi dispiace, ma non capisco. Che tipo di xml è questo? scusa il newbie-ness: D – ndriks

+0

Ciao, non preoccuparti, ma quando hai detto di 'log', pensavo che stavi già usando log4j. In questo caso, se inizi a usare log4j, molto semplice da configurare, usa la configurazione di cui sopra per log4j.xml e tutte le classi sotto quel pacchetto org.apache.xmlrpc.client registrerebbe la loro roba, scommetto una delle classi lì, probabilmente XmlRpcClient registrerà il xml che invia e il xml che riceve –

+3

@ CarlosJaimeC.DeLeon, l'ho provato, ma apparentemente nulla è registrato su quel logger. –