Archive for the ‘JEE’ Category

Se divertindo com testes de carga e stress com JMeter

31/03/2015

É exatamente nesse momento que você começa a perceber se aquilo que arquiteturou realmente funciona…..

ThreadsThreads3

Threads2

tomcat

 

Apache JMeter – http://jmeter.apache.org/

“Enganoso é o coração, mais do que todas as coisas, e desesperadamente corrupto; quem o conhecerá? Eu, o SENHOR, esquadrinho o coração, eu provo os pensamentos; e isto para dar a cada um segundo o seu proceder, segundo o fruto das suas ações.” Jeremias 17:9-10

Anúncios

Aprender sobre performance em Java

20/02/2015

Estes dias me perguntaram como aprender sobre questões de melhorar a performance em soluções Java. Depois de estudar sobre o assunto, segue os livros para qualquer um imergir e se especializar no assunto:

download

Veja o livro 1

download (1)

Veja o livro 2

download (2)

Veja o livro 3

download (3)

Veja o livro 4

Neles você encontrara as informações e as técnicas para otimizações de performance.

“E nós conhecemos e cremos no amor que Deus tem por nós. Deus é amor, e aquele que permanece no amor permanece em Deus, e Deus, nele.” 1 João 4:16

Se o MVC fosse um diálogo

09/02/2015

IMG-20150206-WA0001

“Alegrai-vos, pois, filhos de Sião, regozijai-vos no SENHOR, vosso Deus, porque ele vos dará em justa medida a chuva; fará descer, como outrora, a chuva temporã e a serôdia.” Joel 2:23

Tunning de Aplicações Web

29/09/2014

salon-tuning-bA velocidade da aplicação em executar os processos está intimamente ligada com a experiência do usuário final. Na prática, vejo que os responsáveis pela criação de sistemas (gerentes, projetistas e programadores) não têm colocado isso como um fator de preocupação nos ciclos de desenvolvimento. O resultado é o mesmo de sempre, em ambiente de testes, homologação e durante algum tempo inicial de produção, o sistema acaba enganosamente funciona lindo e maravilhoso, mas depois de algum tempo, as reclamações relacionadas com a lentidão começam a aparecer. Diante desse contexto, segue abaixo as principais práticas que eu venho utilizando como sucesso como se fosse uma “receita de bolo” para resolver esse tipo de situação:

Acesso ao Banco de Dados

Reduzir ao máximo o número de vezes que a solução faz acesso ao banco de dados.

Problema: Muitos programadores têm a mania de ir desenvolvendo classes, componentes e módulos sem antes e/ou durante fazer uma análise organizada de como estas partes do sistema estão fazendo estes acessos. Com isso, vemos como resultado aplicações com baixa performance devido aos vários e desnecessários acessos ao banco “round-trips” que se multiplicam a medida do número de usuários simultaneamente conectados.

Solução: Analisar quantas vezes a aplicação está acessando o banco, o porquê do acesso, e assim tentar uma forma de evitar este acesso. Neste momento, muitos profissionais pecam por não conhecerem recursos básicos de banco de dados e de SQL-ANSI, principalmente pelas propagações de frameworks ORM. Qualquer meio é válido, alguns recursos usados para alcançar isso são o uso de VIEWS, JOIN, SUBQUERYS e o Pattern Store Procedure Facade. Todos os programadores têm que possuir um lema em mente: “O acesso remoto é que mais degrada a performance de uma aplicação e o acesso ao banco de dados é um deles, então eu tenho que fazer de tudo para evitar ou minimizar ao máximo.

Índices Adequados

Criar os índices para as todas as tabelas que sofrem consultas na aplicação.

Problema: Muitos programadores não têm o mínimo de fundamentos de banco de dados, criando bancos sem nenhum índice de busca para as tabelas que sofrem alto número de SELECT + WHERE CAMPO. A questão problemática é que quando uma tabela sem índice sofre um SELECT +WHERE CAMPO, o registro é buscado, na maioria das vezes, da pior e mais demorada forma possível, que é o “seqüencialmente”. A pior notícia é que isso é um problema cumulativo, ou seja, quanto mais registro existente, mais demorada fica a consulta. Já tive experiências de diminuir o tempo de um procedimento de fechamento mensal em 50% do tempo, pelo simples ato de criar os índices nas tabelas usados pelo processo.

Solução: Para cada SELECT que o programa faz, em cada tabela, verifique os campos de busca colocados no WHERE e, assim, crie um índice para cada um deles.

Consultas Gigantescas

Sistemas que permitem o usuário consultar e trazer do banco de dados um alto número de registros.

Problema: Algumas situações comumente ocorrentes em sistemas no modelo desktop, ou mais conhecido como “FAT CLIENT”, não se encaixam em aplicativos web. Um destes casos é quando sistemas permitem aos usuários filtrar e trazer do banco de dados consultas com um alto número de registros complemente desnecessário. Em casos em que o modelo era desktop, isso não acarretava problemas devido à própria natureza da solução. Entretanto em sistemas web, onde recursos de execução são compartilhados e o numero de acesso simultâneos é ilimitado, o sistema estará gastando um alto e precioso numero relevante de memória.

Explicando de forma prática, eu já peguei sistemas na redondezas onde os programadores estavam replicando a arquitetura que continha uma camada de persistência CRUD. A questão problemática era que o framework replicava um método que sempre retornava todos os registros existente. Isto estava sendo propagado para todo o sistema e seus processos relacionados. Se paramos para analisar, mecanismos de busca são disponibilizados ao usuário para que ele tenha autonomia de buscar registros individuais ou grupos lógicos deles. Qual seria o motivo, ou o que poderia fazer um usuário com 500 linhas de resultados de uma consulta? Que ser humano na face da terra gostaria de visualizar 500 registros em uma olhada? Mesmo que a regra de negócio ainda apoiasse o caso, o usuário final, sendo um humano comum, não teria tamanha visibilidade para isso.

Solução: Os processos do sistema em questão devem ser analisados e devem ser implementadas validações lógicas corretas, que não permitam  executar consultas que retornem uma alto número de registros no banco de dados. Duas práticas neste tópico são bem comuns – o uso sistemático de paginação, e a implementação de filtros inteligentes, baseados em regra do próprio negócio, que não deixassem a ocorrência de grandes intervalos. Como tudo na vida, existem exceções, e podemos, sim, encontrar situações em sistemas que teriam a necessidade de consultar grandes volumes de registros, mas isso já está mais que comprovado que é uma porcentagem pequena e restrita do total da automação.

Ordenação de Dados

Ordenar dados em memória usando java ao invés de usar ORDER BY.

Problema: Uma funcionalidade muito comum é disponibilizar a ordenação das tabelas apresentadas na aplicação pelas suas próprias colunas. A questão problemática é quando a aplicação efetua mais um acesso ao banco a cada ordenação requisitada. Ou seja, o programador usa o recurso de SELECT ORDER BY para fazer a ordenação.

Solução: Transformar as linhas da tabela em objetos java e, assim, ordená-los usando recursos do JSE, evitando gasto com tempo, acesso ao banco e recursos de memória. Esta solução pode ser facilmente implementando com a interface Comparable.

Pool de Conexões

Use indiscutivelmente a abordagem de pool como paradigma de acesso ao banco de dados.

Problema: Eu realmente não sei o motivo, mas já peguei alguns aplicativos web por aí que abrem e fecham objetos de conexão com o banco de dados a cada requisição. Ou seja, a cada pedido enviado ao container java, no mínimo 2 chamadas remotas são efetuadas, uma para autenticar o usuário/senha e outra para efetuar a comando SQL desejado. Esta opção é uma das piores gafes que um desenvolvedor web pode fazer para deixar o sistema com a pior performance possível, sem falar que o sistema pode “baleiar” o banco quando o número de acesso simultâneos exceder a capacidade de resposta do determinado banco de dados.

Solução: Na web existe uma única solução comprovada que é o uso efetivo da abordagem de Pool de conexões. No momento da disponibilização – deploy da aplicação, o sistema deve abrir um numero X de conexões com o banco de dados que sera posteriormente usado em toda a aplicação. Esta abordagem mistura o conceito de compartilhamento e concorrência, sendo que pedidos em tempos diferentes reutilização a mesma conexão e pedidos simultâneos usarão diferentes conexões. Este numero X deve ser levantando e configurada de forma parametrizada de acordo com o perfil da aplicação e do modo/quantidades que os usuários estarão gastando conexões durante utilização do sistema.

Cache

Cachear informações que sofrem alto índice de acesso e baixa ocorrência de alteração.

Problema: Sistemas em geral implementam administração de informações na qual poderíamos classificar em 2 tipos: dados de manutenção/parâmetros e de processos:

  • Manutenção/Parâmetros informações que os sistemas têm que guardar, usadas como parte do processo, que não possuem um fim nelas mesmas. Estes tipo de formação frequentemente sofre um baixo índice de manutenção e um alto número de acesso. Ou seja, no escopo da aplicação, estes dados raramente são alterados e muitos usados.
  • Processos informações resultantes de processos com regras de negócio do escopo da aplicação. Estes podem ou não sofrer alterações e podem ou não ser altamente acessados. Tudo depende da natureza do negócio da aplicação.

A situação complicada seria o sistema fazer um acesso ao banco de dados a cada momento que diferentes usuários (concorrentes ou não) necessitam usar informações de manutenção, que na grande maioria dos casos são iguais. Ou seja, teríamos vários usuários acessando o banco de dados repetidas vezes para pegar as mesmas informações, gastando assim tempo e memória de forma desnecessária.

Solução: Analisar cuidadosamente e cachear as determinadas informações que se encaixam de alguma maneria no perfil de dados de “Manutenção/Parâmetros”. Conceitualmente, é fácil visualizar o mecanismos de cache: o primeiro usuário que necessitar da determinada informação efetuará um acesso ao banco e cacheará os dados em algum lugar na memória, fazendo com que os próximos usuários não precisem gastar tempo e memória repetindo o ciclo. O cache é atualizado quando estes dados forem atualizados de alguma maneira no sistema, bem como o perfil deles já mostrou que seria um caso difícil de acontecer.

Segue um resumo das estratégias gerais:

  • Use cache de global para evitar consultas repetitivas dentro da solução global para dados que não sofram alteração de nível global.
  • Use cache de sessão para evitar consultas repetitivas dentro da mesma sessão para casos no qual dados estes dados não sofram alteração durante a o tempo de duração da sessão.
  • Use cache de thread local para evitar consultas repetitivas dentro da mesma requisição para casos no qual estes dados os sofram alteração durantes as requisições.

A prática do cache, entretanto, não é algo simples ou trivial, demandando tempo e esforço para ser implementado. Eu poderia sugerir implementações prontas como o EhCache, ou serviços de cache disponibilizados pelos frameworks ORM. Veja que a utilização só vale a pena se os dados realmente possuírem um alto índice de acesso. Com esta abordagem, a aplicação consegue reduzir em média até 60% o acesso ao banco de dados.

Ciclo de Vida de Objetos

Controle efetivo da criação de objetos durante a execução do programa.

Problema: Algo que precisamos sempre lembrar durante a programação é que o operador new aloca fisicamente o objeto da memória, gastando espaço no HEAP da aplicação. A primeira questão problemática é que percebo que os programadores usam o new de forma displicente, sem nem ao menos para para pensar em que contexto da aplicação está usando. Tudo é motivo para fazer um new, eu já vi casos em que para reiniciar o estado do objeto, o programador dava um new na referência.

Solução: O programador tem que sair desse comodismo e começar a analisar todos os seus new! Duas perguntas resolvem o problema:

  1. Por que estou alocando esse objeto?
  2. Quantas vezes esse código vai ser executado?

Estas duas perguntas vão consciencializar o programador daquela situação, levando-o no mínimo a tomar uma das duas decisões abaixo:

  • Reutilizar Objetos: ao invés de ficar sempre fazendo new, ele pode aumentar a visibilidade do escopo daquele objeto e assim reusá-lo, restartando seu estado.
  • Reduzir o Escopo: reduzir o escopo dos objetos vai deixá-los disponíveis mais rápido para o coletor de lixo. Se for preciso, use escopos lógicos menores com { }.

Esta solução é uma das mais difíceis a serem implementadas, porque invadem a “cultura” do programador de se autocriticar. Mas quero animá-los dizendo que a batalha da economia de memória e performance se ganha na somatória de detalhes.

Objetos String

Controlar o gasto com os objetos Strings.

Problema: Outra coisa que sempre precisamos lembrar é que os objetos String chamados de “wrappers” são imutáveis, ou seja, uma vez instanciados eles nunca mudam. Qualquer operação com a String gerará uma terceira String. O problema aqui é o uso abusivo, desnecessário e inconsciente das String durante a execução do programa.

Solução: Segue a mesma idéia do tópico 5. O programador deve analisar a questão da necessidade e entender o porquê daquele uso. Duas opções surgem para contornar a situação:

  1. usar final static para as Strings que se encaixam no contexto de estáticas (SQLs, mensagens). Ou seja, somente será gasto um objeto para todas as execuções do programa.
  2. usar StringBuffer/StringBuilder para as String que sofrem alterações constantes ou para situações de manipulação de arquivos.

Configurações de memória da JVM

Problema: Mesmo depois de todas as precauções tomadas, a aplicação ainda pode gastar mais memória do valor default previamente configurado na JVM.

Solução: Neste casos, é preciso fazer um estudo, apurando a média de memória gasta pela aplicação, usando alguma ferramenta de profile e, assim, configurar um adequado número razoável de memoria.

É isso, pessoal. O artigo fica aberto para sugestões e novas idéias.

“De fato, sem fé é impossível agradar a Deus, porquanto é necessário que aquele que se aproxima de Deus creia que ele existe e que se torna galardoador dos que o buscam.” Hebreus 11:6

Layouts Web Grátis

10/07/2014

Normalmente um desenvolvedor Java JEE  gasta seu tempo estudando tecnologias de “server-side”,  não investindo muito ou nada de tempo em tecnologias de camada de visão web como HTML e CSS responsáveis por definir a “carinha” da solução. Minha dica hoje é para estes que como eu se enquadram nesse perfil de profissional. Segue uma listagem de sites que disponibilizam templates grátis:

Free CSS Templete – 544 templates.
– Open Source Web Design –  mais de 2080 templates.
Free CSS

De uma navegada neles, escolha um prontinho para sua próxima aplicação!

“Ide, pois, e aprendei o que significa: Misericórdia quero, e não sacrifícios. Porque eu não vim chamar justos, mas pecadores”. Mateus 9:13

Se divertindo com testes de carga e stress com JMeter

03/07/2014

É exatamente nesse momento que você começa a perceber se aquilo que programou realmente funciona…..

ThreadsThreads3

Threads2

tomcat

“Enganoso é o coração, mais do que todas as coisas, e desesperadamente corrupto; quem o conhecerá? Eu, o SENHOR, esquadrinho o coração, eu provo os pensamentos; e isto para dar a cada um segundo o seu proceder, segundo o fruto das suas ações.” Jeremias 17:9-10

Autenticação e Autorização de Soluções Web

26/06/2014

as-pagina-3Aplicativos web são formados por diversos recursos, como páginas dinâmicas, estáticas, imagens, downloads, uploads, processos, relatórios etc. E na maioria delas existe a necessidade de controlar o acesso dos usuários a estes recursos, restringindo-o somente para aqueles previamente identificados e autenticados. Autenticação representa a forma de como o usuário prova quem realmente ele é e a Autorização é utilizada para verificar se o determinado usuário previamente autenticado possui permissão para usar, manipular ou executar o recurso em questão. E a grande questão aparece no momento decisivo do projeto:

Como implementar autenticação e autorização em aplicativos java ?

O objetivo deste post é levantar a algumas das possibilidades de implementação da autenticação e autorização que podem ser feitas em aplicativos web construídos em java e comentar sobre suas características e particularidades.
Segue abaixo as opção levantadas, seus comentários e alguns links apresentando possibilidades, documentações e tutoriais de possíveis implementações:

1. Servlet Filter

A forma mais básica, caseira e rápida de implementar controle de usuários seria a através da construção e configuração manual de servlet filters. Existentes desde a versão 2.3 da especificação, os filters possibilitam a interceptação, manipulação e redirecionamento do pedido HTTP antes que ele chegue ao seu destino real. Com base em sua funcionalidade, seria muito simples construir um filtro especifico para o determinado contexto da aplicação fazendo o controle de acesso aos recursos da aplicação. E para aqueles que prezam a simplicidade mas com flexibilidade, também podem usar o filter para implementar mecanismos mais elaborados e flexíveis, combinando os filtes com arquivos xml, deixando a implementação completamente softcode. Segue abaixo alguns links apresentando explicações básicas e algumas sugestões de como usar.

2. Phase Listener

Para as aplicações escritas em JavaServer Faces, além da opção de usar servlets filters, estas podem se utilizar de um recurso especifico do JSF chamado da phase listener que é responsável por interceptar e oferecer mecanismos de manipulações referentes as mudanças de eventos ocorridas no ciclo de vida da especificação. Relacionado ao contexto de autenticação e autorização, ela se encaixa perfeitamente para a implementações de controle de usuários, oferendo ao projetista da aplicação mais uma opção arquitetural. Segue abaixo links sobre opções de implementações:

3. Container Managed Security

Define um modelo padrão JEE de regras de como a aplicação web pode definir e gerenciar controle de acesso. Baseado em especificação e implementado por todos containers compatíveis, o JAAS é a solução 100% portável indicada pela especificação para ser usada. Nele, existem diferentes níveis em opções de autenticação que são baseado na definição ROLES que são resumidamente grupos de usuários. O base de dados dos usuários credenciados podem estar em arquivos xml, bancos de dados relacionais, ldaps etc. Segue abaixo alguns links sobre utilização dele:

4. jGuard

Framework proprietário construído em cima do JAAS oferecendo alguns automatismos, facilidades e integrações interessantes com alguns componentes JEE sendo um boa opção a ser considerada. Segue abaixo o link para o site oficial que contém todas as informações:

5. Spring Security

Framework proprietário que oferece uma variedade incrível de opções arquiteturais e features de complemento. Muito poderoso, flexível, fácil e amplamente utilizado pela comunidade Java. Segue abaixo o link para o site oficial que contém todas as informações e o livro de referência:

6. Apache Shiro

Framework proprietário que oferece uma variedade incrível de opções arquiteturais e features de complemento. Segue abaixo o link para o site oficial que contém todas as informações:

Conclusão

Objetivo do post não é apontar a “melhor” ou “ideal” para uma solução, mas sim apresentar algumas das possibilidades das mais simples, as mais sofisticadas ficando assim, a cargo dos projetistas responsáveis julgar e selecionar aquela que lhe melhor encaixe no seu determinado escopo/projeto em especifico.

“Sê forte e corajoso; não temas, nem te espantes, porque o SENHOR, teu Deus, é contigo por onde quer que andares.”  Josué 1:9

Objetos Transacionais em Java

04/04/2014

Se você foi como muitas crianças, passou muitos momentos despreocupados no playground, andando de balanço, passando pelas barras do trepa-trepa, ficando tonto ao girar no carrossel e indo para cima e para baixo numa gangorra. O problema dela é que é impossível aproveita-lá sozinho. Veja que na verdade, para realmente usá-la, sempre necessitará de outra pessoa. Você e um amigo têm que concordar em andar na gangorra. Esse acordo é uma proposição tudo-ou-nada. Ambos têm de andar ou nenhum dos dois irá andar. Se qualquer um de vocês falhar em sentar no seu respectivo lugar em cada ponto do banco, não poderão se divertir – só haverá uma criança sentada em uma das pontas triste e imóvel. Spring in Action

111-mecpEm software, estas operações “tudo-ou-nada” são chamadas Transações que permitem agrupar diversas unidades operacionais numa única unidade de trabalho que ou acontece plenamente em sua totalidade, ou não. Segue um resumo com seus respectivos links apresentando uma série de sugestões referentes às estratégias, das mais simples a mais automatizadas de como desenvolvedores java podem implementar objetos transacionais em suas aplicações.

1. Manual

1.1 JDBC puro, usando diretamente a implementação da Connection do determinado provedor.

O JDBC especificou um método chamado setAutoCommit() para o que programador tenha a liberdade de configurar como será o controle das transações. A ausência da configuração expressa que comportamento é automático com o setAutoCommit(true) fazendo qualquer operação no SGDB, seja aberta e fechada a transação. Com a configuração do setAutoCommit(false), fica na responsabilidade do programador fazer as operação no SGDB e assim finalizar com o commit ou roolback.

1.2 Propagação da implementação do tópico 1.1 através de herança ou agregação.

A opção 1.1 acaba ficando muito trabalhosa, repetitiva e desorganizada quando começa a ser espalhada pela a implementação do sistema, dependendo do tamanho do aplicativo. Com isso, o ideal seria idealizar alguma forma de propagar este código trabalhoso e repetitivo. Reutilização em OOP é feita de duas formas: Herança ou Agregação. Então, a dica seria criar super-classes ou classes agregativas que encapsulem esse determinado código para que possam ser reutilizados nestes pontos do sistema.

1.3 Propagação da implementação do tópico 1.1 usando abordagem atributos estáticos em threads com a classe ThreadLocal.

O cenário de conexão e transação com SGDB é comumente vinculado com a ocorrência de threads do sistema, sendo que na execução do aplicativo irão acontecer processos concorrentes fazendo diversas operações e transações na base de dados (cenário muito comum em aplicativos web JEE) . Uma forma profissional de se resolver o caso é usando a classe ThreadLocal que permite ao programador criar e amarrar atributos estáticos por pilhas de thread, sendo assim a solução ideal para o controle de transações amplamente usado por reconhecidos frameworks de persistência existentes no mercado.

1.4 Implementação com o padrão Proxy [GOF] para controle das transações.

Uma possível abordagem para se lidar com as transações em java é a utilização do padrão Proxy que providencia uma mecânica bastante interessante, onde pode ser desenvolver uma falsa camada polimórfica que intermediará e controlará as transações nas chamadas para as operações transacionais. O conceito é utilizado por muitos frameworks tops da atualidade.

1.5 Implementação de uma camada DAO

Dependendo do tamanho da aplicação, é recomendado que se faça uma camada lógica totalmente separada para a implementação dos códigos relacionados com qualquer operação com o SGDB. Ou seja, qualquer coisa relacionada com conexão, transações e SQL pode ser separada de toda a aplicação promovendo uma índice de reutilização, organização e desacoplamento. É isso que justamente o padrão jee DAO sugere. Nele podemos encontrar todas as diretrizes para se implementar essa camada.

1.6. Utilizando frameworks ORM.

Os frameworks ORM são as últimas novidades da engenharia de software que se propõe a fazer com que uma aplicação programada em OO possa se comunicar como um SGDB de forma OO. E dentro deste contexto, as transações podem ser semi-automatizadas, dependendo de uma série de configurações que podem ser customizadas para cada tipo de aplicativo.

2. Automático

2.1 AOP com AspectJ

Programação orientada a aspectos AOP é o paradigma de programação com o objetivo de complementar a OOP. Com ela podemos facilmente acrescentar a transação como aspectos, construindo “advices” que controlaram as transações em determinados objetos. Vejam um exemplo na java Magazine Edição 60

2.2 Spring Framework

Umas das formas mais utilizadas da atualidade é a utilização do framework spring para o controle das transações de um aplicativo java. Nele podem ser encontrados uma série de recursos em diferentes níveis para se obter recurso de forma declarativa e modular. Segue o link para o tutorial de Gerenciamento de Transações.

2.3 Usando componentes JEE – Enterprise JavaBeans

Outro framework amplamente usado na atualidade é o EJB que também possui um módulo de controle de transações que podem ser agregadas na aplicação. Veja as referências para alguns ótimos livros de EJB.

Neste post não foi apresentando nenhum exemplo ou modelo de implementação justamente pelo fato de existirem inúmeras e diferentes formas de implementar ou de usar qualquer uma das dicas acima citadas, ficando a cargo do responsável pelo software entrar em detalhes implementacionais das opções e selecionar aquela que lhe caiba melhor em suas necessidades. Me coloco à disposição para qualquer tipo de ajuda. Aquele forte abraço e a paz.

“Todavia eu me alegrarei no SENHOR; exultarei no Deus da minha salvação.” Habacuque 3:18.

Mascaras JavaScript

20/01/2014

principal-o28sa-luminaria-iron-man99Se você já teve problemas de em manter a portabilidade de mascaras JavaScript em soluções web que fossem 100% compatíveis com navegadores em dispositivos móveis eis a solução – http://igorescobar.github.io/jQuery-Mask-Plugin/ . É rápido, fácil, flexível e até agora tem funcionado em todos os navegadores.

“Porque Deus amou ao mundo de tal maneira que deu o seu Filho unigênito, para que todo o que nele crê não pereça, mas tenha a vida eterna.” João 3:16

Ajude a decidir o futuro de JEE 8

14/01/2014

49794.JEE-8---Java-Enterprise-Edition-8Estamos começando a planejar a próxima revisão da EE Platform Java (Java EE 8), nós gostaríamos de receber sugestões da comunidade sobre a importância relativa de algumas das características que podemos acrescentar.  Se você puder poupar um pouco do seu tempo, por favor participe desta pesquisa para o JEE 8 com o objetivo de nos ajudar a moldar o futuro do Java EE. Entre e vote no seguintes links:

“Tende em vós o mesmo sentimento que houve também em Cristo Jesus, pois ele, subsistindo em forma de Deus, não julgou como usurpação o ser igual a Deus” Filipenses 2:5-6