Java wAsync客户端可以';断开后,不要重新连接到大气中

Java wAsync客户端可以';断开后,不要重新连接到大气中,java,websocket,jersey,atmosphere,Java,Websocket,Jersey,Atmosphere,我正在开发一个restfulpub-sub应用程序,使用@Subscribe和@Publish注释 服务器崩溃或网络故障后,wAsync触发事件。关闭事件,但无法重新连接到服务器。已创建通道,但现有客户端未使用该通道。然而,新客户可以使用该渠道 请注意,我没有任何日志 软件堆栈 Tomcat 7.0.62 泽西1.19 大气2.4.2 wAsync 2.1.2 Myweb.xml <servlet> <description>AtmosphereServlet

我正在开发一个restfulpub-sub应用程序,使用
@Subscribe
@Publish
注释

服务器崩溃或网络故障后,wAsync触发
事件。关闭
事件,但无法重新连接到服务器。已创建通道,但现有客户端未使用该通道。然而,新客户可以使用该渠道

请注意,我没有任何日志

软件堆栈

  • Tomcat 7.0.62
  • 泽西1.19
  • 大气2.4.2
  • wAsync 2.1.2
Myweb.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>
最后是客户机

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();
        }

    }
}
公共类MetallicaClient{
公共静态void main(字符串[]args){
最终客户端=ClientFactory.getDefault().newClient();
final RequestBuilder request=client.newRequestBuilder()
.method(Request.method.GET)
.uri(“http://localhost:8080/metallica/suscripcion")
.encoder(新编码器(){//流式处理请求正文
@凌驾
公共读取器编码(字符串s){
System.out.println(“编码:+s”);
返回新的StringReader;
}
})
.decoder(新解码器(){
@凌驾
公共读取器解码(事件类型,字符串s){
if(type.equals(Event.MESSAGE)){
System.out.println(“----消息接收----”;
System.out.println(“----日期和时间:“+Calendar.getInstance().getTime().toString()+”----);
}
System.out.println(“解码:+s”);
返回新的StringReader;
}
})
.transport(Request.transport.WEBSOCKET)//尝试WEBSOCKET
.transport(Request.transport.LONG_轮询);//回退到LONG轮询
最终选项生成器clientOptions=client.newOptionsBuilder()
.重新连接(true)
.暂停或重新连接秒(60);
最终套接字=client.create(clientOptions.build());
试一试{
socket.on(“消息”,新函数(){
@凌驾
上的公共无效(字符串s){
System.out.println(“Respuesta:+s”);
}
}).on(新函数(){
@凌驾
上的公共无效(IOE例外){
e、 printStackTrace();
}
}).on(Event.CLOSE.name(),新函数(){
@凌驾
上的公共无效(字符串s){
System.out.println(“seha perdido la conexión con el servidor.”);
试一试{
socket.open(request.build(),60,TimeUnit.SECONDS);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}).on(Event.ERROR,新函数(){
@凌驾
上的公共无效(字符串s){
System.out.println(“错误:+s”);
System.out.println(“seha perdido la conexión con el servidor.”);
试一试{
socket.open(request.build(),60,TimeUnit.SECONDS);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}).on(Event.REOPENED.name(),new Function()){
@凌驾
上的公共无效(字符串s){
System.out.println(“Reconexión.”);
}
}).open(request.build());
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
我有一个回购案在

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();
        }

    }
}