2016-07-22 5 views
0

Я хочу закрыть сеанс mgo после того, как он полностью передается клиенту. Сначала я думал, что это может сработать, но кажется, что defer просто ждет, пока функция func не вернется или что-то еще.Как отложить сессию mgo до тех пор, пока она не будет полностью передана клиенту?

func (c App) OpenFile(fileId string) revel.Result { 
    // convert string to bson.ObjectId 
    objId := bson.ObjectIdHex(fileId) 
    file, session := OpenFile(objId) 
    defer session.Close() 
    // memfile io.Reader, filename string, delivery ContentDisposition, modtime time.Time 
    var now = time.Now() 
    return c.RenderBinary(file, "filename", "inline", now) 
} 

ответ

0

Я понятия не имею, что ваша OpenFile функция делает, но я предполагаю, что это с помощью GridFS Монго, чтобы получить доступ к файлу. Вы правы defer session.Close() называется прямо перед возвратом. Если вы используете файл Revel closes it automatically, но в вашем случае вы также хотите закрыть сеанс.

Единственный способ сделать это с помощью специального ридера, который может быть использован Ревелом в RenderBinary. Что-то вроде:

package main 

import (
    "io" 
    "os" 
    "gopkg.in/mgo.v2" 
) 

type MongoReader struct { 
    io.Reader 
    File *os.File 
    Session *mgo.Session 
} 

func (mr *MongoReader) Read(p []byte) (n int, e error) { 
    return mr.File.Read(p) 
} 

func (mr *MongoReader) Close() { 
    mr.File.Close() 
    mr.Session.Close() 
} 

func main() { 
    mr := MongoReader{} 
    mr.Session, mr.File = OpenFile("abababa") 
    return c.RenderBinary(mr, "filename", "inline", now) 
} 

Я не тестировал его на Ревеле, но, поскольку код довольно простой, я думаю, что он должен работать. Возможно, вам понадобятся некоторые специфические методы os.File.

 Смежные вопросы

  • Нет связанных вопросов^_^