2013-07-17 3 views
0

В моем приложении у меня есть поле «Последнее доступное время» в заголовке, которое обновляется каждые 5 секунд. Я включил header.jsp в другие jsps. [link1.jsp и link2.jsp.Refer screen shot.] Теперь при загрузке я запускаю запрос на сервер, и запрос приостанавливается. // ссылаемся на прикрепленный файл .js и .java-файл Он отлично работает. Я получаю ответ от сервера каждые 5 секунд. Теперь, когда я перехожу к другим jsps, перейдя по ссылке, страница перезагружается, т. Е. Заголовок header.jsp перезагружается. Даже сейчас, я получаю ответ от сервера, но вместо каждых 5 секунд, Я получаю ответ даже для запросов, которые были инициированы во время начальной загрузки страницы. Таким образом, он появляется, хотя поле обновляется каждые 2 секунды вместо фактического интервала в 5 секунд. Когда я продолжаю перемещаться вперед и назад, нажимая на ссылки, часы непрерывно гаснут, были запросы, которые срабатывали в течение различных интервалов.отписаться от подписки

Есть ли способ избежать этого?

Я намерен отменить все предыдущие запросы, когда снова загружу header.jsp. Я попытался отказаться от подписки() в сочетании с длительным опросом. Это не сработало.

Кроме того, я попытался использовать URL-адрес «/ stop» в соответствии с этим link И на его обратном вызове подумал об увольнении запроса, чтобы я мог каждый раз запускать запросы. Даже это не сработало. Вызов «/ stop» остановил запросы от увольнения. Обратный вызов никогда не вызывался.

Я не уверен, что здесь что-то не хватает.

Пожалуйста, помогите мне.

Спасибо.

код расслоение плотной

$("document").ready(function(){ 
fireRequest(); 
}); 
function fireRequest() 
{ 
var socket = $.atmosphere; 
var subSocket; 
var websocketUrl = "atmos/time"; 
var request = { 
     url: websocketUrl, 
     contentType : "application/json", 
     logLevel : 'debug', 
     dataType: 'json', 
     shared:true, 
     transport : 'websocket' , 
     trackMessageLength : true, 
     enableProtocol : true, 
     reconnectInterval : 0, 
     maxReconnectOnClose : 3, 
     dropAtmosphereHeaders : false, 
     timeout : 10 * 60 * 1000, 
     fallbackTransport: 'long-polling', 
     connectTimeout: -1 
    }; 
    request.onMessage = function (response) { 
    try { 
     var data = response.responseBody; 
     $("#time").text(data); 
    } 
    catch(e) 
    { 
     console.log(e); 
    } 

}; 
request.onOpen = function(response) { 
    console.log('onOpen '+ response);   
}; 
request.onReconnect = function (request, response) { 
    console.log('onReconnect ' + request); 
    console.log('onReconnect ' + response); 
}; 
request.onClose = function(response) { 
    if (response.state == "unsubscribe") { 
     alert('window switch'); 
    } 
    console.log('onClose ' + response); 
}, 

request.onError = function(response) { 
    console.log('onError ' + response); 
}; 
subSocket = socket.subscribe(request); 
} 

AtmosphereResource.java

@Path("/{tagid}") 
@Produces("text/html;charset=ISO-8859-1") 
@Singleton 
public class AtmosResource { 

private static final Logger logger = LoggerFactory.getLogger(AtmosResource.class); 
private final AsyncHttpClient asyncClient = new AsyncHttpClient(); 
private final ConcurrentHashMap<String, Future<?>> futures = new ConcurrentHashMap<String, Future<?>>(); 
private final CountDownLatch suspendLatch = new CountDownLatch(1); 
private int count = 1; 

@GET 
public SuspendResponse<String> search(final @PathParam("tagid") Broadcaster feed, 
             final @PathParam("tagid") String tagid, final @Context AtmosphereResource resource) { 

    if (feed.getAtmosphereResources().size() == 0) { 
     final Future<?> future = feed.scheduleFixedBroadcast(new Callable<String>() { 
      public String call() throws Exception { 
       suspendLatch.await(); 
       asyncClient.prepareGet("http://localhost:7070/sample/rest/currentTime").execute(
         new AsyncCompletionHandler<Object>() { 

          @Override 
          public Object onCompleted(Response response) throws Exception { 
           String s = response.getResponseBody(); 
           if (response.getStatusCode() != 200) { 
            feed.resumeAll(); 
            feed.destroy(); 
            return null; 
           } 
           feed.broadcast(s).get(); 
           System.out.println("Current Count::: " + count); 
           count ++; 
           System.out.println("data:: " + new Date().toString()); 
           return null; 
          } 
         }); 
       return null; 
      } 
     }, 5, TimeUnit.SECONDS); 
     futures.put(tagid, future); 
    } 
    return new SuspendResponse.SuspendResponseBuilder<String>().broadcaster(feed).outputComments(true) 
      .addListener(new EventsLogger() { 
       @Override 
       public void onSuspend(
         final AtmosphereResourceEvent event) { 
        super.onSuspend(event); 
        feed.addAtmosphereResource(resource); 
        suspendLatch.countDown(); 
       } 
       // overriding this method to check when the user 
       //switches tabs/closes browser. 
       //ref: https://github.com/Atmosphere/atmosphere/wiki/Detecting-Browser-close%27s-situation-when-using-long-polling 
       @Override 
       public void onDisconnect(final AtmosphereResourceEvent event) 
       { 
        String transport = event.getResource().getRequest().getHeader(HeaderConfig.X_ATMOSPHERE_TRANSPORT); 
        if (transport != null && transport.equalsIgnoreCase(HeaderConfig.DISCONNECT)) { 
         System.out.println("DISCONNECT"); 
        } else { 
         System.out.println("Long-Polling Connection resumed."); 
        } 
       } 
      }).build(); 
} 

@GET 
@Path("stop") 
public String stopSearch(final @PathParam("tagid") Broadcaster feed, 
         final @PathParam("tagid") String tagid) { 
    feed.resumeAll(); 
    if (futures.get(tagid) != null) { 
     futures.get(tagid).cancel(true); 
    } 
    logger.info("Stopping real time update for {}", tagid); 
    return "DONE"; 
} 
} 

Снимок экрана

enter image description here

ответ

0

Я получил его работу, переопределив метод onDisconnect AtmosphereResourceEventListener и связав его с Suspended Response.

@Override 
       public void onDisconnect(final AtmosphereResourceEvent event) 
       { 
        if (event.isCancelled() || event.isClosedByClient()) { 
         feed.resumeAll(); 
         if (futures.get(tagid) != null) { 
          futures.get(tagid).cancel(true); 
         } 
        } 
       } 

Благодаря

Смежные вопросы