Beruflich Dokumente
Kultur Dokumente
Campus Monteiro
Apostila
JOÃO PESSOA
2019
SUMÁRIO
Introdução 3
1.2.1 Definição 3
1.3 Java EE 5
1.3.1 Definição 5
1.3.2 Containers 6
1.3.4 Histórico 6
2.EJB 7
2.6.4.2 Exemplo 14
2.6.5.2 Exemplo 16
1
2.7.2 Exemplo 20
2.8.1 Exemplo 23
Referências 33
2
1. Introdução
Além dessas limitações, podemos incluir também a falta de suporte para desenvolvimento baseado em
componentes distribuídos, de tal forma que permitisse escalar determinados componentes de negócio que
estão mais sobrecarregados.
1.2.1 Definição
Fowler (2007) informa as características das aplicações corporativas: grande quantidade de dados
persistente, muitos usuários acessam esses sistemas concorrentemente, existem muitas interfaces de
usuários diferentes, frequentemente existe integração com outras aplicações corporativas, os mesmos
dados podem ter diferentes significados para diferentes atores, lógica de negócio complexa.
Já o glossário do Gartner define que eles são projetados para integrar sistemas que executam todas as
fases das operações de uma companhia, facilitando a cooperação e coordenação do trabalho através da
empresa. O objetivo é integrar os processos principais (exemplo vendas, contabilidade, finanças, recursos
humanos, estoque e manufatura). Esses sistemas estão expandindo seu escopo para integrar fornecedores,
parceiros de negócio e consumidores.
3
Segundo Devmedia (2012), grandes empresas possuem sistemas corporativos integrando setores,
melhorando a produtividade, otimizando processos e agregando valores nas mais variadas áreas de
atuação. Tais sistemas são desenvolvidos levando em consideração a segurança, a grande quantidade de
acessos simultâneos, a integridade das informações, a estabilidade, entre outros aspectos.
Para Oracle (2017b), aplicações corporativas fornecem a lógica de negócio para uma organização. Elas são
gerenciadas de forma centralizadas e frequentemente interagem com outras aplicações da empresa.
● Folha de pagamento;
● Registros de pacientes;
● Lojas de varejo na internet - e-commerce;
● Rastreamento de remessas;
● Classificação de risco de crédito;
● Seguro;
● Contabilidade;
● Negociação de câmbio e ações;
● Sistemas financeiros - bancos;
● Reservas de viagens ou de quartos de um hotel;
● Processamento de pedidos;
● Aquisições;
● Gerenciamento de energia;
● Gerenciamento de relacionamento com o cliente - CRM;
● Enterprise Resource Planning - ERP;
● Gerenciamento de relacionamento com os fornecedores - SCM;
Eles também fornecem uma lista do que não pode ser enquadrado como aplicações corporativas:
4
● Software de injeção de combustível;
● Processadores de texto;
● Controladores de elevadores;
● Sistemas operacionais;
● Compiladores;
● Jogos;
1.3 Java EE
1.3.1 Definição
É uma plataforma projetada para ajudar os desenvolvedores a construírem aplicações corporativas
(ORACLE, 2017a). Ela reduz a complexidade do desenvolvimento dessas aplicações provendo um modelo
de desenvolvimento, API, e um ambiente de execução que permite aos desenvolvedores se concentrarem
nas funcionalidades.
Segundo Oracle (2017b), Java EE é uma plataforma que fornece aos desenvolvedores um poderoso
conjunto de APIs que ajudam a reduzir o tempo de desenvolvimento, a complexidade das aplicações,
enquanto melhoram o seu desempenho. Ela usa um modelo de programação simplificado, no qual os
desenvolvedores podem simplesmente incluir uma anotação no código fonte que o servidor irá configurar o
componente em tempo de deployment e execução. Java EE usa fortemente o conceito de injeção de
dependência que permite inserir referências para outros componentes e recursos usando anotações. Essa
injeção pode ser usada nos containers EJB, Web e Cliente. A plataforma Java EE usa um modelo de
aplicações multicamadas distribuído, conforme figura abaixo.
Ainda segundo Oracle (2017b), as aplicações Java EE são compostas dos seguintes componentes:
5
● Os componentes de negócio que executam no servidor são os EJB (Enterprise Jav Beans).
1.3.2 Containers
Containers são a interface entre um componente e as funcionalidades ou serviços de baixo nível que
fornece suporte para esses componentes.
Os containers fornecem serviços para os componentes que eles hospedam, como exemplo: segurança,
agendamento de execução (timer), injeção de dependência, interceptadores, gerenciamento de transações,
serviço de localização - JNDI, conectividade remota, gerenciamento de recursos - Pool, gerenciamento de
ciclo de vida, e-mail, mensagens.
1.3.4 Histórico
Oracle (2017b) informa que a última versão é Java EE 8. Suas metas são modernizar a infraestrutura para
Java corporativo nos ambientes de nuvem e microserviços, com ênfase no suporte ao HTML5 e HTTP/2,
realçando a facilidade de desenvolvimento através da injeção de dependências e melhoria na segurança e
confiabilidade.
6
2.EJB
Essa definição é complementada por Oracle (2013), o qual informa que EJB é uma arquitetura para
aplicações corporativas transacionais e baseadas em componentes.
Para Devmedia (2012), EJB é um dos principais componentes da plataforma Java Enterprise Edition (Java
EE) para desenvolvimento de sistemas corporativos. Com ele é possível criar aplicações modulares,
separar suas funcionalidades e as reutilizar de forma simples e objetiva. Ao utilizar EJB é possível construir
aplicações distribuídas, seguras e com um eficaz tratamento de transações. Além disso, o EJB oferece
serviços de persistência de dados, controle de concorrência, envio de mensagens, serviço de agendamento,
chamadas a métodos remotos e a web services.
Segundo Wetherbee (2018) e Oracle (2013), são algumas características chave dos EJB:
7
● Persistência - embora não seja mais coberta pela especificação EJB, entidades JPA são
um complemento essencial aos EJBs. Uma classe de entidade representa um mapeamento
para uma tabela de banco. Cada instância dessa classe é uma linha da tabela;
● EJB 1.0 - release inicial - ofereceu suporte aos bens de sessão, stateless e stateful, e
opcionalmente aos entity beans, que eram objetos de domínio persistentes. A interface
remota apresentava um grande overhead na infraestrutura de comunicação remota e
problemas na semântica de passagem por valor;
● EJB 1.1 - o suporte aos beans de entidade se tornou obrigatório e foi introduzido o
deployment descriptor em XML para substituir o armazenamento de metadados em
arquivos de classe serializados especiais;
● EJB 2.0 - enfrentou o overhead e os problemas na semântica de passagem por valor da
interface remota, introduzindo uma interface local. Somente clientes executando dentro do
mesmo container Java EE poderiam ter acesso a um EJB através da interface local, mas foi
permitido a chamada de métodos com passagem por referência para troca de informações
mais eficientes entre componentes. Foi introduzido um novo tipo de EJB, os
Message-driven beans - MDBs, que poderiam participar de sistemas de mensagem
assíncronas. Também foi incluído a Enterprise JavaBeans Query Language (EJB QL), a
qual permitia ao desenvolvedor realizar consultas em linguagem similar ao SQL. E os Entity
Beans agora podem ter os relacionamentos de persistência gerenciados pelo container
EJB;
● EJB 2.1 - adicionou suporte a Web services, permitindo aos beans de sessão expor suas
interfaces como serviço. Foi criado o serviço de timer, que permite a execução agendada
dos EJBs. Também foram expandidas as funções EJB QL;
● EJB 3.0 - foi a maior evolução do padrão. Componentes EJB se tornam POJOs (plain old
Java objects), ou seja, uma classe comum. Não é mais exigido que uma classe bean EJB
implemente interfaces específicas e as propriedades que fazem de uma classe Java um
EJB podem ser configuradas em anotações ou externamente no arquivo descritor XML
ejb-jar.xml. A parte da especificação que tratava dos beans de entidade foi substituída pela
especificação JPA, simplificando o modelo;
● EJB 3.1 - EJBs locais agora suportam a opção sem interface. O suporte a timer foi
melhorado. E foi introduzido suporte a comunicação assíncrona nos beans de sessão, bem
como foi criado um novo tipo de sessão, o Singleton. Foi criado também um subconjunto
das funcionalidades do container EJB, o EJB Lite, que permite aos componentes EJB serem
executados na mesma JVM como um EJB cliente;
● EJB 3.2 - 2013 - funcionalidades de comunicação assíncrona e as melhorias de timer foram
adicionadas ao subconjunto EJB Lite. Foi melhorado o comportamento transacional do ciclo
de vida dos métodos interceptadores, bem como foram simplificadas as regras que
governam a declaração dos comportamentos local e remoto. Uma opção para desabilitar a
passivação do bean de sessão stateful foi melhorada.
8
● XML e Anotações – os EJBs agora permitem que os metadados sejam definidos tanto dentro dos
arquivos fontes usando anotações java como usando o tradicional deployment descriptor XML.
Caso haja necessidade de desacoplar os metadados do arquivo java, recomenda-se usar a
segunda estratégia, permitindo que a mesma entidade ou classe enterprise bean seja usada em
diferentes contextos, onde a informação específica de contexto será capturada no XML;
● Injeção de dependência – EJB 3 introduziu o uso de injeção de dependência em Java. Com ela, o
container EJB fica responsável por inicializar as propriedades de uma instância de objeto e em
seguida a disponibiliza para o EJB. Essa funcionalidade agora tem sua própria especificação,
JSR-330: Dependency Injection for Java TM e estendida pela through JSR 346: Contexts and
Dependency Injection for Java TM EE 1.1. Casos típicos de uso de injeção de dependência em Java
incluem: injeção do EntityManager em um session bean para interação com a unidade de
persistência e injeção do UserTransaction para demarcação de transações em um session bean;
● Interceptadores: métodos de callback – são métodos que são chamados quando certos eventos
do ciclo de vida ocorrem. Eles podem ser métodos de entidades ou enterprise beans ou de outras
classes. Eles permitem que desenvolvedores participem programaticamente da interação entre os
beans ou entidades e seus containers;
● Implementação POJO – métodos Home não são mais obrigatórios, embora eles ainda sejam
suportados. Para beans de sessão e MDBs, um construtor padrão substitui o método ejbCreate(),
que era exigido nas versões anteriores. Para entidades, a interface Home foi substituída por uma
instância EntityManagerFactory que produz instâncias EntityManager para a unidade de
persistência.
● Uso inteligente de convenções – o comportamento convencionado provê funcionalidades ricas
sem a necessidade de nenhuma codificação ou declaração de metadados. Um exemplo é anotar
uma classe POJO com @Entity realiza o mapeamento de todas as propriedades públicas em
campos persistentes e os nomes da tabela e dos campos são derivados dos nomes da entidade e
de seus campos. Uma consequência de utilizar essa convenção é que a classe não irá descrever
todo o comportamento, exigindo um bom conhecimento do comportamento convencionado que está
sendo aplicado;
O comportamento da passagem por valor dos métodos de interface remota fornecem um modelo projetado
para reduzir o tráfego de rede entre cliente e servidor que são fracamente acoplados.
Na visão do autor, devem ser usados quando se necessita escrever a lógica de negócio, manter o estado da
interação com o cliente, modelar processos de back-end ou tarefas do usuário que realizam uma ou mais
operações do negócio.
9
2.6.1 Interface de Negocio – Local e Remota
A interface de negócio é uma interface Java convencional. Essa interface irá listar todas as definições dos
métodos de negócio que estarão disponíveis para as aplicações clientes (WETHERBEE, 2018).
A anotação @Remote é usada para definir a interface remota, na qual a aplicação cliente está em uma JVM
diferente do componente EJB. JVMs separadas podem está na mesma máquina física ou em separadas.
Se nenhuma anotação é definida na interface, então todos os métodos públicos presentes na classe do
bean de sessão serão a interface local. É possível que a arquitetura da aplicação exija tanto a interface local
quanto a remota.
Por exemplo, uma organização tem uma aplicação para processamento de pedidos desenvolvida usando
beans de sessão que tem métodos para incluir um novo pedido e também para realizar tarefas
administrativas, como incluir os dados dos produtos. Nesse caso, existem duas aplicações clientes
diferentes. Uma aplicação web cliente que executa na mesma JVM e permite adicionar novos pedidos. E
uma outra aplicação cliente desktop que executa na máquina do usuário e é usada para tarefas
administrativas.
Para configurar um método como assíncrono utiliza-se a anotação @Asynchronous. Ele pode ou retornar
Void ou a implementação da interface java.lang.concurrent.Future. Essa interface permite as seguintes
operações:
10
Figura 05 – invocação de beans de sessão
Fonte: RUBINGER, BURKE (2010)
Não manter estado da interação não significa que o bean não possa ter variáveis de instância ou manter
algum tipo de estado interno. É importante pontuar que um cliente de um stateless não pode assumir que a
mesma instância irá atender todas as suas requisições.
Para Oracle (2017b), stateless session beans podem oferecer uma melhor escalabilidade para aplicações
que precisam atender um grande número de clientes quando o estado do bean não tiver dados específicos
de um cliente e ele realizar uma tarefa genérica para todos os clientes. E também esse tipo de bean de
sessão pode implementar um web service, enquanto que o stateful não pode.
11
2.6.3.2 Exemplo de stateless
Pala ilustrar o uso de um stateless session bean segue um exemplo do bean SearchFacadeBean que provê
funcionalidades para pesquisar os vinhos disponíveis em uma loja. Os usuários irão escolher alguns
critérios de pesquisa e irão submeter essa pesquisa ao bean. Na sequência, o bean irá pesquisar no banco
de dados. Para facilitar o entendimento, a lista dos vinhos foi inserida de forma estática.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateless;
@Stateless(name = "SearchFacade")
public class SearchFacadeBean
{
public SearchFacadeBean() {
}
return wineList;
}
@PostConstruct
public void initializeCountryWineList() {
//countryMap is HashMap
12
@PreDestroy
public void destroyWineList() {
countryMap.clear();
}
}
Listagem 1 – Exemplo de um Stateless
Rubinger (2010) informa que embora esse tipo de bean de sessão mantenha estado, ele em si não é
persistente. O estado é perdido quando a sessão é removida, ocorre um time out ou o servidor é reiniciado.
Esse bean permite encapsular alguma lógica de negócio e o estado da interação do cliente e transporta isso
para o servidor. Movendo a lógica para o servidor é possível criar clientes mais simples e deixa o sistema
como um todo mais fácil de gerenciar e manter. O stateful session bean age como um agente para o cliente,
gerenciando processos ou fluxos de tarefas que podem ser compostos por um conjunto de tarefas.
13
Figura 08 - Ciclo de vida convencional do StatefulFonte: RUBINGER, BURKE (2010)
No primeiro estado, não existe, o bean ainda não foi instanciado. Ele não existe na memória do sistema.
Quando o cliente chama o primeiro método na referência do stateful, o ciclo de vida começa. O container
invoca newInstance() na classe e cria uma nova instância. Em seguida, o container injeta qualquer
dependência na instância. Nesse ponto, a instância do bean é atribuída para o cliente. Por fim, são
chamados os métodos de calllback @PostConstruct se existir. O bean atinge o segundo estado,
método-pronto.
A instância do bean deixa o estado anterior para o estado passivado ou de volta para o primeiro.
Dependendo de como o cliente usa o stateful, da carga no container EJB e do algoritmo de passivação
usado, a instância do bean pode ser passivada e ativada muitas vezes durante sua vida ou nenhuma vez. O
cliente pode remover o bean acionando o método com @Remove. A transição para o estado não existe
também pode acontecer quando ocorre um time out.
Durante períodos de inatividade para conservar recursos o container pode passivar a instância preservando
o estado de interação e retirando a instância da memória. Quando o bean está para ser passivado, o
container chama o método de callback @PrePassivate. Containers podem usar o padrão de serialização
Java ou outro mecanismo para armazenar o estado. Alguns fornecedores, por exemplo, armazenam os
campos em um cache. Após a passivação, quando a instância é ativada com sucesso, é chamado o método
de callback @PostActivate.
2.6.4.2 Exemplo
Como exemplo do Stataful temos o bean ShoppingCartBean que irá manter todos os itens e suas
quantidades adicionados pelo usuário ao seu carrinho de compras. Para facilitar o entendimento, nesse
ponto, usaremos uma lista de itens estática.
import java.util.ArrayList;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Remove;
import javax.ejb.Stateful;
@Stateful(name = "ShoppingCart")
public class ShoppingCartBean
{
public ArrayList cartItems;
public ShoppingCartBean() {
14
}
@PostConstruct
public void initialize() {
cartItems = new ArrayList();
}
@PreDestroy
public void exit() {
System.out.println("Saved items list into database");
}
@Remove
public void stopSession() {
// The method body can be empty.
System.out.println("From stopSession method with @Remove annotation");
}
public void setCartItems(ArrayList cartItems) {
this.cartItems = cartItems;
}
15
Figura 09 - modelo conceitual do singleton
Fonte: RUBINGER, BURKE (2010)
O autor alerta ainda que um ponto muito importante, e que diferencia esse tipo de bean de sessão dos dois
anteriores, é a concorrência. Como o estado de uma única instância é compartilhado por diversas
requisições concorrentes, a utilização responsável de estratégias de lock e controle de concorrência são
primordiais.
Para Wetherbee (2018), quando uma aplicação utiliza múltiplos singleton session beans, pode ser
necessário definir a ordem de inicialização pelo container. Isso é feito usando a anotação @DependsOn e
informando o bean que o atual depende. Na seção abaixo de exemplo, mostramos uma amostra desse tipo
de requisito em ação, é o bean LogShopperCount que necessita da inicialização anterior do bean
ShopperCount.
2.6.5.2 Exemplo
Como exemplo foi criado o bean singleton ShopperCount que irá armazenar o número de clientes logados
na loja.
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Singleton;
import javax.ejb.Startup;
16
// Reset counter
public void resetCounter() {
shopperCounter = 0;
}
// Reset counter
@PostConstruct
public void applicationStartup() {
System.out.println("From applicationStartup method.");
resetCounter();
}
@PreDestroy
public void applicationShutdown() {
System.out.println("From applicationShutdown method.");
}
}
Listagem 3 - exemplo de singleton session bean
@Singleton
@Startup
@DependsOn("ShopperCount")
public class LogShopperCount {
private final Logger log = Logger.getLogger("LogShopperCount.class");
public void logShopperCount() {
// Log shopper count
}
}
Listagem 4 - exemplo de um singleton que especifica a ordem de inicialização
17
A arquitetura JMS consiste nos seguintes componentes:
● Provedor JMS - sistema de mensagem que trata do encaminhamento e entrega das mensagens.
Pode ser um componente de mensagem de um servidor de aplicação (JBOSS, Oracle WebLogic,
IBM Websphere, etc);
● Cliente JMS - aplicação Java ou componente Java EE que usa JMS para consumir ou produzir uma
mensagem;
● Consumidor JMS - aplicação cliente JMS que consome mensagens. Na figura abaixo é Inventory,
Billing e Shipping;
● Produtor JMS - Cliente JMS que gera a mensagem. No exemplo da figura abaixo é Order Entry ou
Inventory;
● Mensagem JMS - consiste em cabeçalho, propriedades e corpo. O cabeçalho identifica a
mensagem e contém informações padrão, por exemplo, o momento que foi enviada pelo MOM. As
propriedades definem atributos adicionais que são configurados pela aplicação ou provedor. Elas
podem ser dos tipos: Boolean, byte, double, float, int, long, short, String, Object, etc. Já o corpo
contém o conteúdo da mensagem e pode ser ObjectMessage, ByteMessage, MapMessage,
StreamMessage e TestMessage.
MDBs são consumidores de mensagens assíncronos que processam mensagens entegues usando JMS.
Segundo o autor, aplicações cliente não podem acessar um MDB diretamente assim como fazem com
session beans e entidades. A única maneira de se comunicar com um MDB é enviando uma mensagem
JMS para um destino no qual o MDB está escutando.
Modelos de aplicação de mensagens:
● Modelo Point-to-point (Filas ou Queue) - nesse modelo somente um consumidor irá processar
uma dada mensagem. O destino das mensagens nesse tipo são Filas (Queue), conforme figura 11;
● Modelo Publish-Subscribe (Tópico ou Topic) - no modelo publish-subscribe cada assinante
(subscriber) recebe uma cópia da mensagem, conforme ilustrado na figura 12. Esse é um modelo
de aplicação do tipo broadcast;
18
Figura 11 - modelo com filas
Fonte: WETHERBEE (2018)
Esse tipo de bean deve ser usado quando a aplicação necessitar de comunicação assíncrona e
desacoplada para integração entre sistemas. Assim como o stateless, esse bean não mantém estado e é
altamente escalável.
Wetherbee (2018) descreve uma aplicação que usa MDBs, conforme figura 13. Essa é uma aplicação que
trata de compras feitas em uma loja online. Ela inicia quando acontece uma nova compra que envia o
pedido para o sistema de processamento de pedidos, Order Entry. O pedido é processado e envia uma
mensagem para a fila novo pedido, New Order. Na sequência, o sistema de estoque, Inventory, captura
essa mensagem e verifica se o item está disponível no estoque. Caso não esteja é enviada uma mensagem
para a fila Fornecedores, Suppliers. Mas, se existe em estoque é enviada mensagem para a fila pedido
pronto, Order Ready. Nesse momento, o sistema de faturamento lê a mensagem e realiza seu faturamento
e envia mensagem para a fila remessa, Shipping. Por fim, o sistema de gerenciamento de remessa procede
o envio do pedido.
O MDB é uma classe Java convencional com a anotação a nível de classe @MessageDriven. E diferente
dos beans de sessão, ele não possui interfaces de negócio. Existem alguns requisitos para a classe do
MDB:
● A classe deve implementar a interface listener javax.jms.MessageListener e disponibilizar o
método onMessage;
● Ela não pode ser final ou abstract;
● Deve existir um construtor público sem argumentos;
A anotação @MessageDriven possui parâmetros que podem ser especificados usando a anotação
@ActivationConfigProperty. Com ela podemos definir o nome e tipo do destino (destinationName e
19
destinationType), o modo de confirmação do recebimento da mensagem(acknowledgeMode), critérios de
filtro e durabilidade da assinatura(subscriptionDurability).
2.7.2 Exemplo
Exemplo de um MDB:
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
@MessageDriven(activationConfig =
{ @ActivationConfigProperty(propertyName = "destinationName",
propertyValue = "StatusMessageTopic"),
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Topic")
},
20
mappedName = "StatusMessageTopic")
public class StatusMailerBean implements javax.jms.MessageListener
{
@Resource(name = "mail/wineappMail")
private javax.mail.Session ms;
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
Listagem 5 - exemplo de um bean MDB
21
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnectionFactory;
@Stateless(name = "OrderProcessing")
public class OrderProcessingBean
{
public OrderProcessingBean() {
}
@Resource(mappedName = "StatusMessageTopicConnectionFactory")
private TopicConnectionFactory statusMessageTopicCF;
@Resource(mappedName = "StatusMessageTopic")
private Topic statusTopic;
try {
Connection connection = statusMessageTopicCF.createConnection();
connection.start();
Session topicSession =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
22
return "Created a MapMessage and sent it to StatusTopic";
}
}
Listagem 6 - exemplo de um bean stateless que envia mensagem que será tratada pelo MDB
A persistência provê uma abstração simples sobre JDBC, no qual o código ficará isolado de otimizações e
peculiaridades específicas dos fornecedores de banco de dados. Ele também pode ser descrito como um
motor que realiza o mapeamento objeto-relacional (ORM). Além do mapeamento, esse serviço também
fornece uma linguagem de consultas similar ao SQL que trabalha com objetos em vez de esquemas
relacionais.
EJB provê uma conveniente integração com JPA via Entity Beans. Diferente dos beans de sessão ou MDBs,
os entity beans não são componentes do servidor. Eles são objetos simples cujo estado é sincronizado com
a camada de persistência. As entidades representam tabelas do banco e suas instâncias se referem a
linhas dessa tabela. Sua criação ocorre da forma convencional usando new e não precisam implementar
nenhuma API especial.
Contudo, para o autor, assim como os demais EJBs, os entity beans ganham poderosos serviços quando
usados no contexto de um container. No caso da persistência, as instâncias de entity beans podem se
tornar objetos gerenciados sob o controle do serviço chamado javax.persistence.EntityManager.
O EntityManager gerencia o mapeamento objeto-relacional, provê APIs para criação de consultas e para
localizar objetos, sincronização, inserção de objetos no banco, fornece cache e gerencia a interação entre a
entidade e o serviço de transações - Java Transaction API (JTA).
2.8.1 Exemplo
Exemplo de uma entidade:
import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
23
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Version;
@Entity
@NamedQueries({
@NamedQuery(name = "Address.findAll",
@Table(name = "CH03_ADDRESS")
@TableGenerator(name = "Address_ID_Generator",
table = "CH03_ADDRESS_ID_GEN",
pkColumnName = "PRIMARY_KEY_NAME",
pkColumnValue = "Address.id",
valueColumnName = "NEXT_ID_VALUE")
@Column(length = 4000)
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "Address_ID_Generator")
@Column(length = 4000)
@Version
@Column(name = "ZIP_CODE")
24
public void setCity(String city) { this.city = city; }
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
@PersistenceContext(unitName = "Chapter03PersistenceUnit")
public CustomerOrderManager() {
em.persist(entity);
return entity;
return em.merge(entity);
25
public List<Customer> getCustomerFindAll() {
em.remove(address);
return em
.createNamedQuery("CustomerOrder.findAll", CustomerOrder.class)
.getResultList();
Para Oracle (2013), web services provê um meio padrão de interoperabilidade entre aplicações executando
em uma variedade de plataformas e frameworks.
Existem dois tipos de web services: 1 - Web services baseados em SOAP que, em Java, são especificados
pela Java API for XML Web Services - JAX-WS e 2 - Web services RESTful(Representational State
Transfer) que, em Java, são especificados pela Java API for RESTful Web Services;
Os web services do tipo 1 - JAX-WS - usa a arquitetura abaixo, na qual o consumidor pesquisa a descrição
do serviço publicado em um repositório/registro através do protocolo Universal description, discovery and
integration - UDDI. No repositório obtém a interface descrita usando Web services description Language -
26
WSDL. Com essa descrição, agora o consumidor pode acessar e se comunicar com o provedor usando
Simple object access protocol - SOAP. Tanto WSDL quanto SOAP usam fortemente o XML.
Por outro lado, o web services do tipo 2 - JAX-RS - são um padrão de arquitetura que usa o HTTP para
descoberta, consultas e manipulação de recursos em um ambiente descentralizado e distribuído.
Atualmente, esse tipo tem ganhado popularidade em relação ao anterior em função de sua simplicidade.
Para Wetherbee (2018) usando REST, o cliente acessa um recurso no servidor usando uma URI(Universal
Resource Identifier) e o conjunto de métodos HTTP padrão (GET, POST, PUT e DELETE) para realizar
operações no servidor, conforme quadro abaixo.
GET Recupera/Consulta
POST Cria
PUT Atualiza
DELETE Apaga/Remove
Quadro 1 - mapeamento das operações REST no HTTP
O quadro da figura abaixo mostra uma comparação entre as características dos dois tipos de web services
abordados, segundo Wetherbee (2018):
27
Figura 16 - Comparação web services baseado em REST e em SOAP
● Java Architecture for XML Binding - JAXB - API para representar documentos XML como objetos
Java;
● Java API for XML Registries - JAXR - conjunto de APIs que permitem que aplicações Java acessem
o registro UDDI;
● SOAP with Attachments API for Java - SAAJ - conjunto de APIs que permitem que componentes
Java criem mensagens SOAP com anexos como o modelo de anexos no sistema de e-mail.
Tanto Stateless quanto Singleton Session Beans podem ter seus métodos expostos como web services.
Segue o exemplo de um EJB stateless exposto como web services baseado SOAP. Para fazer isso basta
usar a anotação @WebService.
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
@Stateless(name = "CreditCheckEndpointBean")
public CreditCheckEndpointBean() {
28
@WebMethod(operationName = "CreditCheck")
return true;
Segue um exemplo de um EJB stateless exposto como web services baseado REST. Para fazer isso basta
usar a anotação @Path.
@Path("creditCheck")
@PUT
@Consumes("text/plain")
@Produces("text/plain")
@Path("isValid")
return true;
Segue um exemplo de um EJB stateless cliente de um web service. Para acessar o web service utiliza-se a
anotação @WebServiceRef.
@PersistenceContext(unitName = "Chapter07-WineAppUnit-JTA")
@WebServiceRef(type = CreditService.class)
CreditService service;
29
return creditService.creditCheck(ccnum);
Outro tópico relacionado a serviços bastante estudado atualmente são os microserviços. Wetherbee (2018)
define como uma variante do estilo arquitetural SOA(Service Oriented Architecture). Nesse modelo uma
aplicação é desenvolvida como um conjunto de serviços simples e leves.
A figura abaixo mostra a diferença entre o modelo tradicional de uma aplicação monolítica e a arquitetura de
microserviços.
Nessa seção explicaremos a arquitetura lógica do referido sistema, ilustrado na figura 18 abaixo.
30
Figura 18 - Arquitetura lógica do sistema da loja de vinhos
O sistema da loja de vinhos apresenta uma arquitetura lógica em camadas. Existe uma camada web
desenvolvida usando a tecnologia JSF. Ela acessa os serviços disponibilizados pela camada de negócio.
Nessa camada, Existem diversos EJBs (stateless, stateful, MDB), inclusive um deles expõe sua interface
como serviço. Esses EJBs cooperam se comunicando tanto da forma síncrona quanto assíncrona
disponibilizando pesquisa e criação de clientes, pesquisas de vinhos por diversos critérios, processamento
de pedidos de compras, atualização e controle do estoque, verificação do cartão de crédito e notificação do
status das compras aos clientes.
Os clientes acessam a interface web ou app mobile para pesquisar os vinhos. Para essa pesquisa, eles
utilizam o EJB stateless PesquisaFachadaBean. Selecionam os itens de interesse e adicionam ao seu
carrinho de compras, usando o EJB stateful CarrinhoComprasBean. Para seguir, será necessário
cadastrar o usuário através do EJB stateless ConsumidorFachadaBean, caso ainda não seja registrado, e
realizar login. Quando concluída compra, o cliente fornece o cartão de crédito que será validado utilizando o
serviço CreditoService, e então irá finalizar o pedido. Nesse ponto, será enviada mensagem para um tópico
JMS CompraPedidoTopico. Na sequência, essa mensagem é consumida pelo EJB MDB
ProcessaPedidoMDBBean, que verifica e atualiza o estoque através do EJB stateless EstoqueBean. Esse
MDB, em seguida, envia uma mensagem para o tópico JMS MessagemStatusTocios. Por fim, o MDB
StatusNotificaMDBBean consome essa mensagem e envia uma notificação através do e-mail informando
o status do pedido para o cliente.
31
A figura abaixo mostra o interesse pelo termo Jakarta EE de acordo com Google Trends. O interesse por
esse tema tem crescido desde janeiro de 2018 até hoje. Isso demonstra a expectativa da comunidade pela
mudança.
De acordo com pesquisa realizada em março/2019 pela equipe do Jakarta EE (2019), as áreas de maior
interesse pela comunidade Java são:
Outra expectativa também é pelo lançamento de uma API voltada para tratar bancos noSQL que deverá ter
o nome JNoSQL (SANTANA, 2018) .
Uma outra resposta interessante da pesquisa mostrou as áreas da indústria que utilizam Java. Veja o
resultado na figura abaixo.
32
Referências
JOHNSON, R.; HOELLER J. J2EE Development without EJB. Indianapolis: Wiley Publishing, 2004.
RUBINGER A. L.; BURKE B. Enterprise JavaBeans 3.1. Sixth Edition. Sebastopol: O’Reilly Media, 2010.
ORACLE. JSR 345: Enterprise JavaBeans,Version 3.2, EJB Core Contracts and Requirements. Redwood
City: Oracle, 2013.
WETHERBEE, J. et al. Beginning EJB in Java EE 8 Building Applications With Enterprise Javabeans.
3rd ed. New York: Apress, 2018.
ORACLE. Java Platform, Enterprise Edition (Java EE) 8 - Your First Cup: An Introduction to the Java EE
Platform, 2017. Disponível em: https://javaee.github.io/firstcup/toc.html. Acesso em: 31 jul. 2019.
ORACLE. Java Platform, Enterprise Edition (Java EE) 8 - The Java EE Tutorial, 2017. Disponível em:
https://javaee.github.io/tutorial/toc.html. Acesso em: 31 jul. 2019.
SANTANA, O. Java EE, passado, presente e futuro com Jakarta EE e NoSQL. InfoQ, 2018. Disponível
em: https://www.infoq.com/br/news/2018/11/javaee-passado-presente-futuro/. Acesso em: 31 jul. 2019.
WATTS, S. Enterprise Application Software Defined: How Is It Different from Other Software?, 2017.
Disponível em:
https://www.bmc.com/blogs/enterprise-application-software-defined-how-is-it-different-from-other-software/.
Acesso em: 02 ago. 2019.
JAKARTA EE. 2019 Jakarta EE Developer Survey Report. Eclipse Foundation, 2019. Disponível em:
https://jakarta.ee/documents/insights/2019-jakarta-ee-developer-survey.pdf. Acesso em: 11 ago. 2019.
33