Apache CXF 中基于 WebSocket 的 SOAP?

Posted

技术标签:

【中文标题】Apache CXF 中基于 WebSocket 的 SOAP?【英文标题】:SOAP over WebSockets in Apache CXF? 【发布时间】:2014-04-09 07:04:13 【问题描述】:

CXF 是否支持将 WebSockets 作为传输协议?

我需要支持多路复用的 SOAP 和 WebSocket 协议作为起点看起来很完美。它是一种双向全双工协议。 通过多路复用,我的意思是客户端可以发送消息而无需等待响应,并且响应可能会按照它们发送的不同顺序被发送回来(我将使用消息/对话 ID 来识别请求和响应)

它应该与 JMS 非常相似,其中 CXF 可以以任何顺序异步接收请求和发送响应,例如:

我在邮件列表历史中查找了信息,但我仍然不清楚 CXF 是否支持WebSocket out-of-the box 或者我需要实现自己的transport?

【问题讨论】:

【参考方案1】:

我问的问题仍然有效,但有一个答案让我满意:)

我可以简单地使用 JMS,而不是 java.util.concurrent 队列。然后,根据上下文和可扩展性要求,我可以使用 in-jvm 队列或分布式队列。在这种情况下,CXF 已经支持SOAP over JMS。

需要确保的是每个 WebSocket 连接都有一个队列(或者可以使用JMS Message Selector)。这是因为 WebSocket A 收到的对请求的响应必须使用相同的连接发回。

【讨论】:

【参考方案2】:

您好,我想答案有点晚了,但似乎 CXF 支持 Soap over Websocket。配置它的主要问题是获得正确的网络依赖关系,这在 CXF 网站上没有正确描述。以下帖子中描述了对我有用的依赖项列表:

SOAP over Websocket with Appache CXF and Embedded Jetty

这篇文章包含一个使用 websocket 传输的 CXF soap 端点的工作示例。

我将总结使其工作的必要依赖项:

<dependency>
            <groupId>org.asynchttpclient</groupId>
            <artifactId>async-http-client</artifactId>
            <version>2.0.39</version>
             <exclusions>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-buffer</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-codec-http</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-handler</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-transport-native-epoll</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-transport</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-common</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-codec</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-all</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.0.56.Final</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-websocket</artifactId>
        <version>3.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.3.2</version>
    </dependency>
    <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.3.2</version>
    </dependency>

【讨论】:

以上是关于Apache CXF 中基于 WebSocket 的 SOAP?的主要内容,如果未能解决你的问题,请参考以下文章

基于cxf框架javaweb服务说明

CXF+Spring+Eclipse简明示例

CXF客户端异常

在 Apache CXF 中内置 HTTP 服务器

如何向Open Liberty添加专有的Apache CXF功能

apache cxf wsdl2java命令