import net.liftweb.http._
import net.liftweb.common._
import com.google.appengine.api.datastore._
object SessionCleaner {
// Iteratorのimplicit conversionは定義されていないようなので自前で定義。
implicit def j2s[A](j: java.util.Iterator[A]) =
new scala.collection.jcl.MutableIterator.Wrapper[A](j)
private lazy val DSS = DatastoreServiceFactory.getDatastoreService
def execute(): Box[LiftResponse] = {
var count = 0
try {
val q = new Query("_ah_SESSION")
q.addFilter("_expires", Query.FilterOperator.LESS_THAN_OR_EQUAL, System.currentTimeMillis)
DSS.prepare(q).asIterator.foreach(e => {DSS.delete(e.getKey); count = count + 1})
} finally {
println(count + " sessions deleted.")
}
Full(OkResponse())
}
}
Boot.scalaのdef boot内にはこんな感じ。
LiftRules.statelessDispatchTable.append {
case Req("cron" :: "sessionCleaner" :: Nil, _, _) => () => SessionCleaner.execute()
}
こんなことしなくても標準でSessionCleanupServlet てのがあったんですね…
返信削除参考:http://d.hatena.ne.jp/nowokay/20100209