2013-10-04 14 views
5

IBM WebSphere上で実行されているWebプロジェクトのServletContextListenerにCamelフロー設定が次のように設定されていると、受信XMLがJSONに変換され、 System.outを呼び出し、report.txtに出力します。ここまでは順調ですね。Java DSLのCamelからREST呼び出し(JSON本体のPOST)を呼び出す方法

@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"); 
    } 
} 

私は、JSONをRESTサービス/コンシューマにPOSTするためにフローを拡張する必要があります。

(ウェブ)ドキュメントを検索しても、私が使用できる優れた/完全なJava DSLのサンプルが得られません。私が見つけた何に基づいて、私はそれはのようなエンドポイントを追加することに類似したものであるべきだと思う:

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

しかし、これは動作しませんし、私は体として変換されたJSONを設定し、それを作る方法を理解していませんPOSTリクエスト。例外も印刷されていません。

このフローでREST呼び出しをJSON本体のPOSTとして追加するにはどうすればよいですか?

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 

ありがとう:IBMのWebSphere v8.5.5、IBMのJDKの1.7倍に実行

、キャメル2.11.2が

次のjarファイルは、WEB-INF/libのクラスパスにあります。

+0

だろうか? – geekprogrammer

答えて

1

JSONメッセージをRESTサービスに送信するだけの場合は、camel-cxfrsコンポーネントを使用する必要はありません。既にリクエストメッセージ本文があるため、camel-httpエンドポイントを使用して送信する必要がありますリクエスト。

のでルートは、あなたがこれを行うために管理しました

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); 
関連する問題