2015-05-27 2 views
0

Я работаю в настоящее время над проектом, где Apache CXF интегрирован с Apache Camel. Apache CXF - это решение, которое мы используем, чтобы выставить WebService, а затем запрограммировать SOAP-запрос и передать его Camel. Это довольно стандартный. По умолчанию используется POJO dataFormat в ApacheCXF, однако необходимо получить некоторую информацию из заголовков SOAP "" и передать ее Camel. Мой вопрос: как это сделать? Когда я использую Interceptor в Apache CXF, я могу получить информацию, которая мне нужна, но я не могу передать ее потом Camel. Класс ниже является CXF перехватчикКак передать параметр из Apache CXF в Camel

public class MyInterceptor extends AbstractSoapInterceptor { 
    //..... some variables 

    @Override 
    public void handleMessage(SoapMessage message) throws Fault { 
     //..some logic and then setting a variable 

     message.getExchange().put("Foo", "Bar"); 
    } 
} 

... и класс ниже Camel процессор, который в конце концов, называется:

public class MyCamelProcessor implements Processor { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     //how can I read information from CXF Intercptor here? 
     //how can I read "Foo" value?   
    } 
} 

Я понимаю, что обмен класс, который используется Apache CXF отличается, то обмен используется Camel, однако должен быть способ передачи информации между этими двумя интегрированными технологиями?

+1

Я думаю, что вы можете доступ к заголовкам мыла, откуда вы хотите получить информацию, на маршруте. См. Http://camel.apache.org/cxf.html – soilworker

+0

Привет, я хочу сделать то же самое. Не могли бы вы решить эту проблему? – Hector

ответ

2

Наконец, я решил это, как следовать:

В моем контексте, у меня есть потребительское обслуживание с верблюжьей-CXF компонент, который перенаправляется к процессору.

CxfEndpoint класс от Camel имеет метод вызов setInInterceptors:

public void setInInterceptors(List<org.apache.cxf.interceptor.Interceptor<? extends org.apache.cxf.message.Message>> interceptors) 

Таким образом, если мы определим следующие в нашей фасоли файл определение:

... 
<cxf:cxfEndpoint id="consumerId" 
    address="/myservice" 
    serviceClass="com.example.service.MyServiceSEI"> 
    <cxf:inInterceptors> 
     <ref bean="myInterceptor"/> 
    </cxf:inInterceptors> 
</cxf:cxfEndpoint> 

<bean id="myInterceptor" class="com.example.interceptors.MyInterceptor" /> 

Тогда в нашем обычае перехватчика мы можем установить любая переменная на карте

... 
import org.apache.cxf.binding.soap.SoapMessage; 
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; 
... 

public class MyInterceptor extends AbstractSoapInterceptor { 
    public MyInterceptor() { 
    super(Phase.RECEIVE); 
    } 

    @Override 
    public void handleMessage(SoapMessage message) throws Fault { 
    //..some logic and then setting a variable 

    message.getExchange().put("Foo", "Bar"); 
    } 
} 

Наконец, мы можем получить переменные в нашем процессоре, используя класс org.apache.cxf.message.Message, отличается от org.apache.camel.Message используется с Exchange.getIn() метод

import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 
import org.apache.cxf.message.Message; 
import org.apache.camel.component.cxf.common.message.CxfConstants; 

public class MyCamelProcessor implements Processor { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     //how can I read information from CXF Intercptor here? 
     //how can I read "Foo" value? 
     Message cxfMessage = exchange.getIn().getHeader(CxfConstants.CAMEL_CXF_MESSAGE, Message.class); 
     String foo = (String) cxfMessage.getExchange().get("Foo"); 

     // read message from camel context 
     org.apache.camel.Message inMessage = exchange.getIn(); 
     ... 
    } 
} 

спасибо: http://camel.465427.n5.nabble.com/Getting-entire-Soap-Message-with-header-and-body-in-Payload-mode-td5753162.html

Смежные вопросы