Switchyard и Camel Transparent Proxy не распространяют заголовок SOAP

Я пытаюсь создать прозрачный прокси с Switchyard. Идея заключается в том, чтобы Switchyard представила «расширенный» сервис. Вызовы этой веб-службы будут перенаправлены с помощью Camel на ссылку службы. Ссылка на службу (проксированная служба) и продвигаемая служба имеют один и тот же WSDL.

Проблема заключается в том, что вызовы SOAP, которые делает пользователь, содержат настраиваемый маркер в заголовке конверта SOAP, который НЕ распространяется. Как это решить?

Пример вызова SOAP (Пользователь-> Распространяемая служба):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.test/">
   <soapenv:Header>
   <token>foo</token>
   </soapenv:Header>
   <soapenv:Body>
      <ser:readSomethings>
         <something>
         </something>
      </ser:readSomethings>
   </soapenv:Body>
</soapenv:Envelope>

Вызов SOAP, который Switchyard делает для «проксированной» службы (он не содержит токен !!):

<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
     <ser:readSomethings xmlns:ser=\"http://service.test/\">
       <something></something>
     </ser:readSomethings>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Switchyard.xml:

<?xml version="1.0" encoding="ASCII"?>
<switchyard xmlns="urn:switchyard-config:switchyard:1.0" xmlns:bean="urn:switchyard-component-bean:config:1.0" xmlns:camel="urn:switchyard-component-camel:config:1.0" xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" xmlns:soap="urn:switchyard-component-soap:config:1.0" name="SomethingService" targetNamespace="urn:my.company.something:SomethingService:1.0">
  <sca:composite name="SomethingService" targetNamespace="urn:my.company.something:SomethingService:1.0">
    <sca:service name="PromotedProxyService" promote="ProxyService/ProxyService">
      <soap:binding.soap>
        <soap:contextMapper includes=".*"/>
        <soap:wsdl>META-INF/SomethingWS.wsdl</soap:wsdl>
        <soap:socketAddr>:${jettyPort}</soap:socketAddr>
        <soap:contextPath>SomethingService</soap:contextPath>
      </soap:binding.soap>
    </sca:service>
    <sca:reference name="ProxifiedService" multiplicity="0..1" promote="ProxyService/ProxifiedService">
      <soap:binding.soap>
        <soap:contextMapper includes=".*"/>
        <soap:wsdl>META-INF/SomethingWS.wsdl</soap:wsdl>
        <soap:endpointAddress>http://IP:8080/ws_admin/SomethingWS</soap:endpointAddress>
      </soap:binding.soap>
    </sca:reference>
    <sca:component name="ProxyService">
      <camel:implementation.camel>
        <camel:java class="my.company.something.RouterCamel"/>
      </camel:implementation.camel>
      <sca:service name="ProxyService">
        <sca:interface.wsdl interface="META-INF/SomethingWS.wsdl#wsdl.porttype(SomethingWS)"/>
      </sca:service>
      <sca:reference name="ProxifiedService">
        <sca:interface.wsdl interface="META-INF/SomethingWS.wsdl#wsdl.porttype(SomethingWS)"/>
      </sca:reference>
    </sca:component>
  </sca:composite>
  <domain>
    <properties>
      <property name="org.switchyard.handlers.messageTrace.enabled" value="true"/>
    </properties>
  </domain>
</switchyard>

RouterCamel.java

public class RouterCamel extends org.apache.camel.builder.RouteBuilder{

    public void configure() {
        org.apache.camel.Processor myProc = new org.apache.camel.Processor(){
            public void process(org.apache.camel.Exchange exchange) throws Exception {
                System.out.println("------------------------------ ENTRO\n\n\n\n");
                String body = exchange.getIn().getBody(String.class);
                // change the message to say Hello
                System.out.println("\n\n\n\n------------------------------ BODY: " + body);
                exchange.getOut().setBody(body);
                // copy headers from IN to OUT to propagate them
                System.out.println("Header in values:");
                for(Entry<String, Object> header: exchange.getIn().getHeaders().entrySet()){
                    System.out.println("Header: " +  header.getKey() + " Value: " + header.getValue());
                }
                exchange.getOut().setHeaders(exchange.getIn().getHeaders());
                System.out.println("Header out values:");
                for(Entry<String, Object> header: exchange.getOut().getHeaders().entrySet()){
                    System.out.println("Header: " +  header.getKey() + " Value: " + header.getValue());
                }
            }
        };
      // Define routing rules here:
      from("switchyard://ProxyService").process(myProc).to("switchyard://ProxifiedService");
    }
}

person miguelfdez    schedule 01.08.2014    source источник


Ответы (2)


Заголовок не распространялся, так как у него не было пространства имен.

Я нашел ответ здесь: https://developer.jboss.org/thread/243364

person miguelfdez    schedule 04.09.2014

person    schedule
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person Julien Lachal; 10.10.2017