arquitetura - java platform enterprise edition spring framework



Por que a desova de encadeamentos no contêiner do Java EE é desencorajada? (6)

Utilitários de simultaneidade para Java EE

Existe agora uma maneira padrão e correta de criar encadeamentos com a principal API do Java EE:

Ao usar o Concurrency Utils, você garante que o novo thread seja criado e gerenciado pelo contêiner, garantindo que todos os serviços do EE estejam disponíveis.

Exemplos here

Uma das primeiras coisas que aprendi sobre o desenvolvimento do Java EE é que eu não deveria gerar meus próprios threads dentro de um contêiner Java EE. Mas quando chego a pensar nisso, não sei o motivo.

Você pode explicar claramente porque é desencorajado?

Tenho certeza de que a maioria dos aplicativos corporativos precisa de algum tipo de trabalho assíncrono, como daemons de correio, sessões ociosas, trabalhos de limpeza, etc.

Então, se de fato não se deve gerar threads, qual é a maneira correta de fazê-lo quando necessário?


É desencorajado porque todos os recursos dentro do ambiente devem ser gerenciados e potencialmente monitorados pelo servidor. Além disso, grande parte do contexto em que um thread está sendo usado é normalmente anexado ao próprio thread de execução. Se você simplesmente iniciar seu próprio thread (que, acredito, alguns servidores nem permitirão), ele não poderá acessar outros recursos. Isso significa que você não pode obter um InitialContext e fazer pesquisas JNDI para acessar outros recursos do sistema, como Fábricas de Conexões JMS e Fontes de Dados.

Existem maneiras de fazer isso "corretamente", mas isso depende da plataforma que está sendo usada.

O commonj WorkManager é comum para o WebSphere e o WebLogic, além de outros

Mais informações aqui

E aqui

Também duplica um pouco desta manhã

ATUALIZAÇÃO: Por favor, note que esta questão e resposta se relacionam com o estado do Java EE em 2009, as coisas melhoraram desde então!


Eu nunca li que isso é desencorajado, exceto pelo fato de que não é fácil fazer isso corretamente.

É uma programação razoavelmente de baixo nível e, como outras técnicas de baixo nível, você deve ter um bom motivo. A maioria dos problemas de simultaneidade pode ser resolvida de forma muito mais eficaz usando construções internas como conjuntos de encadeamentos.


Para EJBs, não é apenas desencorajado, é expressamente proibido pela specification :

Um bean corporativo não deve usar primitivos de sincronização de encadeamentos para sincronizar a execução de várias instâncias.

e

O enterprise bean não deve tentar gerenciar encadeamentos. O enterprise bean não deve tentar iniciar, parar, suspender ou continuar um encadeamento ou alterar a prioridade ou o nome de um encadeamento. O bean corporativo não deve tentar gerenciar grupos de encadeamentos.

A razão é que os EJBs são destinados a operar em um ambiente distribuído. Um EJB pode ser movido de uma máquina em um cluster para outro. Fios (e tomadas e outras instalações restritas) são uma barreira significativa para esta portabilidade.


Uma razão que eu encontrei se você gerar alguns threads em seu EJB e então tentar fazer com que o contêiner descarregue ou atualize seu EJB, você terá problemas. Há quase sempre uma outra maneira de fazer algo em que você não precisa de um Thread, então diga NÃO.


Você sempre pode dizer ao contêiner para iniciar o material como parte de seus descritores de implantação. Estes podem então fazer as tarefas de manutenção que você precisa fazer.

Siga as regras. Você ficará feliz em algum dia que você fez :)





java-ee