我的应用程序需要使用WebSockets发送和接收SOAP消息。 大多数情况下,客户端(用Python编写)以一种简单的请求 - 响应模式与服务器(Java)进行通信。
有时,如果客户端更新服务器管理的集中式数据库中的某些数据,则应通知所有其他客户端更新的数据或任何其他类型的通知(广播)
我目前的筹码包括以下技术:
可以更改堆栈,但以下情况除外:
以请求 - 响应模式与服务器通信已经在运行。 但是,我不知道如何让服务器推送工作。 我已经使用了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;
}
}