Клиент wAsync не может повторно подключиться к Atmosphere после отключения
Я разрабатываю суб-приложение RESTful Pub, используя @Subscribe
а также @Publish
аннотаций.
После сбоя сервера или сбоя сети wAsync срабатывает Event.CLOSE
событие, но оно не может восстановить соединение с сервером атмосферы. Канал создан, но существующие клиенты не подключены к нему. Тем не менее, новые клиенты могут подписаться на этот канал.
Обратите внимание, что у меня нет никакого журнала.
Программный стек
- Tomcat 7.0.62
- Джерси 1.19
- Атмосфера 2.4.2
- wAsync 2.1.2
Мой web.xml
<servlet>
<description>AtmosphereServlet</description>
<servlet-name>AtmosphereServlet</servlet-name>
<servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>
com.mesview.rest
</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>org.atmosphere.websocket.messageContentType</param-name>
<param-value>application/json</param-value>
</init-param>
<init-param>
<param-name>org.atmosphere.cpr.AtmosphereInterceptor</param-name>
<param-value>org.atmosphere.interceptor.HeartbeatInterceptor</param-value>
</init-param>
<async-supported>true</async-supported>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AtmosphereServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Реализация Джерси
@Path("metallica")
public class MetallicaService {
@GET
@Path("/suscripcion")
@Subscribe(value = "metallica", timeout = -1)
public String handshake() {
return null;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Track getTrackInJSON() {
Track track = new Track();
track.setTitle("Enter Sandman");
track.setSinger("Metallica");
return track;
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Publish("metallica")
public String createTrackInJSON(Track track) {
String result = "Metallica -- Track saved : " + track;
//return Response.status(201).entity(result).build();
return result;
}
}
И, наконец, клиент
public class MetallicaClient {
public static void main(String[] args) {
final Client client = ClientFactory.getDefault().newClient();
final RequestBuilder request = client.newRequestBuilder()
.method(Request.METHOD.GET)
.uri("http://localhost:8080/metallica/suscripcion")
.encoder(new Encoder<String, Reader>() { // Stream the request body
@Override
public Reader encode(String s) {
System.out.println("Encode: " + s);
return new StringReader(s);
}
})
.decoder(new Decoder<String, Reader>() {
@Override
public Reader decode(Event type, String s) {
if (type.equals(Event.MESSAGE)) {
System.out.println("---- Message received ----");
System.out.println("---- Date and time: " + Calendar.getInstance().getTime().toString() + " ----");
}
System.out.println("Decode: " + s);
return new StringReader(s);
}
})
.transport(Request.TRANSPORT.WEBSOCKET) // Try WebSocket
.transport(Request.TRANSPORT.LONG_POLLING); // Fallback to Long-Polling
final OptionsBuilder<DefaultOptions, DefaultOptionsBuilder> clientOptions = client.newOptionsBuilder()
.reconnect(true)
.pauseBeforeReconnectInSeconds(60);
final Socket socket = client.create(clientOptions.build());
try {
socket.on("message", new Function<String>() {
@Override
public void on(String s) {
System.out.println("Respuesta: " + s);
}
}).on(new Function<IOException>() {
@Override
public void on(IOException e) {
e.printStackTrace();
}
}).on(Event.CLOSE.name(), new Function<String>() {
@Override
public void on(String s) {
System.out.println("Se ha perdido la conexión con el servidor.");
try {
socket.open(request.build(), 60, TimeUnit.SECONDS);
} catch (IOException e) {
e.printStackTrace();
}
}
}).on(Event.ERROR, new Function<String>() {
@Override
public void on(String s) {
System.out.println("Error: " + s);
System.out.println("Se ha perdido la conexión con el servidor.");
try {
socket.open(request.build(), 60, TimeUnit.SECONDS);
} catch (IOException e) {
e.printStackTrace();
}
}
}).on(Event.REOPENED.name(), new Function<String>() {
@Override
public void on(String s) {
System.out.println("Reconexión.");
}
}).open(request.build());
} catch (IOException e) {
e.printStackTrace();
}
}
}
У меня есть кейс для репо на https://github.com/hecnabae/jerseyAtmosphere