2016-06-20 8 views
0

Ich bin ein System, das Push-Benachrichtigungsfunktion und verwenden Sie Jersey, um API zu erstellen.
Ich las eine article über Kometen Ansatz und mit dem folgenden Code am Ende:

Index.js
Cant Zugriffserfolg Funktion, wenn Anruf rekursiv Ajax

function checkExamNotification() { 
    $.ajax({ 
     url: contextPath + '/api/notification/checkExamNotification', 
     type: 'get', 
     data: { 
      accountId: accountId, 
      sessionId: sessionId 
     }, 
     success: function (res) { 
      console.log("success"); 
      displayNumberOfNotification(); 
      checkExamNotification(); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      if (textStatus === "timeout") { 
       checkExamNotification(); 
      } 
     } 
    }); 
} 

$(document).ready(function() { 
    $.ajaxSetup({ 
     timeout: 1000*60*3 
    }); 
    checkExamNotification(); 
}); 

prüft Prüfung Benachrichtigung API

@GET 
@Path("/checkExamNotification") 
public Response checkExamNotification(@QueryParam("accountId") int accountId, @QueryParam("sessionId") String sessionId) throws InterruptedException { 
    if (memCachedClient.checkSession(sessionId, accountId)) { 
     while (!examNotificationQueue.hasItems()) { 
      Thread.sleep(5000); 
     } 

     ExamNotificationQueueItemModel examNotificationQueueItemModel = examNotificationQueue.dequeue(); 
     if (examNotificationQueueItemModel.getAccountId() == accountId) { 
      LOGGER.info("[START] Check exam notification API"); 
      LOGGER.info("Account ID: " + accountId); 
      LOGGER.info("Get notification with exam ID: " + examNotificationQueueItemModel.getExamId()); 

      ExamEntity exam = examDAO.findById(examNotificationQueueItemModel.getExamId()); 
      NotificationEntity notification = notificationDAO.findByExamId(exam.getExamid()); 
      notification.setSend(1); 
      notificationDAO.getEntityManager().getTransaction().begin(); 
      notificationDAO.update(notification); 
      notificationDAO.getEntityManager().getTransaction().commit(); 

      LOGGER.info("[END]"); 
      String result = gson.toJson(examNotificationQueueItemModel); 
      return Response.status(200).entity(result).build(); 
     } else { 
      examNotificationQueue.enqueue(examNotificationQueueItemModel); 
      Thread.sleep(5000); 
      checkExamNotification(accountId, sessionId); 
     } 

    } 
    return Response.status(200).entity(gson.toJson("timeout")).build(); 
} 

Aus meiner debug, Die API wurde zwar beendet, aber das Erfolgsereignis SOMETIMES wurde nicht ausgelöst.
Ja, manchmal Konsolenprotokoll Erfolg, aber manchmal nicht.
Kann mir jemand diesen Fall erklären?
Vielen Dank im Voraus. Jede Hilfe wäre willkommen.

+0

Ich sehe nicht, wie dies drängt. Sie sollten in die Unterstützung von Trikots für mehrere gesendete Ereignisse (SSE) schauen. Dies nutzt echtes Pushing. –

+0

Entschuldigung für die späte Antwort. Ich werde es versuchen. Aber können Sie erklären, warum die Antwort nicht richtig zurückgegeben wurde? –

Antwort

0

Ok, nachdem Sie @peeskillet kommentiert haben. Hier ist mein Code.

prüfen Prüfung Benachrichtigung API

@GET 
@Produces(SseFeature.SERVER_SENT_EVENTS) 
@Path("/checkExamNotification") 
public EventOutput checkExamNotification(@QueryParam("accountId") final int accountId, @QueryParam("sessionId") final String sessionId) { 
    final EventOutput eventOutput = new EventOutput(); 
    if (memCachedClient.checkSession(sessionId, accountId)) { 
     new Thread(new Runnable() { 
      public void run() { 
       try { 
        if (examNotificationQueue.hasItems()) { 
         ExamNotificationQueueItemModel examNotificationQueueItemModel = examNotificationQueue.dequeue(); 
         if (examNotificationQueueItemModel.getAccountId() == accountId) { 
          LOGGER.info("[START] Check exam notification API"); 
          LOGGER.info("Account ID: " + accountId); 
          LOGGER.info("Get notification with exam ID: " + examNotificationQueueItemModel.getExamName()); 
          String result = gson.toJson(examNotificationQueueItemModel); 
          final OutboundEvent.Builder eventBuilder 
            = new OutboundEvent.Builder(); 
          eventBuilder.data(result); 
          final OutboundEvent event = eventBuilder.build(); 
          eventOutput.write(event); 
          LOGGER.info("[END]"); 
         } else { 
          examNotificationQueue.enqueue(examNotificationQueueItemModel); 
         } 
        } 

       } catch (IOException e) { 
        throw new RuntimeException(
          "Error when writing the event.", e); 
       } finally { 
        try { 
         eventOutput.close(); 
        } catch (IOException ioClose) { 
         throw new RuntimeException(
           "Error when closing the event output.", ioClose); 
        } 
       } 
      } 
     }).start(); 
    } 

    return eventOutput; 
} 

Index.js

function checkExamNotification() { 
    var url = contextPath + '/api/notification/checkExamNotification?accountId=' + accountId + '&sessionId=' + sessionId; 
    var source = new EventSource(url); 
    source.onmessage = function (event) { 
     displayNumberOfNotification(); 
    }; 
}