2012-07-05 3 views
0

나는 웹 스택에 &를 이동하기 위해 구글 AppEngine에 &에 새로운 해요 - 그래서 내가 잘못 여기하고있어 매우 가능성이 뭔가,하지만 난에서 appengine dev_appserver 시간 낯선

I : 그것을 알아낼 수 없습니다 서버가 클라이언트에 푸시하는 Go에서 간단한 시계 응용 프로그램을 작성하려고합니다 & JS 처리기가 HTML 요소를 업데이트합니다. TaskQueue API를 사용하여 서버 쪽 업데이트 일정을 변경하고 기본 큐 빈도를 초당 한 번 변경했습니다. 서버는 작업 URL에 &의 현재 시간이 표시된 횟수를 포함하는 페이로드 문자열을 보냅니다. 조회수는 예상대로 초당 1의 속도로 업데이트되지만 시간 소인은 거의 변하지 않습니다. 나는 dev_appserver 콘솔에서보고 있어요 로그 출력은 내가 아래에있는 내 코드를 붙여 넣은

INFO  2012-07-05 03:04:31,955 dev_appserver.py:2952] "POST /update HTTP/1.1" 200 - 
INFO  2012-07-05 03:04:31,985 dev_appserver.py:2952] "POST /update HTTP/1.1" 200 - 
INFO  2012-07-05 03:04:32,015 dev_appserver.py:2952] "POST /update HTTP/1.1" 200 - 
INFO  2012-07-05 03:04:32,043 dev_appserver.py:2952] "POST /update HTTP/1.1" 200 - 

올바른 보이는 (A 페이스트 빈 낫다?).

건배!

package clock 

import (
    "fmt" 
    "appengine" 
    "appengine/channel" 
    "appengine/datastore" 
    "appengine/taskqueue" 
    "html/template" 
    "net/http" 
    "time" 
// "appengine/user" 
) 

type Greeting struct { 
    Author string 
    Content string 
    Date time.Time 
} 

func init() { 
    http.HandleFunc("/", root) 
    http.HandleFunc("/update", update) 
} 

type TemplateFiller struct { 
    Time  string 
    Token  string 
} 

var clientId string = "clockclient" 

func root(w http.ResponseWriter, r *http.Request) { 
    c := appengine.NewContext(r) 
    q := datastore.NewQuery("Greeting").Order("-Date").Limit(10) 
    greetings := make([]Greeting, 0, 10) 
    if _, err := q.GetAll(c, &greetings); err != nil { 
     http.Error(w, err.Error(), http.StatusInternalServerError) 
     return 
    } 

    token, _ := channel.Create(c, clientId); 
    tf := TemplateFiller{time.Now().String(), token} 

    if err := guestbookTemplate.Execute(w, tf); err != nil { 
     http.Error(w, err.Error(), http.StatusInternalServerError) 
    } 

    reschedule(c) 
} 

func reschedule(c appengine.Context) { 
    t := taskqueue.NewPOSTTask("/update", map[string][]string{"token": {clientId}}) 
     if _, err := taskqueue.Add(c, t, ""); err != nil { 
      return 
     } 
} 

var hits int = 0 

func update(w http.ResponseWriter, r *http.Request) { 
    c := appengine.NewContext(r) 
    channel.Send(c, clientId, fmt.Sprintln(hits) + time.Now().Format(time.RFC3339)) 
    hits = hits + 1 
    //channel.Send(c, clientId, time.Now().Format(time.RFC3339)) 
    reschedule(c) 
} 

var guestbookTemplate = template.Must(template.New("").Parse(guestbookTemplateHTML)) 

const guestbookTemplateHTML = ` 
<html> 
    <script type="text/javascript" src="/_ah/channel/jsapi"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
    <body> 
<div id="timediv">No time</div> 

<script type="text/javascript"> 
$(document).ready(function(){ 

    onMessage = function(msg) { 
     $("#timediv").html(msg.data); 
    } 

    channel = new goog.appengine.Channel('{{.Token}}'); 
    socket = channel.open(); 
    //socket.onopen = onOpened; 
    socket.onmessage = onMessage; 
    //socket.onerror = onError; 
    //socket.onclose = onClose; 
}); 

</script> 

    </body> 
</html> 
` 

답변

2
  1. dev_server 큐 및 타이밍 브래드는 프로덕션 서버 (현명한 타이밍)의 작동 방식처럼 아무것도 작동하지 않습니다.
  2. constat 및 stable timer interup을 제공하기 위해 대기열에 의존하는 것은 매우 나쁜 생각입니다.
+0

응답 해 주셔서 감사합니다. 1. 시간을 사용하고 있습니다.(). 시간을 얻으려면 String()을 사용하십시오. 서버의 타임 스탬프는 OS에서오고 있으며 수정해야합니다. 2. Task 큐가 정기적 인 업데이트 이상을 제공 할 것으로 기대하지 않습니다. 프로덕션에서 이런 종류의 것을 사용하려고하지는 않지만, 첫 번째 테스트 앱은 아주 이상한 행동을 보였다. – bradbeveridge

관련 문제