使用apache camel实现ebXml / ebMs的最佳方法

时间:2015-11-03 17:19:55

标签: apache-camel ebxml

首先,我还没有找到ebxml / ebms的任何通用开源实现,对我来说它有些奇怪或者我查找了错误的东西,但我还没有找到一些有用的东西。

当我在寻找ebxml / ebms时,我也找到了JAXM / SAAJ(JSR 67)。看起来这个实现永远不会结束,关于这个的所有链接都是指不再存在的sun主页。从sun主页,你被重定向到oracle主页,在那里我找不到关于JAXM或JSR 67的东西。

这引出了我的问题,如何在apache camel中实现ebxml服务?

  1. 我应该“手动”创建ebxml SOAP消息,还是我错过了一些为我生成这样的ebxml消息的库?“
  2. 如何通过apache camel发送这样的ebXml SOAP消息? Cxf需要一个wsdl,因为我们想要调用的服务不存在wsdl。
  3. 如何收到此类ebXml消息? Cxf见上文,可能是像netty-http或jetty这样的http消费者?

2 个答案:

答案 0 :(得分:1)

  1. 例如,您可以使用 velocity 模板手动创建ebxml SOAP消息。
  2. 模板示例:

    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
                   xmlns:ser="http://test/Service">
       <soap:Header/>
       <soap:Body>
          <ser:insertRequest>
             <ser:routingHeader>
                <ser:operationType>${headers.OPERATION_TYPE}</ser:operationType>
                <ser:messageId>${exchange.properties.messageId}</ser:messageId>
                <ser:sourceId>${exchange.properties.sourceId}</ser:sourceId>
                <ser:destinationId>${exchange.properties.destinationId}</ser:destinationId>
             </ser:routingHeader>
             <ser:datagram>
                ${body}
             </ser:datagram>
          </ser:insertRequest>
       </soap:Body>
    </soap:Envelope>
    
    1. 您可以使用 http http4 jetty 组件通过apache camel发送此类ebXml SOAP消息。

              to("jetty:http://{{server.host}}:{{server.http.port}}/service/").
              log(LoggingLevel.INFO, "HTTP response code: ${in.header.CamelHttpResponseCode}")
      
    2. 只需手动解析SOAP响应(可能是XPath),或者您可以通过XSLT转换响应。 也许您可以使用beanio,xstream或jaxb等将XML转换为POJO。

    3. 
          ....
              to("velocity:file:///{{karaf.home}}/etc/vm/ws-message-oc.vm?contentCache=true").                                
          setProperty(Exchange.CONTENT_TYPE).constant("application/soap+xml").
              setProperty(Exchange.CONTENT_ENCODING).constant("gzip").
              setProperty(Exchange.CHARSET_NAME).constant("utf-8").
              //log(LoggingLevel.INFO, "WS request: ${body}").
              to("jetty:http://{{app-server.host}}:{{app-server.http.port}}/service/").
              log(LoggingLevel.INFO, "HTTP response code: ${in.header.CamelHttpResponseCode}")
              //log(LoggingLevel.INFO, "WS response: ${body}")
              .setHeader("callRC").xpath("//ser:callRC/text()", String.class, XmlNamespaces.NAMESPACES.getNamespace())
          ....
      
      

答案 1 :(得分:0)

几年太晚了,但也许对其他人有价值:)

有一个支持ebMS 2.0规范的开源实现。 此ebMS适配器可以部署为Mule ESB插件或常规WAR应用程序。

https://sourceforge.net/projects/muleebmsadapter/

尽管是在sourceforge上,但它仍在积极开发中。