2014-01-16 63 views
0

我正在開發Spring Hibernate中的管理應用程序,其中需要實現計時器系統。使用計時器在Spring Web應用程序中跟蹤用戶操作

USE CASE

  1. 用戶點擊的活動或在UI(JSP)的事件。計時器啓動後,它會在UI上顯示倒計時。只有在規定的計時器計數結束後,用戶才能再次執行該事件。

  2. 我需要在數據庫中保存時間,因爲如果用戶關閉瀏覽器,計數器計數應該在服務器中繼續。就像我們在基於網絡的社交媒體遊戲中遇到的一樣。

我在網上搜索了一個解決方案,但沒有遇到任何東西。我嘗試了Spring Scheduling,但似乎沒有解決這個問題,並且它有很多限制。

任何人都可以建議我任何解決方案嗎?由於

+0

充其量,您可以嘗試'window.onbeforeunload'來以某種方式通知服務器,您的瀏覽器窗口正在關閉。 –

回答

1

要回答這個問題,我會承擔下列:

  1. 在您需要異步運行後臺作業
  2. 的能力後端 的前端
  3. 一個JavaScript計時器就足夠了倒計時(不管後臺工作是否稍微休息)

基本的想法是,你發送一個日期戳到服務器,在前端開始倒計時,並且任何時候有一個互動再次嘗試活動,你問問rver(相同的後臺任務),如果時間間隔已經完成。

下面的解決方案是開始,並不是管理這種交互所需要的完整版本。

在前端你能想象做這樣的事情:

function restoreAndStartTimer(response, initialLoad){ 
    var secondsToCountDown = 10; 
    //Here we can use the server response to tell us if there's already 
    //a timer running 
    if(response.timerRunning){ 
     secondsToCountDown = response.secondsRemaining; 
    } 
    //Now kickoff the front-end timer 
    function countdown(){ 
     //Add code here to display stuff to the screen, etc 
     if(secondsToCountDown !== 0){ 
     secondsToCountDown--; 
     setTimeout(countdown, 1000); 
     } 
    }; 
    if(initialLoad){ 
     if(response.timerRunning) countdown(); 
    } else { 
     countdown(); 
    } 
}; 

//Click handler, assuming you use jQuery 
$('#myActivityButton').on('click', function(){ 
    $.ajax({ 
     url: 'https://...', 
     type: 'POST', 
     //Grabs the time of the click and sends it off to the server 
     data: { currentTime: new Date() }, 
     success: function(response){ 
     restoreAndStartTimer(response, false); 
     } 
    }); 
}); 

$(function(){ 
    //On document ready 
    //This should be wrapped as a function to avoid repetition, but for the sake of 
    //expediency using this editor... 
    $.ajax({ 
     url: 'https://...', 
     type: 'POST', 
     data: { currentTime: new Date() }, 
     //If a user had reloaded the page while a timer was running, it will get picked 
     //up here, otherwise it does nothing. 
     success: function(response){ 
     restoreAndStartTimer(response, true); 
     } 
    }); 
}); 

至於後端,你會運行一個後臺線程的一些方法。該線程將通過前端發送的初始時間戳獲取時間和返回任何根據狀態以下響應:

  1. response.timerRunning = trueresponse.secondsRemaining = #ofSeconds考慮到時間間隔尚未完成
  2. response.timerRunning = false當時間間隔終於完成時