软件堆栈:
我们有2个单独的申请。一方面,我们有一个PrimeFaces应用程序,除其他外,发送通知。另一方面,我们有一个独立的Android应用程序。我们正试图找出PF浏览器客户端使用wAsync发送/接收独立Android客户端消息的最佳方式。
似乎Android应用程序能够成功连接。但是,发送PF的通知没有任何效果,应用程序没有收到它,并且Android应用程序或服务器上都没有错误消息。
这是主要代码:
@PushEndpoint("/servicios")
public class ServiciosPushControlador implements ServiciosControladorListener {
@Override
@OnMessage(encoders = {JSONEncoder.class})
public String servicioActualizado(Servicio servicio) {
return "update";
}
}
Atmosphere的web.xml配置
<!-- PUSH PrimeFaces-->
<servlet>
<servlet-name>Push Servlet</servlet-name>
<servlet-class>org.primefaces.push.PushServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Push Servlet</servlet-name>
<url-pattern>/primepush/*</url-pattern>
</servlet-mapping>
这是Android代码:
public <ResultType> void notificationSuscriber(Function<ResultType> succesFunction, Function<IOException> errorFunction, final Class<ResultType> clazz) throws IOException {
RequestBuilder request = client.newRequestBuilder()
.method(org.atmosphere.wasync.Request.METHOD.GET)
.uri("http://192.168.0.101:8080/calview/primepush/servicios")
.encoder(new Encoder<ResultType, String>() {
@Override
public String encode(ResultType s) {
try {
return mapper.writeValueAsString(s);
} catch (IOException iOEx) {
throw new RuntimeException(iOEx);
}
}
})
.decoder(new Decoder<String, ResultType>() {
@Override
public ResultType decode(Event e, String s) {
if (s.length() == 0)
return null;
if (e.equals(Event.MESSAGE)) {
try {
return new ObjectMapper().readValue(s, clazz);
} catch (IOException iOEx) {
iOEx.printStackTrace();
return null;
}
} else
return null;
}
})
.transport(org.atmosphere.wasync.Request.TRANSPORT.WEBSOCKET);
Socket socket = client.create();
socket.on("message", succesFunction)
.on(errorFunction)
.open(request.build());
}