2014-04-21 6 views
2

В Play Framework 2.2.2 я хотел бы вернуть обещание. Однако я вызываю функцию, которая нуждается в доступе к переменным, хранящимся в Http.Context.current() (текущий зарегистрированный пользователь, соединение JPA ...).Как использовать Http.Context.current() в обещании в игре?

Конечно, поскольку Promise выполняется в другом потоке, у него нет доступа к Http.Context.current(). Могу ли я сохранить его в обещании, или я должен восстановить его вручную? Есть ли другой образец, который я должен использовать?

Пример:

public static Promise<Result> getAvailableServices() { 
    return new Promise.promise(new Function0<Result>(){ 
     @Override 
     public Result apply() throws Throwable { 
      // Long operation 
      List<Services> data = buildResult(); 
      // Render the template 
      // (The header of the template requires access to 
      // Http.Context.current().args.get("usermodel")) 
      return Results.ok(services_template.render(services)); 
     } 
    }); 
} 
+0

Этот вопрос можно рассматривать как переписку http://stackoverflow.com/questions/17886630/play-2-1-1-java-can-i-access-http-context-current-from-an- Произвольный-asynchro – Adrien

+0

Мы можем передать другой аргумент Promise.promise(), ExecutionContext. Является ли [HttpExecutionContext] (http://www.playframework.com/documentation/2.2.1/api/scala/index.html#play.core.j.HttpExecutionContext) частью ответа? – Adrien

ответ

5

Да, HttpExecutionContext это то, что вам нужно.

При создании HttpExecutionContext . Затем, когда HttpExecutionContext позже используется для выполнения кода it restores the Http.Context.

All Promise methods use an HttpExecutionContextwrapped around the default ExecutionContext поэтому они должны правильно распространять Http.Context через нити.

Ваш пример кода выше должен работать нормально, например. Однако вам нужно убедиться, что когда вы звонитеgetAvailableServices, то Http.Context можно получить в теме, из которой вы звоните. Если Http.Context недоступен, когда вы вызываете метод, то HttpExecutionContext не сможет захватить Http.Context из этого потока и распространять его, когда применяется Function0 обещания.

+1

Он работает! Я использовал '' 'Promise.promise (..., HttpExecution.defaultContext())' ''. Большое спасибо! – Adrien

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