SOAP服务器 - 使用TomCat,CXF推送,通过Websockets进行大气层

时间:2017-04-07 07:56:52

标签: java tomcat soap cxf atmosphere

我的应用程序需要使用WebSockets发送和接收SOAP消息。 大多数情况下,客户端(用Python编写)以一种简单的请求 - 响应模式与服务器(Java)进行通信。

有时,如果客户端更新服务器管理的集中式数据库中的某些数据,则应通知所有其他客户端更新的数据或任何其他类型的通知(广播)

我目前的筹码包括以下技术:

  • 用Java编写的服务器
  • 使用Python 3.4编写的客户端
  • Tomcat 8.5.12
  • Apache CXF 3.1.10
  • Atmosphere 2.4.9

可以更改堆栈,但以下情况除外:

  • 服务器和客户端编写的语言
  • 传输的消息必须是SOAP
  • Tomcat作为servlet管理员
  • 只有在不可能的情况下才能将WebSockets更改为Long-Polling。

以请求 - 响应模式与服务器通信已经在运行。 但是,我不知道如何让服务器推送工作。 我已经使用了Atmosphere Wiki中列出的@WebSocketProcessorService,@ ManagedService,@ AtmosphereResourceListenerService。 但要么我可以访问普通消息本身但没有自动SOAP处理,或者相反。 使用像@Broadcast这样的注释在sample.ServerEndpoint中没有任何影响。 在Wiki或其他博客上找到的所有示例仅适用于处理消息本身并返回纯字符串的普通WebSockets。

我真的很感谢有一个具有以下功能的例子:

  • 一种以简单的请求 - 响应模式工作的服务方法(如下所示,已经工作)
  • 一种服务方法,它返回一个正常的响应,但也开始广播给所有客户端(在 - 或排除调用该方法的客户端)条件(例如,变量的更新是否成功)

我目前的状态:

web.xml(服务器)

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <description>AtmosphereServlet</description>
  <display-name>AtmosphereServlet</display-name>
  <servlet>
    <description>AtmosphereServlet</description>
    <servlet-name>AtmosphereServlet</servlet-name>
    <servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
    <!-- If you want to use Servlet 3.0 -->
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>AtmosphereServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

atmosphere.xml(服务器)

<atmosphere-handlers>
    <atmosphere-handler support-session="false"
                    context-root="/*"
                    class-name="org.atmosphere.handler.ReflectorServletProcessor">
        <property name="servletClassName"
              value="sample.ServerServlet"/>
    </atmosphere-handler>
</atmosphere-handlers>

sample.ServerServlet.java(Server)

package sample;

import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;

import javax.servlet.ServletConfig;
import javax.xml.ws.Endpoint;

public class ServerServlet extends org.apache.cxf.transport.servlet.CXFServlet {

    private static final long serialVersionUID = 1L;

    @Override
    public void loadBus(ServletConfig servletConfig) {
        super.loadBus(servletConfig);
        Bus bus = getBus();
        BusFactory.setDefaultBus(bus);
        Endpoint.publish("/GreetingService", new ServerEndpoint());
    }
}

sample.ServerEndpoint.java(Server)

package sample;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.ResponseWrapper;

@WebService(name="GreetingService",
    targetNamespace="http://sample",
    wsdlLocation="file:///data/projects/apache-cfx/build/service.wsdl",
    serviceName="GreetingService")
@SOAPBinding(style=SOAPBinding.Style.RPC)
public class ServerEndpoint {
    @ResponseWrapper(targetNamespace="http://sample/types",
                     className="java.lang.String")
    @WebMethod(action = "getQuote")
    public String getQuote(@WebParam(name="ticker") String ticker,
                           @WebParam(name="name") String name) {
        return "foobar! " + ticker + " - " + name;
    }
}

0 个答案:

没有答案