Pergunta

Eu estava navegando pelo código de Vosao CMS, um CMS de código aberto hospedado no Google App Engine (que eu acho que é uma ideia incrível), e eu tropecei no seguinte código dentro do Usuário atual classe:

/**
 * Current user session value cache class. Due to GAE single-threaded nature
 * we can cache currently logged in user in static property. Which we set in 
 * authentication filter.
 */
public class CurrentUser {

        private static UserEntity user;

        public static UserEntity getInstance2() {
                return user;
        }

        public static void setInstance2(UserEntity aUser) {
                user = aUser;
        }
}

Eu nunca usei o GAE, mas isso parece realmente estranho para mim.

  • O GAE é realmente "um único rosqueado"? É seguro armazenar dados escopos de solicitação dentro de um campo estático ao usar o GAE?

  • Isso significa que, para cada instância da JVM, apenas 1 A solicitação HTTP será executada por vez, enquanto todas as outras solicitações estão esperando?

  • Este é um idioma Gae comum? Caso contrário, qual seria o melhor idioma do GAE para armazenar essa usuária durante a duração de uma solicitação? Não se deve usar um threadlocal aqui, como no Spring Security? Ou algum tipo de feijão escopo (gerenciado pelo recipiente de injeção de dependência)?

Foi útil?

Solução

O GAE é realmente "um único rosqueado"? É seguro armazenar dados escopos de solicitação dentro de um campo estático ao usar o GAE?

Costumava ser assim (até 1.4.3) e ainda é por padrão.

Agora, você pode especificar que seu aplicativo é threadsafe, e então você receberá solicitações simultâneas para a mesma JVM/Servlet.

Isso significa que, para cada instância da JVM, apenas uma solicitação HTTP será executada por vez, enquanto todas as outras solicitações estão esperando?

Para outro pedido, você provavelmente receberá outra JVM. Mas isso está fora do seu controle. Eles também podem esperar.

Outras dicas

Atualmente, o Java e o Python RunTimes no App Engine são um único rosqueado; Você está certo de que isso significa que apenas uma solicitação HTTP será executada por JVM, mas várias JVMs serão iniciadas simultaneamente para lidar com várias solicitações recebidas.

Isso pode mudar a qualquer momento no futuro, no entanto - o Java Servlet Spec permite multi -threading. Como resultado, você deve definitivamente usar um threadlocal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top