2013-10-04 15 views
5

Avendo la seguente configurazione del flusso operativo Camel in un ServletContextListener in un progetto Web in esecuzione su IBM WebSphere, un XML in ingresso viene convertito in JSON e stampato sul System.out e stampato sul report.txt. Fin qui tutto bene.Come richiamare una chiamata REST (POST con corpo JSON) da Camel in Java DSL

@WebListener 
public class SetupCamel implements ServletContextListener { 

    private CamelContext camelContext; 

@Override 
    public void contextInitialized(ServletContextEvent sce) { 
     System.out.println("SetupCamel:contextInitialized - enter"); 
     try { 
      Context ctx = new InitialContext(); 
      QueueConnectionFactory qcf = (QueueConnectionFactory) ctx.lookup("jms/TestConnectionFactory"); 

      camelContext = new DefaultCamelContext(); 

      JmsConfiguration jmsConfiguration = new JmsConfiguration(qcf); 
      JmsComponent jmsComponent = new JmsComponent(jmsConfiguration); 
      camelContext.addComponent("jms", jmsComponent); 

      final XmlJsonDataFormat xmlJsonFormat = new XmlJsonDataFormat(); 
      xmlJsonFormat.setEncoding("UTF-8"); 
      xmlJsonFormat.setForceTopLevelObject(false); 
      xmlJsonFormat.setTrimSpaces(true); 
      xmlJsonFormat.setRootName("newRoot"); 
      xmlJsonFormat.setSkipNamespaces(true); 
      xmlJsonFormat.setRemoveNamespacePrefixes(true); 

      camelContext.addRoutes(new RouteBuilder() { 
       public void configure() { 
        onException(Exception.class) 
        .to("log:GeneralError?level=ERROR") 
        .end(); 

        from("jms:queue:TestQueue?concurrentConsumers=1") 
        .marshal(xmlJsonFormat) 
        .to("file:/tmp/messages?fileName=report.txt&fileExist=Append") 
        .to("stream:out") 
        ; 
       } 
      }); 
      camelContext.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("SetupCamel:contextInitialized - leaving"); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     System.out.println("SetupCamel:contextDestroyed - enter"); 
     try { 
      if (camelContext != null) { 
       camelContext.stop(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("SetupCamel:contextDestroyed - leaving"); 
    } 
} 

Devo estendere il flusso a POST il JSON a un servizio/consumatore REST. (La risorsa Rest è testata e funziona ..)

La ricerca nella documentazione (web) non mi fornisce un esempio Java DSL valido/completo che sono in grado di utilizzare. Sulla base di quello che ho trovato, penso che dovrebbe essere qualcosa di simile all'aggiunta di un endpoint come:

.to("cxfrs://http://localhost:9080/WebContext/TestResource") 

Ma questo non funziona e non capisco come impostare il convertito JSON come il corpo e renderlo una richiesta POST. Non c'è nemmeno un'eccezione stampata.

Come posso aggiungere la chiamata REST come POST con corpo JSON in questo flusso?

esecuzione in IBM WebSphere v8.5.5, IBM JDK 1.7x, Camel 2.11.2

I seguenti file jar sono in WEB-INF/lib classpath:

camel-core-2.11.2.jar 
camel-cxf-2.11.2.jar 
camel-cxf-transport-2.11.2.jar 
camel-jms-2.11.2.jar 
camel-servletlistener-2.11.2.jar 
camel-spring-2.11.2.jar 
camel-stream-2.11.2.jar 
camel-xmljson-2.11.2.jar 
com.ibm.ws.prereq.jackson.jar 
commons-beanutils-1.8.0.jar 
commons-collections-3.2.1.jar 
commons-lang-2.5.jar 
commons-logging-1.1.1.jar 
cxf-api-2.7.6.jar 
cxf-rt-frontend-jaxrs-2.7.6.jar 
ezmorph-1.0.6.jar 
json-lib-2.4-jdk15.jar 
slf4j-api-1.7.5.jar 
spring-beans-3.1.4.RELEASE.jar 
spring-context-3.1.4.RELEASE.jar 
spring-core-3.1.4.RELEASE.jar 
spring-jms-3.1.4.RELEASE.jar 
spring-tx-3.1.4.RELEASE.jar 
xom-1.2.5.jar 

Grazie.

+0

siete riusciti a fare questo? – geekprogrammer

risposta

1

Se si desidera solo inviare il messaggio JSON al servizio REST, non è necessario utilizzare il componente camel-cxfrs, poiché si dispone già del corpo del messaggio di richiesta, è sufficiente utilizzare l'endpoint camel-http per inviare la richiesta.

Così il percorso potrebbe essere

from("jms:queue:TestQueue?concurrentConsumers=1") 
        .marshal(xmlJsonFormat) 
        .to("http://localhost:9080/WebContext/TestResource"); 
0
.process(new Processor() { 

     @Override 
     public void process(Exchange exchange) throws Exception { 
      String body = (String) exchange.getIn().getBody(); 
      logger.info(body); 
      exchange.getIn().setHeader(Exchange.HTTP_METHOD, constant(HttpMethod.POST)); 
      exchange.getIn().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON); 
      exchange.getIn().setHeader("Authorization", "Bearer " + getToken()); 
      HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class); 
      exchange.getIn().setHeader(Exchange.HTTP_SERVLET_REQUEST, request); // POST body is set here 
     } 
    }) 
    .to(apiToCall); 
Problemi correlati