2016-05-15 21 views
0

Ich versuche, JSON-Daten vom Anlegeplatzendpunkt (ein anderer Dienst) zu erhalten, Ausgabedaten zu erstellen und sie an eine oder mehrere CVS-Dateien zu senden. Ich habe 2 Routen - die erste erstellt Dateien für das aktuelle Datum, basierend auf Cron-Einstellungen, die zweite legt den Endpunkt der Anlegestelle frei, um Dateien für ein bestimmtes Datum bei der GET-Anfrage zu erstellen. Sie sind genau gleich, außer dem Startpunkt, ich habe auch versucht, Nachrichten vom zweiten Endpunkt zum ersten zu senden ... In beiden Fällen werden CSV-Dateien erstellt, aber die zweite Route gibt mir org.apache.camel.TypeConversionException. Mein Weg ist:Strange Apache Camel Exception

from(httpServer + "/lineups?throwExceptionOnFailure=false?httpMethodRestrict=GET") 
.routeId("manualStart") 
.setExchangePattern(ExchangePattern.InOnly) 
.setHeader(Exchange.HTTP_URI, simple(apiEndpoint + "/lineups")) 
.setHeader("target_date", simple("${in.header.date}")) 
.setHeader(Exchange.HTTP_QUERY, simple("date=${in.header.date}")) 
.setHeader(Exchange.HTTP_METHOD, constant("GET")) 
.to("https://dummyhost") 
.process(new MappingProcessor()) 
.split(body()) 
.setHeader("prefix", simple("${body.name}")) 
.process(new FileNameProcessor()) 
.marshal(bindy) 
.aggregate(header("prefix"), new FileAggregationStrategy()) 
.completionTimeout(60000L) 
.to("file:" + fileLocation + "?fileName=Nielsen.${in.header.prefix}.${in.header.target_date}.txt"); 

ich folgende Ausnahme erhalten:

16:41:50.493 [qtp1583020257-49] ERROR o.a.c.c.j.CamelContinuationServlet - Error processing request 
org.apache.camel.TypeConversionException: Error during type conversion from type: java.lang.String to the required type: java.io.InputStream with value 
[com...beans.MyOutput[email protected], [email protected], com.... [Body clipped after 1000 chars, total length is 23865] due Failed to convert from type [java.util.ArrayList<?>] to type [java.io.InputStream] for value ... 
... 
[email protected]]'; 

nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.util.ArrayList<?>] to type [java.io.InputStream] 
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.createTypeConversionException(BaseTypeConverterRegistry.java:610) 
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.convertTo(BaseTypeConverterRegistry.java:137) 
    at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:72) 
    at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:47) 
    at org.apache.camel.http.common.DefaultHttpBinding.doWriteDirectResponse(DefaultHttpBinding.java:396) 
    at org.apache.camel.http.common.DefaultHttpBinding.doWriteResponse(DefaultHttpBinding.java:332) 
    at org.apache.camel.http.common.DefaultHttpBinding.writeResponse(DefaultHttpBinding.java:264) 
    at org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:227) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1685) 
    at org.apache.camel.component.jetty.CamelFilterWrapper.doFilter(CamelFilterWrapper.java:45) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119) 
    at org.eclipse.jetty.server.Server.handleAsync(Server.java:567) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:325) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) 
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261) 
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) 
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.util.ArrayList<?>] to type [java.io.InputStream] for value 

Mein Datenformat für CSV-Formatierung:

DataFormat bindy = new BindyCsvDataFormat(MyOutput.class); 

Dies ist FileAggregationStrategy:

public class FileAggregationStrategy implements AggregationStrategy { 
    @Override 
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
    if (oldExchange == null) { 
     return newExchange; 
    } 
    String oldBody = oldExchange.getIn().getBody(String.class); 
    String newBody = newExchange.getIn().getBody(String.class); 
    String body = oldBody + newBody; 
    oldExchange.getIn().setBody(body); 
    return oldExchange; 
    } 
} 

Ich habe versucht, Hinzufügen von .log() nach jedem Schritt a Und ich sehe, dass die Ausnahme auf .aggregate geworfen wird.

Was könnte falsch sein? Eine andere Route begann von

from("quartz://start/api_cron/?cron=" + cronExpression + "&fireNow=true") 

funktioniert ohne Ausnahmen.

+0

ich gefunden habe, dass CamelContinuationServlet ein Teil der Jetty-Komponente ist und es nutzt Jetty Fortsetzungen '. Ich habe versucht, Anlieger Fortsetzungen mit UseContinuation = false Option in Endpunkt Uri zu deaktivieren, aber ich bekomme immer noch die Ausnahmen ... –

Antwort

2

Es ist die HTTP-Antwort, die versucht wird, von X zu InputStream konvertiert zu werden. Sie müssen eine Antwort festlegen, entweder einen leeren Wert oder etwas, das Sie an den HTTP-Client zurückgeben möchten.

Auch wenn Sie MEP auf InOnly setzen, sendet Jetty eine Antwort zurück. Sie können mit wireTap arbeiten, wenn Sie die Nachricht unabhängig von der Jetty-Route bearbeiten und aggregieren möchten.

Etwas nach dem Vorbild von

from jetty 
    wiretap direct:foo 
    transform constant "ok" 

from direct:foo 
    // put in all that stuff from your route here