Hi there,

I'm preparing a simple HTTP bridge like:

user -> HTTP-consumer -> NMR -> HTTP-provider -> Google Translate

I am using a marshaler in the consumer which works perfectly (packing user's
request into XML) but I have a problem with Marshaler at the provider's
side.

provider su xbean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:http="http://servicemix.apache.org/http/1.0";
       xmlns:tr="http://traduce.pl";
       xmlns="http://www.springframework.org/schema/beans";
       xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance";
       xsi:schemaLocation="http://servicemix.apache.org/http/1.0
http://servicemix.apache.org/schema/servicemix-http-3.2.3.xsd
       http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd";>

  <http:provider service="tr:googletranslate"
                 endpoint="json"
                 marshaler="#marshaler" />
                 
  <bean id="marshaler"
class="pl.traduce.su.googletranslate.HttpTranslationMarshaler" />    

</beans>


The Marshaler class is the following:
public class HttpTranslationMarshaler
        extends DefaultHttpProviderMarshaler
{

        /* (non-Javadoc)
         * @see
org.apache.servicemix.http.endpoints.DefaultHttpProviderMarshaler#createRequest(javax.jbi.messaging.MessageExchange,
javax.jbi.messaging.NormalizedMessage,
org.apache.servicemix.http.jetty.SmxHttpExchange)
         */
        @Override
        public void createRequest(MessageExchange me, NormalizedMessage nm,
                        SmxHttpExchange she) throws Exception {
            
                //super.createRequest(me, nm, she);
                
                String text = 
((StringSource)nm.getContent()).getText().substring(6,
((StringSource)nm.getContent()).getText().length() - 6);//TODO: replace with
SAX
                
                she.setMethod(HttpMethods.GET);
                she.setURI("/translate_a/t?client=traduce.pl&text=" + text +
"&sl=en&tl=fr");
                she.setAddress(new InetSocketAddress("translate.google.com", 
80));
                she.addRequestHeader(HttpHeaders.HOST_BUFFER, new
ByteArrayBuffer("translate.google.com"));
        
//she.setURL("http://translate.google.com:80/translate_a/t?client=traduce.pl&text=";
+ text + "&sl=en&tl=fr");
                                
                System.err.println("requesting Google!");
        }

        /* (non-Javadoc)
         * @see
org.apache.servicemix.http.endpoints.HttpProviderMarshaler#handleResponse(javax.jbi.messaging.MessageExchange,
org.apache.servicemix.http.jetty.SmxHttpExchange)
         */
        @Override
        public void handleResponse(MessageExchange me, SmxHttpExchange she)
                        throws Exception {
                
                System.err.println("received answer!");
                System.err.println(she.getResponseContent());
                
                NormalizedMessage nm = me.createMessage();
                nm.setContent(new StringSource("got JSON!"));
                me.setMessage(nm, "out");       //or in??
        }
        
}         

All i get is:

requesting Google!
java.net.UnknownHostException: Remote socket address cannot be null.
        at 
org.mortbay.jetty.client.HttpClient.getDestination(HttpClient.java:160)
        at org.mortbay.jetty.client.HttpClient.send(HttpClient.java:134)
        at
org.apache.servicemix.http.endpoints.HttpProviderEndpoint.process(HttpProviderEndpoint.java:112)
        at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:538)
        at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:490)
        at
org.apache.servicemix.common.BaseLifeCycle.onMessageExchange(BaseLifeCycle.java:46)
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:620)
        at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:172)
        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:167)
        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:134)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)

despite the fact that I DO SET the location...

Morover, such a standalone test works well:
                ready = false;
                
                HttpExchange she = new ContentExchange() {
                    @Override
                        protected void onResponseComplete() throws IOException
                        {
                        int status = getResponseStatus();
                            if (status == 200) {
                                System.out.println(getResponseContent());
                            }
                            else
                                System.err.println("ERROR" + status);
                            ready = true;
                        }
                };
                String text = "Ala%20ma%20kota";
                
                she.setMethod(HttpMethods.GET);
                
                she.setURI("/translate_a/t?client=traduce.pl&text=" + text +
"&sl=en&tl=fr");
                she.setAddress(new InetSocketAddress("translate.google.com", 
80));
                she.addRequestHeader(HttpHeaders.HOST_BUFFER, new
ByteArrayBuffer("translate.google.com"));
                
                System.err.println("requesting Google!");
                
                HttpClient client = new HttpClient();
                client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
                client.setMaxConnectionsPerAddress(2); // max 200 concurrent 
connections
to every address
                client.setThreadPool(new QueuedThreadPool(2)); // max 2 threads
                client.setTimeout(30000); // 30 seconds timeout; if no server 
reply, the
request expires
                client.start();
                
                client.send(she);
                
                while (!ready) {}


Do you have any ideas how to fix my Marshaler?
-- 
View this message in context: 
http://old.nabble.com/HTTP-Provider-with-custom-Marshaller-problem-tp28123182p28123182.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.

Reply via email to