Я создаю систему, которая имеет функцию уведомления о нажатиях и использует Джерси для создания API.
Я прочитал article о кометной подходе и в конечном итоге с помощью следующего кода:
index.js
Невозможность доступа к функции успеха при вызове рекурсивного 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();
});
Проверка уведомления экзамен 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();
}
С моей отладки, API завершил возврат, но событие успеха SOMETIMES не срабатывало.
Да, иногда успех в консольном журнале, но иногда это не так.
Может ли кто-нибудь объяснить мне этот случай?
Заранее спасибо. Любая помощь будет оценена по достоинству.
Я не вижу, как это толкает. Вы должны заглянуть в поддержку трикотажных изделий для нескольких отправленных событий (SSE). Это использует реальное нажатие. –
Извините за поздний ответ. Я попробую свой путь. Но можете ли вы объяснить, почему он не ответил правильно? –