appengine dev_appserver时间陌生

时间:2012-07-05 03:31:15

标签: google-app-engine go

我是谷歌AppEngine&的新手。 Go&到Web堆栈 - 所以很可能我在这里做错了,但我无法弄明白:)

我正在尝试在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 -

我在下面粘贴了我的代码(更好的是一个pastebin?)。

干杯! 布拉德

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>
`

1 个答案:

答案 0 :(得分:2)

  1. dev_server队列和时序的行为与生产服务器的行为方式完全不同(按时间顺序)。
  2. 依赖队列为你提供一个constat和稳定的计时器,这是一个非常糟糕的主意。