SlideShare una empresa de Scribd logo
1 de 67
Descargar para leer sin conexión
Enterprise JavaBeans 3.0
Helder da Rocha
+
Session Beans
Message-Driven Beans
Transações
Interceptadores
Web Services
10/10/2009
Introdução prática a
Programa
•  Enterprise JavaBeans
–  Stateless Session Beans
–  Stateful Session Beans
–  Message-Driven beans
•  Transações
•  Interceptadores
•  Session Bean com WebServices
Objetivos deste minicurso
•  O objetivo deste minicurso é proporcionar uma
introdução prática a EJB 3.0, incluindo interceptadores
e Web Services, e discutir em detalhes a demarcação
de transações, com demonstrações.
•  Tópicos abordados
–  Objetivos da especificação EJB3, comparando com EJB 2
–  Descrever a arquitetura de session beans e MDBs
–  Demonstrar a criação e uso de beans
–  Mostrar como demarcar transações em EJB3
–  Mostrar como criar um interceptador
–  Mostrar como criar um WebService com um session bean
Tópicos não abordados
•  Devido ao foco deste minicurso e limitações de tempo,
os tópicos abaixo serão vistos apenas superficialmente
ou não serão abordados
–  JMS (é pré-requisito)
–  Timer service
–  Várias anotações de callback (veremos apenas as essenciais)
–  Configurações XML no ejb-jar.xml
–  Entidades persistentes
–  Injeção de dependências (talvez não seja possível demonstrar
no JBoss, mas tentaremos com o Glassfish)
•  Veja o material suplementar para baixar (e referências
no final) para maiores detalhes sobre esses tópicos
O que é um Enterprise Bean
•  Componente lado-servidor para encapsular a
lógica de negócios de uma aplicação
•  Objeto que implementa a lógica que realiza o
objetivo de uma aplicação ou serviço, e que é
gerenciado por um container
–  Pode ter serviços (ex: demarcação de transações,
segurança) injetados transparentemente
–  Permite que o desenvolvedor concentre-se na lógica
de negócio para um objeto comum sem se preocupar
com infraestrutura e serviços
–  Pode ser usado localmente ou remotamente
Por que Enterprise Beans?
•  Por que não usar objetos comuns?
–  Enterprise beans, na versão 3.0, são objetos comuns
–  Injeção de dependências é indicada via anotações
•  Então, quando se dar ao trabalho de criar uma
aplicação baseada em enterprise beans?
–  Quando ela precisar configurar serviços como
segurança e transações
–  Quando ela precisar ser escalável ou distribuída
–  Quando ela tiver muitos clientes
O que significa “enterprise”?
•  Antes era quase sinônimo de “distributed”
•  Tecnologias distribuídas
–  JDBC, RMI, JTA, JNDI, JMS, JSP, etc.
•  O termo refere-se a aplicações complexas, que
requerem grande investimento em arquitetura
–  serviços como segurança, distribuição, etc.
–  facilidade de manutenção, escalabilidade
–  robustez e integridade de dados compartilhados
•  Esses serviços requerem conhecimentos e recursos que
vão além da lógica de negócios da aplicação
Servidores de aplicação
•  Servidores que oferecem ambientes controlados para
execução de componentes
–  Arquitetura container-componente com serviços de
middleware implícito
•  Serviços típicos
–  transações
–  autenticação e autorização
–  gerenciamento de recursos (ciclo de vida)
–  agendamento
–  persistência transparente
–  sistema de nomes e diretórios
–  Injeção de dependências
Containers e componentes
•  Containers são como sistemas operacionais e
componentes são como aplicações
–  Containers controlam a execução de seus
componentes, e permitem ser configurados
–  A configuração define como o componente será
executado
•  A comunicação container-componente ocorre
através de chamadas (métodos de callback)
•  Servidores de aplicação fornecem containers
–  Componentes que aderem ao contrato podem rodar
nesses containers
Containers e componentes
•  Containers controlam o ciclo de vida de seus
componentes
•  A instalação de um componente em um
container chama-se deployment (implantação)
•  Containers permitem a configuração de
serviços para um ou mais componentes
•  Servidores Java EE fornecem três tipos de
containers
–  Container Web
–  Container para enterprise beans
–  Container cliente
Tipos de enteprise beans
•  Session Beans
–  Modelam processos de negócio. São ações, verbos.
–  Fazem coisas: acessam um banco, fazem contas,
–  Podem manter ou não estado não-persistente
–  Processar informação, comprar produto, validar cartão
•  Message-driven beans
–  Modelam processos assíncronos. Respondem a
eventos.
–  Agem somente quando recebem uma mensagem
–  Não mantêm estado
Tipos de enterprise beans
•  E os Entity Beans?
–  São “persistent entities” na especificação EJB 3.0
–  São tratados em especificação à parte pois são um
serviço independente (não são mais considerados
“enterprise beans” na nova especificação)
•  Persistent entities
–  Modelam dados de negócio. São coisas, substantivos.
–  Representam informações em bancos de dados
–  Mantêm estado persistente
–  Um produto, um empregado, um pedido
–  São mapeados a tabelas usando ORM
Uso típico de componentes Java EE 5
En#ty	
  	
   En#ty	
  	
  En#ty	
  	
  
Session	
  Bean	
  Message-­‐driven	
  Bean	
  
En#ty	
  	
  
Session	
  Bean	
  
Servlet	
  
Taglib	
  
Cliente	
  	
  
Swing	
  
Cliente	
  	
  
C++	
  
Cliente	
  JMS	
  
JSP	
  
MOM	
  
BD	
  
Cliente	
  	
  
HTML	
  
Cliente	
  	
  
WebService	
  
Como usar um enterprise bean
•  Um enterprise bean precisa ser
1.  Codificado em Java como um POJO
2.  Receber anotações com meta-informação (ou ter
um deployment descriptor em XML)
3.  Compilado
4.  Empacotado em um arquivo JAR
5.  Implantado em um servidor de aplicações
•  Para executar os serviços de um bean, é preciso
escrever um cliente
1.  Localizar o bean ou um destino associado a ele
2.  Enviar mensagens e receber resposta (se houver)
Onde implantar
•  Para implantar um enterprise bean é preciso
ter um servidor compatível
–  JBoss 4.0.4 ou superior
–  Glassfish Sun AS 9.1 ou superior
–  etc.
•  Pode ser necessário lidar com detalhes
proprietários de cada servidor
–  Forma como o cliente localiza o bean
–  Forma como o componente é implantado
–  Necessidade de arquivos extras
EJB 2.1 vs. EJB 3.0
•  Objetivo principal do EJB 3.0:
–  Facilidade de desenvolvimento.
•  É uma simplificação das versões anteriores.
•  É compatível
–  Componentes EJB 2.1 podem ser usados em conjunto
com componentes EJB 3.0
–  EJB 3.0 é muito, muito mais simples que EJB 2.1
“O objetivo do EJB 3.0 é melhorar a arquitetura EJB ao
reduzir sua complexidade do ponto de vista do
desenvolvedor” (especificação EJB 3.0)
Objetivos (especificação)
•  Definição de anotações de metadados
–  menos classes e arquivos para implementar
–  não precisa mais do deployment descriptor
•  Especificação de defaults
–  Declara-se apenas as anotações necessárias
•  Encapsulamento de dependências de ambiente
–  JNDI e DI via uso de anotações
•  Simplificação dos tipos de enterprise beans
•  Simplificação de persistência via Java Persistence API
–  Mais simples, porém com mais recursos
•  Interceptadores para session e message-driven beans
Em suma, EJB 3 simplifica EJB 2
•  Beans não precisam mais
–  ter interfaces Home nem de Componente
–  implementar métodos de callback (ejbXXX)
chamados pelo container
–  implementar interface EnterpriseBean
•  É mais fácil achar os beans
•  Metadados em forma de anotações podem ser
usados dispensando deployment descriptors
–  Que continuam existindo, mas são opcionais
•  ORM (JPA) no lugar de entity beans!
Menos arquivos
•  Com a API 3.0, o desenvolvedor usa a classe do
bean como principal artefato de programação.
–  Programador cria classe e acrescenta anotações.
–  Anotações contém metadados. Servem para informar
o tipo do bean, incluir servicos, etc.
•  Divisão de responsabilidades do Java EE
continuam valendo
–  Configurador do sistema não mexe no código: cria ou
usa deployment descriptor ejb-jar.xml e sobrepõe
configurações default do programador do bean
Session Beans
•  São objetos de processo de negócio
–  Implementam lógica de negócio, algoritmos, workflow
–  Representam ações
•  Sessão
–  Tempo que o browser está aberto
–  Tempo que um outro bean usa o session bean
–  Tempo que uma aplicação remota está aberta
•  Objetos transientes
–  Não tem seu estado armazenado em meio persistente
Tipos de Session Beans
•  Clientes travam um diálogo com um bean
(interação entre um cliente e um bean)
–  Uma ou mais chamadas entre cliente e bean
–  Dura um processo de negócios para o cliente
•  Os dois tipos de session beans modelam tipos
diferentes de diálogos
–  Stateful Session Beans modelam diálogos consistem
de várias requisições onde certas requisições podem
depender do estado de requisições anteriores
–  Stateless Session Beans modelam diálogos que
consistem de apenas uma requisição
Stateless Session Beans
•  Como não mantém estado do diálogo, todas as instâncias
da mesma classe são equivalentes e indistiguíveis
–  Não importa quem chamou o bean no passado
–  Qualquer instância disponível de um session bean pode servir a
qualquer cliente
•  Session Beans podem ser guardados em pool, reutilizados
e passados de um cliente para outro em cada chamada
Fonte: [1]
EJBObject
Cliente
Bean
Bean
Bean
Bean
Pool de beans
idênticos
Ciclo de vida: Stateless Session Bean
Fonte: [1]
Bean não
existe
Pool de
beans
equivalentes
1. Objeto criado
2. @PostConstruct @PreDestroy
metodo()
Qualquer cliente pode
chamar um método de
negócio em qualquer
EJBObject
Container cria um novo
bean quando ele acha que
precisa de mais beans no
pool para servir à demanda
dos clientes
Quando o container
decidir que não precisa
mais de tantas
instâncias, chama
método marcado com
@PreDestroy e remove
a instância
Stateless local bean
@Stateless
public class CalculatorBean implements Calculator {
public float add (int a, int b) {
return a + b;
}
public float subtract (int a, int b) {
return a - b;
}
}
@Local
public interface Calculator {
public float add (int a, int b);
public float subtract (int a, int b);
}
•  Anotação mínima: @Stateless
•  Comportamentos de transações, ciclo de vida, etc. são
default se não houver anotações específicas
Exemplo de cliente local
•  Outros objetos dentro do servidor de aplicações podem
referir-se ao serviço do EJB através de JNDI ou injeção de
recursos/dependências*
–  Nome da classe do bean (tipo) é usado em JNDI e DI
–  Chamada de métodos é igual ao uso normal de Java standalone
–  Objetos retornados são referências, sejam ou não gerenciados
@ManagedBean!
public class CalculatorWebBean {!
@EJB(beanName="CalculatorBean")!
private Calculator calc;!
private float p1, p2, result;!
!
public String calculate() {!
result = calc.add(p1, p2);!
return null; !
}!
…!
}!
…
public CalculatorWebBean () {
Context jndi = 

new InitialContext();

calc = (Calculator) 

jndi.lookup(“Calculator”);
}
…
Inicialização usando JNDI em construtor
(em vez de usar de @EJB)
* Isto pode não funcionar no JBoss (requer configuração adicional)
Stateless remote (IIOP) bean
•  Permite acesso remoto (clientes de outras JVMs)
•  Exporta OMG IDL (independente de linguagem)
•  Como criar
–  Fornecer interface anotada com @Remote
@Stateless
public class CalculatorBean implements Calculator {
public float add (int a, int b) {
return a + b;
}
public float subtract (int a, int b) {
return a - b;
}
} @Remote
public interface Calculator {
public float add (int a, int b);
public float subtract (int a, int b);
}
Clientes remotos (RMI/IIOP)
•  Precisam obter autorização e baixar proxy de rede
(stub) para realizar a comunicação
–  Cliente Java standalone pode obter via JNDI (pode ser preciso
configurar autorização de acesso externo para o serviço EJB)
–  Cliente executando em container Java EE pode obter stub
através de injeção de dependências @EJB
–  Clientes IIOP podem usar o IDL do serviço e ferramentas para
gerar componentes em outras linguagens
•  Uma vez obtido o proxy, métodos remotos podem ser
chamados normalmente como se fossem locais
–  Valores retornados podem ser value objects (serializados) ou
proxies para objetos remotos: há diferença se comparado ao
acesso local
Exemplo de cliente SB remoto
•  Se não estiver em container, precisa ter acesso a
remoto a componente cliente JNDI
–  Requer configuração (veja configuração JNDI para clientes JMS)
–  Objetos retornados em métodos são value objects (serializados)
a menos que sejam também proxies para objetos remotos (SB)
public class CalculatorClient {
public static void main(String[] args) throws Exception {
Context jndi = new InitialContext(); // conf. via jndi.properties
String nome = “java:/global/mathbeans/Calculator”;
Calculator calc = (Calculator) jndi.lookup(nome);
BigDecimal result = calc.add(3, 4);
}
}
Proxy (referência)
Value object
Stateful Session Beans
•  Quando um cliente chama um método que mantém seu
estado, ele está iniciando um diálogo
–  O estado deve ser mantido para a próxima requisição
–  Container não pode fazer o mesmo tipo de pooling que faz com
stateless session beans
•  Passivação e ativação
–  Dados do bean são armazenados em meio persistente durante
a passivação e recuperados na ativação
–  Permite manter poucas instâncias no ar e vários clientes
–  Estratégia comum: LRU - Least Recently Used - se container
precisar de recursos, beans menos usados serão passivados.
•  Objetos são serializados, logo, fazem parte do estado
do diálogo apenas objetos e variáveis não transientes
Ativação e Passivação
•  Se há mais clientes que beans no pool, mas grande
parte permanece inativa por certos períodos, container
gerencia recursos usando ativação e passivação
•  Exemplo: Pool de 5 beans chamado por sexto cliente
1.  Estado do bean que foi usado há mais tempo é gravado. Antes
disso, seu método @PrePassivate é chamado
2.  Se cliente está continuando diálogo iniciado anteriormente,
o estado anterior do bean é recuperado e usado para
preencher o bean. Depois, @PostActivate é chamado.
Ciclo de vida: Stateful Session Bean
Fonte: [1]
Bean não
existe
Inativo
1. Objeto criado
2. @PostConstruct @PreDestroy
metodo()
Cliente chama método de
negócio no EJBObject
Cliente cria bean
Cliente chamou método em um bean
inativo. Container precisa ativar o
bean novamente
Limite de beans
ativos foi atingido
Cliente chama @PreDestroy ou
sessão expirou
Ativo
@PrePassivate
@PostActivate
Sessão expirada
Message Driven Beans (MDB)
•  Objeto gerenciado (Enterprise JavaBean)
–  Anotado com @MessageDriven
–  Pode injetar @Resource MessageDrivenContext
–  Permite configuração declarativa de serviços Java EE
•  Implementa consumidor JMS assíncrono (listener)
–  Implementa interface MessageListener (método onMessage)
–  Permite a configuração de seletores JMS, filas, tópicos, etc.
32
@MessageDriven(activationConfig={!
@ActivationConfigProperty(propertyName="destinationType",!
propertyValue="javax.jms.Queue"),!
@ActivationConfigProperty(propertyName="destination", !
propertyValue="queue/ProdutoQueue")!
})!
public class ProdutoMDB implements MessageListener {!
@Resource!
private MessageDrivenContext mdc;!
public void onMessage(Message message) { … }!
}!
Produtores JMS para MDB
•  MDB é consumidor assíncrono de mensagens
•  Produtores: clientes que enviam mensagens a um destino
–  Produtores externos e clientes standalone
–  Outros EJBs e componentes dentro do servidor de aplicações
•  Produtores podem injetar filas e conexões
@Stateless!
public class ClienteEJB {!
public void metodo() throws Exception {!
@Resource(mappedName="java:/JmsXA”) !
ConnectionFactory connectionFactory;!
Connection con = factory.createConnection();!
Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);!
@Resource(mappedName="topic/testTopic”) !
Topic topic;!
Producer publisher = session.createProducer(topic);!
TextMessage msg = session.createTextMessage();!
msg.setText("Teste");!
publisher.send(msg);!
}!
}!
Transações
•  São unidades atômicas de procedimento
–  Sistema de transações garante que o procedimento
termina com sucesso ou é completamente desfeita
•  Serviço essencial da arquitetura EJB
•  Simplifica a programação de aplicações
–  Programador não se preocupa com recuperação de
falhas em programação para sistemas multiusuário
•  Programador EJB pode escolher entre duas
formas de demarcação de transações:
–  explícita, ou programática (Bean-Managed – BMT)
–  implícita, ou declarativa (Container-Managed - CMT)
Commit e Rollback
•  Uma transação engloba uma unidade de trabalho
1.  Durante o processo sub-operações são realizadas e
resultados temporários são obtidos.
2.  No final, a transação é cometida (isto é o commit): o
resultado final torna-se durável se cada sub-operação
funcionar com sucesso
3.  Caso uma sub-operação falhe, é iniciado processo de
reversão das alterações temporárias realizadas (isto é o
rollback): os dados envolvidos voltam aos estados que
tinham antes do início da transação
Estado Inicial
Transação
ocorrendo
Estado Final
Transação desfeita (rolled-back)
Transação cometidaFalha!
Sucesso!
Modelos transacionais
•  Flat transacions
–  Resultado "tudo ou nada": Se qualquer operação da seqüência
falhar, operação inteira é abortada
•  Nested transactions
–  Sub-transações são executadas separadamente e podem ser
corrigidas e repetidas sem afetar o resultado final
•  Chained transactions
–  Transações executam em etapas reversíveis (na falha, volta-se
a um ponto previamente definido)
Correção
Transação Principal
Subtrans 1 Subtrans 2Subtrans 1.1 Subtrans 2.1
Transação
Subtrans 1 Subtrans 2
Subtrans 1.1 Subtrans 2.1
T3T2
Nested Transactions
•  Transações novas podem ocorrer no contexto de
transações existentes
–  Se uma sub-transação falhar, ela pode tentar se recuperar e
impedir que a transação principal falhe
–  Se ela não conseguir se recuperar, e causar o rollback da
transação principal, todas as transações e sub-transações
iniciadas no contexto da transação principal são desfeitas
T1
Sucesso Falha
Dados
temporariamente
alterados
Alterações
revertidas
Dados
temporariamente
alterados
A=5 C=10
A=0
B=0
C=0
B=3
C=0
A=0
B=0
C=0
B=0
A=0
Estado
inicial
Estado
final
Sucesso
Flat Transactions
•  Neste modelo, operações ocorrem na mesma dimensão.
Se alguma falhar, todo o processo falha e é revertido
–  Operações chamadas são incluídas na transãção
–  As alterações só são cometidas depois que todas as operações
foram realizadas com sucesso
T1
Sucesso
Dados
temporariamente
alterados
Alterações
revertidas
Dados
temporariamente
alterados
A=5
B=0
A=0B=10
A=0
B=0
A=0
B=0
T1
Sucesso
Dados
temporariamente alterados Alterações cometidas
Dados
temporariamente alterados
A=5
B=10
A=5B=10
A=5
B=10
A=0
B=0
Estado inicial
Novo
estado final
Sucesso
Falha
Estado final
igual ao
inicial
Suporte de transações em EJB
•  A especificação EJB não exige que o container suporte
transações no contexto de outras transações
–  Não garante suporte a transações aninhadas
•  Logo, apenas "flat transactions" são suportadas
–  Servidor pode suportar outros modelos, mas a portabilidade
não é garantida
•  O comportamento de uma operação durante uma
transação pode ser controlada pelo programador
–  Se operação continua transação anterior
–  Se operação interrompe transação anterior
–  Se operação inicia uma nova transação (não mantém contexto
da transação anterior, já que não aninha)
T3T2 Sucesso FalhaB=3
Conseqüências de Flat Transactions
•  Se método é chamado dentro de uma transação, ele
pode continuar transação anterior (no mesmo nível)
–  Se ele falhar, transação inteira é revertida
•  Se nova transação for iniciada no método que já faz
parte de uma transação, ela é independente
–  Se falhar, pode sinalizar rollback() para desfazer transação
externa (ou não, e permitir que transação externa continue)
–  O possível rollback da transação externa não afetará outras
transações (T2) cujos resultados já foram cometidos
T1
Alterações
cometidas
Dados
temporariamente
alterados
Alterações
revertidas
Dados
temporariamente
alterados
A=5 C=0A=5 C=10
A=5
B=0
C=0
A=0
B=0
C=0
Estado
inicial
Estado
final
Nova Transação rollback()
T1T1Suspensa SuspensaSucesso
B=0
Demarcação de transações
•  O controle de transações em EJB resume-se a
demarcação de transações
–  Consiste apenas do controle de quando ela será iniciada e
quando será concluída (ou desfeita)
–  Não são controlados aspectos de baixo-nível (não há interação
entre cliente e gerenciadores de recursos ou de transações)
•  Há várias formas de demarcar transações
–  Podem ser demarcadas no cliente (comuns, servlets, beans,
etc.) e propagadas para os componentes
–  Podem ser demarcadas no servidor, de duas formas: no
container (implícita), usando declarações no DD, ou no bean
(explícita), usando APIs como JTA, JDBC ou JMS
Demarcação de transações
•  Depende de quem chama o serviço
Cliente
EJB Object
(interceptador)
Serviço de
Transações
Enterprise
Bean
1. begin()
5. commit()
ou rollback()
2. 3.
4.
DEMARCADA PELO CLIENTECliente
EJB Object
(interceptador)
Serviço de
Transações
Enterprise
Bean
2. begin()
5. commit()
ou rollback()
1.
3.
4.
DEMARCADA NO CONTAINER
EJB Object
(interceptador)
Serviço de
Transações
Enterprise
Bean
1.
4.
2.
3. begin()
5. commit()
ou rollback()
DEMARCADA NO BEAN
Cliente
Demarcação explícita de transações
•  Consiste em utilizar alguma API de controle de transações
diretamente no código (BMT)
–  Uso de métodos begin(), commit(), rollback(), etc. marcando
início e fim de unidades atômicas de código
•  Para usar, é preciso informar esta opção (transacion
management type) ao container (CONTAINER é default)
@Stateless !
@TransactionManagement(TransactionManagementType.BEAN)!
public class Fachada { ... }!
•  No código, use JTA, JDBC ou JMS
–  Métodos de Connection (java.sql)
–  Métodos de Session (javax.jms)
–  Métodos de UserTransaction (javax.transaction)
Transações explícitas com JDBC
(...)
public void ship (String productId,
String orderId,
int quantity) {
try {
con.setAutoCommit(false); // con é java.sql.Connection
updateOrderItem(productId, orderId);
updateInventory(productId, quantity);
con.commit();
} catch (Exception e) {
try {
con.rollback();
throw new EJBException("Transaction failed: "
+ e.getMessage());
} catch (SQLException sqx) {
throw new EJBException("Rollback failed: "
+ sqx.getMessage());
}
}
}
Fonte: tutorial Java EE - WarehouseBean.java
UserTransaction
•  É a única classe do JTA que todos os containers
JavaEE/EJB precisam implementar
•  Seus métodos são usados para demarcar transações
–  begin(): marca o início
–  commit(): marca o término
–  rollback(): condena a transação
–  setRollbackOnly(): marca a transação para rollback
–  setTransactionTimeout(int segundos): define o tempo de
vida de uma transação
–  getStatus(): retorna o status de uma transação. O status é
um objeto da classe javax.transaction.Status e pode ter
os valores STATUS_ACTIVE, STATUS_COMMITTED,
STATUS_ROLLEDBACK, etc.
Transações explícitas com JTA
(...)
public void withdrawCash(double amount) {
UserTransaction ut = sessionCtx.getUserTransaction();
try {
double mbState = machineBalance;
ut.begin();
updateChecking(amount);
machineBalance -= amount;
insertMachine(machineBalance);
ut.commit();
} catch (Exception ex) {
try {
ut.rollback();
machineBalance = mbState;
} catch (SystemException syex) {
throw new EJBException
("Rollback failed: " + syex.getMessage());
}
throw new EJBException
("Transaction failed: " + ex.getMessage());
}
}
Fonte: Tutorial Java EE - TellerBean.java
EJBContext do bean
(SessionContext ou
MessageDrivenContext –
deve ser injetado)Estado de
variável de
instância
NÃO será
revertido em
caso de
rollback()
Transações iniciadas no cliente
•  O cliente pode iniciar transações JDBC e JMS
–  Cliente pode ser standalone, servlet, bean, etc.
•  Se desejar utilizar o serviço OTS via JTA, é
necessário obter uma instância da classe
UserTransaction através de JNDI
–  O container deve disponibilizar o JTA na localidade
java:comp/UserTransaction
Context ctx = new InitialContext();
ut = (javax.transaction.UserTransaction)
ctx.lookup("java:comp/UserTransaction");
ut.begin();
// realizar operações
ut.commit();
Session Beans com BMT
•  O container suspende qualquer transação iniciada
pelo cliente ao executar método de um Session
Bean que inicie transação BMT
•  Stateless Session Bean
–  Transação deve terminar antes do método terminar
•  Stateful Session Beans,
–  Transação pode ser iniciada em um método e terminada
em outro: será suspensa no fim da primeira chamada e
reiniciada na segunda
–  Este não é um procedimento recomendado)
•  Para saber o estado de transação existente
–  UserTransaction.getStatus()
Transações em Message-driven beans
•  Um cliente não chama um MDB diretamente
–  MDBs lêem mensagens de um destino JMS
–  Não há, portanto, propagação de transações de um
cliente para um MDB
•  MDBs podem iniciar novas transações
–  O escopo da transação deve iniciar e terminar dentro
do método onMessage()
•  Sempre que possível, use CMT com MDBs
–  CMT: entrega da mensagem é parte da transação: se
houver rollback, container pode reenviar a mensagem
–  BMT: é preciso provocar EJBException para evitar o
acknowledgement e forçar o reenvio
Propagação de transações
•  Transações terminam no mesmo lugar onde começaram
•  Pode-se melhorar a performance de operações que fazem
muitas chamadas colocando-as em contexto transacional
–  O contexto da transação será propagado para todos os métodos
chamados (se não iniciarem nova transação)
–  Se métodos chamados iniciarem nova transação, a transação
principal será suspensa até que o método termine
Cliente
Session
EJB
Session
Bean
Entity
Local
Entity
Entity
Local
Entity
Session
EJB
Session
Bean
Entity
Local
Entity
Transação suspensa (será
reiniciada quando método
retornar)
Transação
iniciada
no container
Controle implícito (declarativo)
•  Container-Managed Transactions (CMT)
–  Controle de transações totalmente gerenciado pelo container
–  Não permite o uso de métodos commit() e rollback() de
java.sql.Connection ou javax.jms.Session dentro do código
•  Na declaração espeficique o uso de CMT
@Stateless!
@TransactionManagement(!
TransactionManagementType.CONTAINER!
) !
public class Fachada {…}!
•  Depois, pode-se definir a política de propagação de
transações para toda a classe e cada método
Atributos (políticas de propagação)
•  O elemento @TransactionAttribute define a política
transacional do componente ou método
–  Define como ele irá reagir quando o seu método for chamado
por um cliente dentro ou fora do contexto de uma transação
•  Os valores suportados para este elemento (depende do
tipo de bean) são
–  TransactionAttributeType.NOT_SUPPORTED!
–  TransactionAttributeType.SUPPORTS!
–  TransactionAttributeType.REQUIRED!
–  TransactionAttributeType.REQUIRES_NEW!
–  TransactionAttributeType.MANDATORY!
–  TransactionAttributeType.NEVER!
REQUIRED
•  Indica que o método tem que ser chamado dentro do
escopo de uma transação
–  Se não existe transação, uma nova é criada e dura até que o
método termine (é propagada para todos os métodos chamados)
–  Se já existe uma transação iniciada pelo cliente, o bean é
incluído no seu escopo durante a chamada do método
Cliente
(EJB ou aplicação)
EJB
Cliente
(EJB ou aplicação)
EJB
Cliente não está no contexto
uma transação
Cliente está no contexto de
uma transação
chama metodo() que
tem atributo Required
Bean cria nova transação
Bean é incluido na transação
chama metodo() que
tem atributo Required
SUPPORTS
•  Indica que o método suporta transações
–  Será incluído no escopo da transação do cliente se existir
–  Se ele for chamado fora do escopo de uma transação ele
realizará suas tarefa sem transações e pode chamar objetos
que não suportam transações
Cliente
(EJB ou aplicação)
EJB
Cliente
(EJB ou aplicação)
EJB
Cliente não está no contexto
uma transação
Cliente está no contexto de
uma transação
chama metodo() que
tem atributo Supports
Método é executado sem transação
Bean é incluido na sua transação
chama metodo() que
tem atributo Supports
REQUIRES_NEW
•  Indica que uma nova transação, iniciada no escopo do
bean, é sempre criada
–  Estando ou não o cliente no escopo de uma transação, o bean irá
iniciar uma nova transação que iniciará e terminará no bean.
Cliente
(EJB ou aplicação)
EJB
Cliente
(EJB ou aplicação)
Cliente não está no contexto
uma transação
Cliente está no contexto de
uma transação
chama metodo() que tem
atributo RequiresNew
Bean cria nova transação
chama metodo() que tem
atributo RequiresNew
EJB
Bean cria nova transação
Transação é suspensa
Transação é reiniciada
NOT_SUPPORTED
•  Indica que o método não suporta transações
–  Se o método for chamado pelo cliente no escopo de uma
transação, a mesma será suspensa enquanto durar a chamada
do método (não haverá propagação de transações do cliente)
Cliente
(EJB ou aplicação)
EJB
Cliente não está no contexto
uma transação
Método executado sem transação
chama metodo() que tem
atributo NotSupported
Cliente
(EJB ou aplicação)
Cliente está no contexto de
uma transação
chama metodo() que tem
atributo NotSupported
EJB
Método é executado sem transação
Transação é suspensa
Transação é reiniciada
MANDATORY
•  Indica que o método só pode ser chamado no escopo de
uma transação do cliente
–  Se o método for chamado fora de uma transação, ele causará
javax.transaction.TransactionRequiredException (ou
javax.ejb.TransactionRequiredLocalException)
Cliente
(EJB ou aplicação)
EJB
Cliente não está no contexto
uma transação Método provoca exceção
chama metodo() que tem
atributo Mandatory
Exception
Cliente
(EJB ou aplicação)
EJB
Cliente está no contexto de
uma transação
chama metodo() que
tem atributo Mandatory
Bean é incluido na sua transação
NEVER
•  Indica que o método nunca pode ser chamado no
escopo de uma transação
–  Se o cliente que chama o método for parte de uma transação, o
bean irá provocar um RemoteException (ou EJBException em
clientes locais)
Cliente está no contexto de
uma transação
Método provoca exceção
Cliente
(EJB ou aplicação)
EJB
Remote ou EJBException
chama metodo() que tem
atributo Never
Cliente
(EJB ou aplicação)
Cliente não está no contexto
uma transação
chama metodo() que tem
atributo Never
EJB
Método é executado sem transação
Destino de uma transação em CMT
•  Apenas exceções do sistema (Runtime, Remote,
EJBException) provocam rollback automático
–  O container não tem como adivinhar que outras exceções sejam
graves o suficiente para causar rollback (isto pode ser feito
anotando as exceções com @ApplicationException)
•  Pode-se condenar uma transação CMT usando o método
setRollbackOnly() de EJBContext
–  Flag usado pelo container para monitorar estado de transações
–  Pode-se saber o estado da transação usando getRollbackOnly()
try {
return new ClientePK(clienteDAO.create(clienteDTO));
} catch (UsuarioJaExisteException e) {
if (!ctx.getRollbackOnly())
ctx.setRollbackOnly(); // doom this transaction
throw e;
}
Transações em Stateful Session Beans
•  Entities (JPA) mantêm seu estado no banco de dados
–  Quaisquer alterações em suas variáveis de instância, durante
uma operação, serão revertidas em um rollback
•  Já o estado de Stateful Session Beans é mantido em
variáveis de instância e não no banco de dados
–  O container não tem como recuperar o estado de suas variáveis
em caso de rollback
•  É preciso guardar o estado anterior do bean para
reverter caso a transação falhe
–  Se o bean inicia a transação (BMT), podemos guardar o estado
antes do begin e recuperar após o rollback
–  E se o container iniciar a transação (CMT)?
Interface SessionSynchronization
•  Pode ser implementada por Stateful Session Beans para
capturar eventos lançados nos pontos de demarcação
•  void afterBegin():
–  Chamado logo após o início da transação.
–  Guarde o estado do bean para recuperação em caso de falha
•  void beforeCompletion():
–  Chamado antes do commit() ou rollback().
–  Geralmente vazio, mas pode ser usado pelo bean para abortar
a transação se desejar (usando setRollbackOnly())
•  void afterCompletion(boolean state):
–  Chamado após o commit() ou rollback().
–  Se a transação terminou com sucesso, state é true; caso
contrário, é false deve-se restaurar o estado do bean aos
valores guardados em afterBegin()
Interceptadores
•  Interceptadores são operações que podem ser injetadas
em outros métodos durante a chamada
–  É uma implementação de aspectos (AOP)
–  Pode ser aplicado a vários métodos via anotações
–  Permite realizar operações antes, depois ou antes e depois dos
métodos interceptados
•  Como usar
1.  Declare métodos interceptadores (um por classe) com
@AroundInvoke recebendo parâmetro InvocationContext
2.  Chame invocationContext.proceed() no ponto do código em
que o método a ser interceptado será chamado
3.  Declare @Interceptors({Intercep1.class, Intercept2.class, ...})
nas classes ou métodos interceptados (ou use <interceptor-
binding> no ejb-jar.xml)
Exemplo
•  Interceptador
•  Usando um interceptador (para todos os métodos)
public class Intercep1 {!
@AroundInvoke!
public Object m(InvocationContext ctx) throws Exception {!
System.out.println("*** antes ***");!
Object resultado = ctx.proceed();!
System.out.println("*** depois***");!
return resultado;!
}!
} !
@Stateless!
@Interceptors({Intercep1.class}) !
public class MyBean implements MyBeanIF { ... }!
Web Services SOAP (JAX-WS)
•  Session Beans podem ter sua interface exportada como
um Web Service SOAP
–  Declare interface de métodos remotos com @WebService
–  Sua classe do bean ou implementa a interface ou declara
@WebService(endpointInterface="nome da interface”)
•  Com o deploy, o servidor gera as classes TIE do
servidor, WSDL, e estabelece um endpoint
–  Nomes default usam nome do JAR e interface na URI
–  URI?wsdl retorna WSDL que pode ser usado para gerar o cliente
•  Outras anotações como @WebMethod, @WebParam,
@WebContext e seus atributos podem ser usadas para
configurar serviço e mudar defaults
•  Suporte a esse recurso ainda é limitado e dependente
de configurações proprietárias
Exemplo: interface e implementação
@Stateless @WebService!
public class WSBean implements WSBeanInterface {!
@Override!
public int[] numerosDaSorte() {!
int[] numeros = new int[6];!
for(int i = 0; i < numeros.length; i++) {!
int numero = (int)Math.ceil(Math.random() * 60);!
numeros[i] = numero;!
}!
return numeros;!
}!
}!
@WebService!
interface WSBeanInterface {!
int[] numerosDaSorte();!
}!
Forma de implementação ainda
depende do container (anotações
proprietárias não incluídas aqui)
Exemplo de cliente (GF)
•  Geração de stubs com JAX-WS
–  wscompile –s . http://servico/endpoint?wsdl
•  Cliente
public class App {
public static void main( String[] args ) throws Exception {
WSBeanService service = new WSBeanService();
WSBeanInterface proxy = service.getWSBeanPort();
java.util.List<Integer> numeros = proxy.numerosDaSorte();
System.out.println("Numeros da sorte: ");
for(int numero: numeros) {
System.out.print(numero + " ");
}
System.out.println();
}
}
Classe gerada
Referências
•  Especificação EJB 3.0
•  Tutorial Java EE 5
•  Documentação do JBoss
•  Material do curso de Java EE 5

Más contenido relacionado

La actualidad más candente

Aula de Introdução - JAVA
Aula de Introdução  - JAVAAula de Introdução  - JAVA
Aula de Introdução - JAVAMoises Omena
 
Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Marcos Castro
 
Lista de Exercícios III
Lista de Exercícios IIILista de Exercícios III
Lista de Exercícios IIICarlos Priante
 
Curso Java Basico] Aula 19: Vetores (Arrays)
Curso Java Basico] Aula 19:  Vetores (Arrays)Curso Java Basico] Aula 19:  Vetores (Arrays)
Curso Java Basico] Aula 19: Vetores (Arrays)Loiane Groner
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)Alex Camargo
 
Programação em Banco de Dados - Aula 23/08/2018
Programação em Banco de Dados - Aula 23/08/2018Programação em Banco de Dados - Aula 23/08/2018
Programação em Banco de Dados - Aula 23/08/2018Elaine Cecília Gatto
 
Arquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsArquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsEvandro Júnior
 
Treinamento de SQL Básico
Treinamento de SQL BásicoTreinamento de SQL Básico
Treinamento de SQL BásicoIgor Alves
 
Desenvolvimento orientado a testes - TDD
Desenvolvimento orientado a testes - TDDDesenvolvimento orientado a testes - TDD
Desenvolvimento orientado a testes - TDDwashingtonlslima
 
Visibilidade e Diagrama de Classe de Projeto na UML
Visibilidade e Diagrama de Classe de Projeto na UMLVisibilidade e Diagrama de Classe de Projeto na UML
Visibilidade e Diagrama de Classe de Projeto na UMLufpb
 
Resolução de Problemas - Sistemas Operacionais
Resolução de Problemas - Sistemas OperacionaisResolução de Problemas - Sistemas Operacionais
Resolução de Problemas - Sistemas OperacionaisRonildo Oliveira
 
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributosLoiane Groner
 
Apresentação Final de Banco de Dados
Apresentação Final de Banco de DadosApresentação Final de Banco de Dados
Apresentação Final de Banco de Dadossamlobo
 

La actualidad más candente (20)

Aula de Introdução - JAVA
Aula de Introdução  - JAVAAula de Introdução  - JAVA
Aula de Introdução - JAVA
 
Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)
 
Arquitetura paralela
Arquitetura paralelaArquitetura paralela
Arquitetura paralela
 
Lista de Exercícios III
Lista de Exercícios IIILista de Exercícios III
Lista de Exercícios III
 
Curso Java Basico] Aula 19: Vetores (Arrays)
Curso Java Basico] Aula 19:  Vetores (Arrays)Curso Java Basico] Aula 19:  Vetores (Arrays)
Curso Java Basico] Aula 19: Vetores (Arrays)
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)
 
Montagem de Genomas
Montagem de GenomasMontagem de Genomas
Montagem de Genomas
 
Exercicios java básico
Exercicios java básicoExercicios java básico
Exercicios java básico
 
Tipos de dados em MySQL
Tipos de dados em MySQLTipos de dados em MySQL
Tipos de dados em MySQL
 
Programação em Banco de Dados - Aula 23/08/2018
Programação em Banco de Dados - Aula 23/08/2018Programação em Banco de Dados - Aula 23/08/2018
Programação em Banco de Dados - Aula 23/08/2018
 
Processamento paralelo
Processamento paraleloProcessamento paralelo
Processamento paralelo
 
Arquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsArquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e Threads
 
Treinamento de SQL Básico
Treinamento de SQL BásicoTreinamento de SQL Básico
Treinamento de SQL Básico
 
Introdução ao banco de dados
Introdução ao banco de dadosIntrodução ao banco de dados
Introdução ao banco de dados
 
Desenvolvimento orientado a testes - TDD
Desenvolvimento orientado a testes - TDDDesenvolvimento orientado a testes - TDD
Desenvolvimento orientado a testes - TDD
 
Visibilidade e Diagrama de Classe de Projeto na UML
Visibilidade e Diagrama de Classe de Projeto na UMLVisibilidade e Diagrama de Classe de Projeto na UML
Visibilidade e Diagrama de Classe de Projeto na UML
 
Resolução de Problemas - Sistemas Operacionais
Resolução de Problemas - Sistemas OperacionaisResolução de Problemas - Sistemas Operacionais
Resolução de Problemas - Sistemas Operacionais
 
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
[Curso Java Basico - Orientacaoo a Objetos] Aula 24: Classes e atributos
 
Apresentação Final de Banco de Dados
Apresentação Final de Banco de DadosApresentação Final de Banco de Dados
Apresentação Final de Banco de Dados
 

Destacado

TOTVS IP CAMPINAS FSW Treinamento .NET C# - v4 POR FABIO DELBONI
TOTVS IP CAMPINAS FSW Treinamento .NET C# - v4 POR FABIO DELBONITOTVS IP CAMPINAS FSW Treinamento .NET C# - v4 POR FABIO DELBONI
TOTVS IP CAMPINAS FSW Treinamento .NET C# - v4 POR FABIO DELBONIFábio Delboni
 
Visão geral da segurança em Java EE
Visão geral da segurança em Java EEVisão geral da segurança em Java EE
Visão geral da segurança em Java EEHelder da Rocha
 
Curso desenvolvendo web sites (asp)
Curso desenvolvendo web sites (asp)Curso desenvolvendo web sites (asp)
Curso desenvolvendo web sites (asp)Feliz Bunguele
 
Cadastro de clientes em c#
Cadastro de clientes em c#Cadastro de clientes em c#
Cadastro de clientes em c#André Luiz
 
Programação c# - banco de dados
Programação   c# - banco de dadosProgramação   c# - banco de dados
Programação c# - banco de dadosdouglasschaefler
 
C# 6.0 .net coders
C# 6.0   .net codersC# 6.0   .net coders
C# 6.0 .net codersRenato Groff
 
C sharp feup10set2001
C sharp feup10set2001C sharp feup10set2001
C sharp feup10set2001leojr_0
 
Reconstrução de pterossauros com poliestireno extrudido (24o. cbp)
Reconstrução de pterossauros com poliestireno extrudido (24o. cbp)Reconstrução de pterossauros com poliestireno extrudido (24o. cbp)
Reconstrução de pterossauros com poliestireno extrudido (24o. cbp)Helder da Rocha
 
Fundamentos do asp.net
Fundamentos do asp.netFundamentos do asp.net
Fundamentos do asp.netleojr_0
 
Construindo Apps Com SignalR
Construindo Apps Com SignalRConstruindo Apps Com SignalR
Construindo Apps Com SignalRIvan Paulovich
 
105 apostila asp net, c# e visual basic.net
105 apostila asp net, c# e visual basic.net105 apostila asp net, c# e visual basic.net
105 apostila asp net, c# e visual basic.netFernando Helen
 
Apostila desenvolvimento aplicações comerciais com C#
Apostila desenvolvimento aplicações comerciais com C#Apostila desenvolvimento aplicações comerciais com C#
Apostila desenvolvimento aplicações comerciais com C#Vinicius Vieira
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Daniel Makiyama
 
TOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQLTOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQLFábio Delboni
 
Asp julio battisti - criando sites dinamicos com asp 3.0
Asp   julio battisti - criando sites dinamicos com asp 3.0Asp   julio battisti - criando sites dinamicos com asp 3.0
Asp julio battisti - criando sites dinamicos com asp 3.0leojr_0
 

Destacado (20)

TOTVS IP CAMPINAS FSW Treinamento .NET C# - v4 POR FABIO DELBONI
TOTVS IP CAMPINAS FSW Treinamento .NET C# - v4 POR FABIO DELBONITOTVS IP CAMPINAS FSW Treinamento .NET C# - v4 POR FABIO DELBONI
TOTVS IP CAMPINAS FSW Treinamento .NET C# - v4 POR FABIO DELBONI
 
Visão geral da segurança em Java EE
Visão geral da segurança em Java EEVisão geral da segurança em Java EE
Visão geral da segurança em Java EE
 
Curso desenvolvendo web sites (asp)
Curso desenvolvendo web sites (asp)Curso desenvolvendo web sites (asp)
Curso desenvolvendo web sites (asp)
 
Apostila php
Apostila phpApostila php
Apostila php
 
Cadastro de clientes em c#
Cadastro de clientes em c#Cadastro de clientes em c#
Cadastro de clientes em c#
 
Programação c# - banco de dados
Programação   c# - banco de dadosProgramação   c# - banco de dados
Programação c# - banco de dados
 
C# 6.0 .net coders
C# 6.0   .net codersC# 6.0   .net coders
C# 6.0 .net coders
 
C sharp feup10set2001
C sharp feup10set2001C sharp feup10set2001
C sharp feup10set2001
 
Curso de xml
Curso de xmlCurso de xml
Curso de xml
 
Reconstrução de pterossauros com poliestireno extrudido (24o. cbp)
Reconstrução de pterossauros com poliestireno extrudido (24o. cbp)Reconstrução de pterossauros com poliestireno extrudido (24o. cbp)
Reconstrução de pterossauros com poliestireno extrudido (24o. cbp)
 
Fundamentos do asp.net
Fundamentos do asp.netFundamentos do asp.net
Fundamentos do asp.net
 
Construindo Apps Com SignalR
Construindo Apps Com SignalRConstruindo Apps Com SignalR
Construindo Apps Com SignalR
 
105 apostila asp net, c# e visual basic.net
105 apostila asp net, c# e visual basic.net105 apostila asp net, c# e visual basic.net
105 apostila asp net, c# e visual basic.net
 
Apostila de C# & Asp.Net
Apostila de C# & Asp.NetApostila de C# & Asp.Net
Apostila de C# & Asp.Net
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Curso asp - intermediario
Curso   asp - intermediarioCurso   asp - intermediario
Curso asp - intermediario
 
Apostila desenvolvimento aplicações comerciais com C#
Apostila desenvolvimento aplicações comerciais com C#Apostila desenvolvimento aplicações comerciais com C#
Apostila desenvolvimento aplicações comerciais com C#
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
 
TOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQLTOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQL
 
Asp julio battisti - criando sites dinamicos com asp 3.0
Asp   julio battisti - criando sites dinamicos com asp 3.0Asp   julio battisti - criando sites dinamicos com asp 3.0
Asp julio battisti - criando sites dinamicos com asp 3.0
 

Similar a Tutorial EJB 3.0 (2009)

Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Helder da Rocha
 
Palest"Tecnologias para Desenvolvimento Baseado em Componentes"
Palest"Tecnologias para Desenvolvimento Baseado em Componentes"Palest"Tecnologias para Desenvolvimento Baseado em Componentes"
Palest"Tecnologias para Desenvolvimento Baseado em Componentes"sbcars
 
ApresentaçãO Ejb (Enterprise Java Beans)
ApresentaçãO Ejb (Enterprise Java Beans)ApresentaçãO Ejb (Enterprise Java Beans)
ApresentaçãO Ejb (Enterprise Java Beans)mauriciopel
 
Java CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
Java CDI: Usando Java CDI em projetos Jakarta EE ou MicroprofileJava CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
Java CDI: Usando Java CDI em projetos Jakarta EE ou MicroprofileVictor Osorio
 
GUJavaSC - Desenvolvendo uma Aplicação com Java EE
GUJavaSC - Desenvolvendo uma Aplicação com Java EEGUJavaSC - Desenvolvendo uma Aplicação com Java EE
GUJavaSC - Desenvolvendo uma Aplicação com Java EERodrigo Cândido da Silva
 
Enterprise JavaBeans simples e descomplicado, na prática
Enterprise JavaBeans simples e descomplicado, na práticaEnterprise JavaBeans simples e descomplicado, na prática
Enterprise JavaBeans simples e descomplicado, na práticaGlobalcode
 
Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Gilberto Holms
 
Enterprise JavaBeans
Enterprise JavaBeansEnterprise JavaBeans
Enterprise JavaBeanselliando dias
 
Java OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMIJava OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMIYitzhak Stone
 
Maratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBMaratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBDextra
 
Spring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em JavaSpring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em JavaMariana de Azevedo Santos
 
Webcast MSDN - Enterprise Library
Webcast MSDN - Enterprise LibraryWebcast MSDN - Enterprise Library
Webcast MSDN - Enterprise LibraryLuciano Condé
 

Similar a Tutorial EJB 3.0 (2009) (20)

Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
 
Palest"Tecnologias para Desenvolvimento Baseado em Componentes"
Palest"Tecnologias para Desenvolvimento Baseado em Componentes"Palest"Tecnologias para Desenvolvimento Baseado em Componentes"
Palest"Tecnologias para Desenvolvimento Baseado em Componentes"
 
ApresentaçãO Ejb (Enterprise Java Beans)
ApresentaçãO Ejb (Enterprise Java Beans)ApresentaçãO Ejb (Enterprise Java Beans)
ApresentaçãO Ejb (Enterprise Java Beans)
 
Introdução a jsf
Introdução a jsfIntrodução a jsf
Introdução a jsf
 
JAVABEANS.pdf
JAVABEANS.pdfJAVABEANS.pdf
JAVABEANS.pdf
 
Java CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
Java CDI: Usando Java CDI em projetos Jakarta EE ou MicroprofileJava CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
Java CDI: Usando Java CDI em projetos Jakarta EE ou Microprofile
 
GUJavaSC - Desenvolvendo uma Aplicação com Java EE
GUJavaSC - Desenvolvendo uma Aplicação com Java EEGUJavaSC - Desenvolvendo uma Aplicação com Java EE
GUJavaSC - Desenvolvendo uma Aplicação com Java EE
 
Enterprise JavaBeans simples e descomplicado, na prática
Enterprise JavaBeans simples e descomplicado, na práticaEnterprise JavaBeans simples e descomplicado, na prática
Enterprise JavaBeans simples e descomplicado, na prática
 
Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5
 
Introducao EJB 3
Introducao EJB 3Introducao EJB 3
Introducao EJB 3
 
Enterprise JavaBeans
Enterprise JavaBeansEnterprise JavaBeans
Enterprise JavaBeans
 
Java OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMIJava OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMI
 
Curso jsf
Curso jsfCurso jsf
Curso jsf
 
GUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EEGUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EE
 
Maratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBMaratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESB
 
VIII TechTalk - Spring 3
VIII TechTalk - Spring 3VIII TechTalk - Spring 3
VIII TechTalk - Spring 3
 
Spring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em JavaSpring: Overview do framework mais popular para desenvolvimento em Java
Spring: Overview do framework mais popular para desenvolvimento em Java
 
J530 15 workshop
J530 15 workshopJ530 15 workshop
J530 15 workshop
 
Java Web 1 Introducao
Java Web 1 IntroducaoJava Web 1 Introducao
Java Web 1 Introducao
 
Webcast MSDN - Enterprise Library
Webcast MSDN - Enterprise LibraryWebcast MSDN - Enterprise Library
Webcast MSDN - Enterprise Library
 

Más de Helder da Rocha

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsHelder da Rocha
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Helder da Rocha
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosHelder da Rocha
 
Padrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasPadrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasHelder da Rocha
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a WebHelder da Rocha
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosHelder da Rocha
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Helder da Rocha
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8Helder da Rocha
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Helder da Rocha
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)Helder da Rocha
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: SincronizadoresHelder da Rocha
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e FuturesHelder da Rocha
 

Más de Helder da Rocha (20)

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.js
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativos
 
Padrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasPadrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemas
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a Web
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativos
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e Futures
 

Tutorial EJB 3.0 (2009)

  • 1. Enterprise JavaBeans 3.0 Helder da Rocha + Session Beans Message-Driven Beans Transações Interceptadores Web Services 10/10/2009 Introdução prática a
  • 2. Programa •  Enterprise JavaBeans –  Stateless Session Beans –  Stateful Session Beans –  Message-Driven beans •  Transações •  Interceptadores •  Session Bean com WebServices
  • 3. Objetivos deste minicurso •  O objetivo deste minicurso é proporcionar uma introdução prática a EJB 3.0, incluindo interceptadores e Web Services, e discutir em detalhes a demarcação de transações, com demonstrações. •  Tópicos abordados –  Objetivos da especificação EJB3, comparando com EJB 2 –  Descrever a arquitetura de session beans e MDBs –  Demonstrar a criação e uso de beans –  Mostrar como demarcar transações em EJB3 –  Mostrar como criar um interceptador –  Mostrar como criar um WebService com um session bean
  • 4. Tópicos não abordados •  Devido ao foco deste minicurso e limitações de tempo, os tópicos abaixo serão vistos apenas superficialmente ou não serão abordados –  JMS (é pré-requisito) –  Timer service –  Várias anotações de callback (veremos apenas as essenciais) –  Configurações XML no ejb-jar.xml –  Entidades persistentes –  Injeção de dependências (talvez não seja possível demonstrar no JBoss, mas tentaremos com o Glassfish) •  Veja o material suplementar para baixar (e referências no final) para maiores detalhes sobre esses tópicos
  • 5. O que é um Enterprise Bean •  Componente lado-servidor para encapsular a lógica de negócios de uma aplicação •  Objeto que implementa a lógica que realiza o objetivo de uma aplicação ou serviço, e que é gerenciado por um container –  Pode ter serviços (ex: demarcação de transações, segurança) injetados transparentemente –  Permite que o desenvolvedor concentre-se na lógica de negócio para um objeto comum sem se preocupar com infraestrutura e serviços –  Pode ser usado localmente ou remotamente
  • 6. Por que Enterprise Beans? •  Por que não usar objetos comuns? –  Enterprise beans, na versão 3.0, são objetos comuns –  Injeção de dependências é indicada via anotações •  Então, quando se dar ao trabalho de criar uma aplicação baseada em enterprise beans? –  Quando ela precisar configurar serviços como segurança e transações –  Quando ela precisar ser escalável ou distribuída –  Quando ela tiver muitos clientes
  • 7. O que significa “enterprise”? •  Antes era quase sinônimo de “distributed” •  Tecnologias distribuídas –  JDBC, RMI, JTA, JNDI, JMS, JSP, etc. •  O termo refere-se a aplicações complexas, que requerem grande investimento em arquitetura –  serviços como segurança, distribuição, etc. –  facilidade de manutenção, escalabilidade –  robustez e integridade de dados compartilhados •  Esses serviços requerem conhecimentos e recursos que vão além da lógica de negócios da aplicação
  • 8. Servidores de aplicação •  Servidores que oferecem ambientes controlados para execução de componentes –  Arquitetura container-componente com serviços de middleware implícito •  Serviços típicos –  transações –  autenticação e autorização –  gerenciamento de recursos (ciclo de vida) –  agendamento –  persistência transparente –  sistema de nomes e diretórios –  Injeção de dependências
  • 9. Containers e componentes •  Containers são como sistemas operacionais e componentes são como aplicações –  Containers controlam a execução de seus componentes, e permitem ser configurados –  A configuração define como o componente será executado •  A comunicação container-componente ocorre através de chamadas (métodos de callback) •  Servidores de aplicação fornecem containers –  Componentes que aderem ao contrato podem rodar nesses containers
  • 10. Containers e componentes •  Containers controlam o ciclo de vida de seus componentes •  A instalação de um componente em um container chama-se deployment (implantação) •  Containers permitem a configuração de serviços para um ou mais componentes •  Servidores Java EE fornecem três tipos de containers –  Container Web –  Container para enterprise beans –  Container cliente
  • 11. Tipos de enteprise beans •  Session Beans –  Modelam processos de negócio. São ações, verbos. –  Fazem coisas: acessam um banco, fazem contas, –  Podem manter ou não estado não-persistente –  Processar informação, comprar produto, validar cartão •  Message-driven beans –  Modelam processos assíncronos. Respondem a eventos. –  Agem somente quando recebem uma mensagem –  Não mantêm estado
  • 12. Tipos de enterprise beans •  E os Entity Beans? –  São “persistent entities” na especificação EJB 3.0 –  São tratados em especificação à parte pois são um serviço independente (não são mais considerados “enterprise beans” na nova especificação) •  Persistent entities –  Modelam dados de negócio. São coisas, substantivos. –  Representam informações em bancos de dados –  Mantêm estado persistente –  Um produto, um empregado, um pedido –  São mapeados a tabelas usando ORM
  • 13. Uso típico de componentes Java EE 5 En#ty     En#ty    En#ty     Session  Bean  Message-­‐driven  Bean   En#ty     Session  Bean   Servlet   Taglib   Cliente     Swing   Cliente     C++   Cliente  JMS   JSP   MOM   BD   Cliente     HTML   Cliente     WebService  
  • 14. Como usar um enterprise bean •  Um enterprise bean precisa ser 1.  Codificado em Java como um POJO 2.  Receber anotações com meta-informação (ou ter um deployment descriptor em XML) 3.  Compilado 4.  Empacotado em um arquivo JAR 5.  Implantado em um servidor de aplicações •  Para executar os serviços de um bean, é preciso escrever um cliente 1.  Localizar o bean ou um destino associado a ele 2.  Enviar mensagens e receber resposta (se houver)
  • 15. Onde implantar •  Para implantar um enterprise bean é preciso ter um servidor compatível –  JBoss 4.0.4 ou superior –  Glassfish Sun AS 9.1 ou superior –  etc. •  Pode ser necessário lidar com detalhes proprietários de cada servidor –  Forma como o cliente localiza o bean –  Forma como o componente é implantado –  Necessidade de arquivos extras
  • 16. EJB 2.1 vs. EJB 3.0 •  Objetivo principal do EJB 3.0: –  Facilidade de desenvolvimento. •  É uma simplificação das versões anteriores. •  É compatível –  Componentes EJB 2.1 podem ser usados em conjunto com componentes EJB 3.0 –  EJB 3.0 é muito, muito mais simples que EJB 2.1 “O objetivo do EJB 3.0 é melhorar a arquitetura EJB ao reduzir sua complexidade do ponto de vista do desenvolvedor” (especificação EJB 3.0)
  • 17. Objetivos (especificação) •  Definição de anotações de metadados –  menos classes e arquivos para implementar –  não precisa mais do deployment descriptor •  Especificação de defaults –  Declara-se apenas as anotações necessárias •  Encapsulamento de dependências de ambiente –  JNDI e DI via uso de anotações •  Simplificação dos tipos de enterprise beans •  Simplificação de persistência via Java Persistence API –  Mais simples, porém com mais recursos •  Interceptadores para session e message-driven beans
  • 18. Em suma, EJB 3 simplifica EJB 2 •  Beans não precisam mais –  ter interfaces Home nem de Componente –  implementar métodos de callback (ejbXXX) chamados pelo container –  implementar interface EnterpriseBean •  É mais fácil achar os beans •  Metadados em forma de anotações podem ser usados dispensando deployment descriptors –  Que continuam existindo, mas são opcionais •  ORM (JPA) no lugar de entity beans!
  • 19. Menos arquivos •  Com a API 3.0, o desenvolvedor usa a classe do bean como principal artefato de programação. –  Programador cria classe e acrescenta anotações. –  Anotações contém metadados. Servem para informar o tipo do bean, incluir servicos, etc. •  Divisão de responsabilidades do Java EE continuam valendo –  Configurador do sistema não mexe no código: cria ou usa deployment descriptor ejb-jar.xml e sobrepõe configurações default do programador do bean
  • 20. Session Beans •  São objetos de processo de negócio –  Implementam lógica de negócio, algoritmos, workflow –  Representam ações •  Sessão –  Tempo que o browser está aberto –  Tempo que um outro bean usa o session bean –  Tempo que uma aplicação remota está aberta •  Objetos transientes –  Não tem seu estado armazenado em meio persistente
  • 21. Tipos de Session Beans •  Clientes travam um diálogo com um bean (interação entre um cliente e um bean) –  Uma ou mais chamadas entre cliente e bean –  Dura um processo de negócios para o cliente •  Os dois tipos de session beans modelam tipos diferentes de diálogos –  Stateful Session Beans modelam diálogos consistem de várias requisições onde certas requisições podem depender do estado de requisições anteriores –  Stateless Session Beans modelam diálogos que consistem de apenas uma requisição
  • 22. Stateless Session Beans •  Como não mantém estado do diálogo, todas as instâncias da mesma classe são equivalentes e indistiguíveis –  Não importa quem chamou o bean no passado –  Qualquer instância disponível de um session bean pode servir a qualquer cliente •  Session Beans podem ser guardados em pool, reutilizados e passados de um cliente para outro em cada chamada Fonte: [1] EJBObject Cliente Bean Bean Bean Bean Pool de beans idênticos
  • 23. Ciclo de vida: Stateless Session Bean Fonte: [1] Bean não existe Pool de beans equivalentes 1. Objeto criado 2. @PostConstruct @PreDestroy metodo() Qualquer cliente pode chamar um método de negócio em qualquer EJBObject Container cria um novo bean quando ele acha que precisa de mais beans no pool para servir à demanda dos clientes Quando o container decidir que não precisa mais de tantas instâncias, chama método marcado com @PreDestroy e remove a instância
  • 24. Stateless local bean @Stateless public class CalculatorBean implements Calculator { public float add (int a, int b) { return a + b; } public float subtract (int a, int b) { return a - b; } } @Local public interface Calculator { public float add (int a, int b); public float subtract (int a, int b); } •  Anotação mínima: @Stateless •  Comportamentos de transações, ciclo de vida, etc. são default se não houver anotações específicas
  • 25. Exemplo de cliente local •  Outros objetos dentro do servidor de aplicações podem referir-se ao serviço do EJB através de JNDI ou injeção de recursos/dependências* –  Nome da classe do bean (tipo) é usado em JNDI e DI –  Chamada de métodos é igual ao uso normal de Java standalone –  Objetos retornados são referências, sejam ou não gerenciados @ManagedBean! public class CalculatorWebBean {! @EJB(beanName="CalculatorBean")! private Calculator calc;! private float p1, p2, result;! ! public String calculate() {! result = calc.add(p1, p2);! return null; ! }! …! }! … public CalculatorWebBean () { Context jndi = 
 new InitialContext();
 calc = (Calculator) 
 jndi.lookup(“Calculator”); } … Inicialização usando JNDI em construtor (em vez de usar de @EJB) * Isto pode não funcionar no JBoss (requer configuração adicional)
  • 26. Stateless remote (IIOP) bean •  Permite acesso remoto (clientes de outras JVMs) •  Exporta OMG IDL (independente de linguagem) •  Como criar –  Fornecer interface anotada com @Remote @Stateless public class CalculatorBean implements Calculator { public float add (int a, int b) { return a + b; } public float subtract (int a, int b) { return a - b; } } @Remote public interface Calculator { public float add (int a, int b); public float subtract (int a, int b); }
  • 27. Clientes remotos (RMI/IIOP) •  Precisam obter autorização e baixar proxy de rede (stub) para realizar a comunicação –  Cliente Java standalone pode obter via JNDI (pode ser preciso configurar autorização de acesso externo para o serviço EJB) –  Cliente executando em container Java EE pode obter stub através de injeção de dependências @EJB –  Clientes IIOP podem usar o IDL do serviço e ferramentas para gerar componentes em outras linguagens •  Uma vez obtido o proxy, métodos remotos podem ser chamados normalmente como se fossem locais –  Valores retornados podem ser value objects (serializados) ou proxies para objetos remotos: há diferença se comparado ao acesso local
  • 28. Exemplo de cliente SB remoto •  Se não estiver em container, precisa ter acesso a remoto a componente cliente JNDI –  Requer configuração (veja configuração JNDI para clientes JMS) –  Objetos retornados em métodos são value objects (serializados) a menos que sejam também proxies para objetos remotos (SB) public class CalculatorClient { public static void main(String[] args) throws Exception { Context jndi = new InitialContext(); // conf. via jndi.properties String nome = “java:/global/mathbeans/Calculator”; Calculator calc = (Calculator) jndi.lookup(nome); BigDecimal result = calc.add(3, 4); } } Proxy (referência) Value object
  • 29. Stateful Session Beans •  Quando um cliente chama um método que mantém seu estado, ele está iniciando um diálogo –  O estado deve ser mantido para a próxima requisição –  Container não pode fazer o mesmo tipo de pooling que faz com stateless session beans •  Passivação e ativação –  Dados do bean são armazenados em meio persistente durante a passivação e recuperados na ativação –  Permite manter poucas instâncias no ar e vários clientes –  Estratégia comum: LRU - Least Recently Used - se container precisar de recursos, beans menos usados serão passivados. •  Objetos são serializados, logo, fazem parte do estado do diálogo apenas objetos e variáveis não transientes
  • 30. Ativação e Passivação •  Se há mais clientes que beans no pool, mas grande parte permanece inativa por certos períodos, container gerencia recursos usando ativação e passivação •  Exemplo: Pool de 5 beans chamado por sexto cliente 1.  Estado do bean que foi usado há mais tempo é gravado. Antes disso, seu método @PrePassivate é chamado 2.  Se cliente está continuando diálogo iniciado anteriormente, o estado anterior do bean é recuperado e usado para preencher o bean. Depois, @PostActivate é chamado.
  • 31. Ciclo de vida: Stateful Session Bean Fonte: [1] Bean não existe Inativo 1. Objeto criado 2. @PostConstruct @PreDestroy metodo() Cliente chama método de negócio no EJBObject Cliente cria bean Cliente chamou método em um bean inativo. Container precisa ativar o bean novamente Limite de beans ativos foi atingido Cliente chama @PreDestroy ou sessão expirou Ativo @PrePassivate @PostActivate Sessão expirada
  • 32. Message Driven Beans (MDB) •  Objeto gerenciado (Enterprise JavaBean) –  Anotado com @MessageDriven –  Pode injetar @Resource MessageDrivenContext –  Permite configuração declarativa de serviços Java EE •  Implementa consumidor JMS assíncrono (listener) –  Implementa interface MessageListener (método onMessage) –  Permite a configuração de seletores JMS, filas, tópicos, etc. 32 @MessageDriven(activationConfig={! @ActivationConfigProperty(propertyName="destinationType",! propertyValue="javax.jms.Queue"),! @ActivationConfigProperty(propertyName="destination", ! propertyValue="queue/ProdutoQueue")! })! public class ProdutoMDB implements MessageListener {! @Resource! private MessageDrivenContext mdc;! public void onMessage(Message message) { … }! }!
  • 33. Produtores JMS para MDB •  MDB é consumidor assíncrono de mensagens •  Produtores: clientes que enviam mensagens a um destino –  Produtores externos e clientes standalone –  Outros EJBs e componentes dentro do servidor de aplicações •  Produtores podem injetar filas e conexões @Stateless! public class ClienteEJB {! public void metodo() throws Exception {! @Resource(mappedName="java:/JmsXA”) ! ConnectionFactory connectionFactory;! Connection con = factory.createConnection();! Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);! @Resource(mappedName="topic/testTopic”) ! Topic topic;! Producer publisher = session.createProducer(topic);! TextMessage msg = session.createTextMessage();! msg.setText("Teste");! publisher.send(msg);! }! }!
  • 34. Transações •  São unidades atômicas de procedimento –  Sistema de transações garante que o procedimento termina com sucesso ou é completamente desfeita •  Serviço essencial da arquitetura EJB •  Simplifica a programação de aplicações –  Programador não se preocupa com recuperação de falhas em programação para sistemas multiusuário •  Programador EJB pode escolher entre duas formas de demarcação de transações: –  explícita, ou programática (Bean-Managed – BMT) –  implícita, ou declarativa (Container-Managed - CMT)
  • 35. Commit e Rollback •  Uma transação engloba uma unidade de trabalho 1.  Durante o processo sub-operações são realizadas e resultados temporários são obtidos. 2.  No final, a transação é cometida (isto é o commit): o resultado final torna-se durável se cada sub-operação funcionar com sucesso 3.  Caso uma sub-operação falhe, é iniciado processo de reversão das alterações temporárias realizadas (isto é o rollback): os dados envolvidos voltam aos estados que tinham antes do início da transação Estado Inicial Transação ocorrendo Estado Final Transação desfeita (rolled-back) Transação cometidaFalha! Sucesso!
  • 36. Modelos transacionais •  Flat transacions –  Resultado "tudo ou nada": Se qualquer operação da seqüência falhar, operação inteira é abortada •  Nested transactions –  Sub-transações são executadas separadamente e podem ser corrigidas e repetidas sem afetar o resultado final •  Chained transactions –  Transações executam em etapas reversíveis (na falha, volta-se a um ponto previamente definido) Correção Transação Principal Subtrans 1 Subtrans 2Subtrans 1.1 Subtrans 2.1 Transação Subtrans 1 Subtrans 2 Subtrans 1.1 Subtrans 2.1
  • 37. T3T2 Nested Transactions •  Transações novas podem ocorrer no contexto de transações existentes –  Se uma sub-transação falhar, ela pode tentar se recuperar e impedir que a transação principal falhe –  Se ela não conseguir se recuperar, e causar o rollback da transação principal, todas as transações e sub-transações iniciadas no contexto da transação principal são desfeitas T1 Sucesso Falha Dados temporariamente alterados Alterações revertidas Dados temporariamente alterados A=5 C=10 A=0 B=0 C=0 B=3 C=0 A=0 B=0 C=0 B=0 A=0 Estado inicial Estado final Sucesso
  • 38. Flat Transactions •  Neste modelo, operações ocorrem na mesma dimensão. Se alguma falhar, todo o processo falha e é revertido –  Operações chamadas são incluídas na transãção –  As alterações só são cometidas depois que todas as operações foram realizadas com sucesso T1 Sucesso Dados temporariamente alterados Alterações revertidas Dados temporariamente alterados A=5 B=0 A=0B=10 A=0 B=0 A=0 B=0 T1 Sucesso Dados temporariamente alterados Alterações cometidas Dados temporariamente alterados A=5 B=10 A=5B=10 A=5 B=10 A=0 B=0 Estado inicial Novo estado final Sucesso Falha Estado final igual ao inicial
  • 39. Suporte de transações em EJB •  A especificação EJB não exige que o container suporte transações no contexto de outras transações –  Não garante suporte a transações aninhadas •  Logo, apenas "flat transactions" são suportadas –  Servidor pode suportar outros modelos, mas a portabilidade não é garantida •  O comportamento de uma operação durante uma transação pode ser controlada pelo programador –  Se operação continua transação anterior –  Se operação interrompe transação anterior –  Se operação inicia uma nova transação (não mantém contexto da transação anterior, já que não aninha)
  • 40. T3T2 Sucesso FalhaB=3 Conseqüências de Flat Transactions •  Se método é chamado dentro de uma transação, ele pode continuar transação anterior (no mesmo nível) –  Se ele falhar, transação inteira é revertida •  Se nova transação for iniciada no método que já faz parte de uma transação, ela é independente –  Se falhar, pode sinalizar rollback() para desfazer transação externa (ou não, e permitir que transação externa continue) –  O possível rollback da transação externa não afetará outras transações (T2) cujos resultados já foram cometidos T1 Alterações cometidas Dados temporariamente alterados Alterações revertidas Dados temporariamente alterados A=5 C=0A=5 C=10 A=5 B=0 C=0 A=0 B=0 C=0 Estado inicial Estado final Nova Transação rollback() T1T1Suspensa SuspensaSucesso B=0
  • 41. Demarcação de transações •  O controle de transações em EJB resume-se a demarcação de transações –  Consiste apenas do controle de quando ela será iniciada e quando será concluída (ou desfeita) –  Não são controlados aspectos de baixo-nível (não há interação entre cliente e gerenciadores de recursos ou de transações) •  Há várias formas de demarcar transações –  Podem ser demarcadas no cliente (comuns, servlets, beans, etc.) e propagadas para os componentes –  Podem ser demarcadas no servidor, de duas formas: no container (implícita), usando declarações no DD, ou no bean (explícita), usando APIs como JTA, JDBC ou JMS
  • 42. Demarcação de transações •  Depende de quem chama o serviço Cliente EJB Object (interceptador) Serviço de Transações Enterprise Bean 1. begin() 5. commit() ou rollback() 2. 3. 4. DEMARCADA PELO CLIENTECliente EJB Object (interceptador) Serviço de Transações Enterprise Bean 2. begin() 5. commit() ou rollback() 1. 3. 4. DEMARCADA NO CONTAINER EJB Object (interceptador) Serviço de Transações Enterprise Bean 1. 4. 2. 3. begin() 5. commit() ou rollback() DEMARCADA NO BEAN Cliente
  • 43. Demarcação explícita de transações •  Consiste em utilizar alguma API de controle de transações diretamente no código (BMT) –  Uso de métodos begin(), commit(), rollback(), etc. marcando início e fim de unidades atômicas de código •  Para usar, é preciso informar esta opção (transacion management type) ao container (CONTAINER é default) @Stateless ! @TransactionManagement(TransactionManagementType.BEAN)! public class Fachada { ... }! •  No código, use JTA, JDBC ou JMS –  Métodos de Connection (java.sql) –  Métodos de Session (javax.jms) –  Métodos de UserTransaction (javax.transaction)
  • 44. Transações explícitas com JDBC (...) public void ship (String productId, String orderId, int quantity) { try { con.setAutoCommit(false); // con é java.sql.Connection updateOrderItem(productId, orderId); updateInventory(productId, quantity); con.commit(); } catch (Exception e) { try { con.rollback(); throw new EJBException("Transaction failed: " + e.getMessage()); } catch (SQLException sqx) { throw new EJBException("Rollback failed: " + sqx.getMessage()); } } } Fonte: tutorial Java EE - WarehouseBean.java
  • 45. UserTransaction •  É a única classe do JTA que todos os containers JavaEE/EJB precisam implementar •  Seus métodos são usados para demarcar transações –  begin(): marca o início –  commit(): marca o término –  rollback(): condena a transação –  setRollbackOnly(): marca a transação para rollback –  setTransactionTimeout(int segundos): define o tempo de vida de uma transação –  getStatus(): retorna o status de uma transação. O status é um objeto da classe javax.transaction.Status e pode ter os valores STATUS_ACTIVE, STATUS_COMMITTED, STATUS_ROLLEDBACK, etc.
  • 46. Transações explícitas com JTA (...) public void withdrawCash(double amount) { UserTransaction ut = sessionCtx.getUserTransaction(); try { double mbState = machineBalance; ut.begin(); updateChecking(amount); machineBalance -= amount; insertMachine(machineBalance); ut.commit(); } catch (Exception ex) { try { ut.rollback(); machineBalance = mbState; } catch (SystemException syex) { throw new EJBException ("Rollback failed: " + syex.getMessage()); } throw new EJBException ("Transaction failed: " + ex.getMessage()); } } Fonte: Tutorial Java EE - TellerBean.java EJBContext do bean (SessionContext ou MessageDrivenContext – deve ser injetado)Estado de variável de instância NÃO será revertido em caso de rollback()
  • 47. Transações iniciadas no cliente •  O cliente pode iniciar transações JDBC e JMS –  Cliente pode ser standalone, servlet, bean, etc. •  Se desejar utilizar o serviço OTS via JTA, é necessário obter uma instância da classe UserTransaction através de JNDI –  O container deve disponibilizar o JTA na localidade java:comp/UserTransaction Context ctx = new InitialContext(); ut = (javax.transaction.UserTransaction) ctx.lookup("java:comp/UserTransaction"); ut.begin(); // realizar operações ut.commit();
  • 48. Session Beans com BMT •  O container suspende qualquer transação iniciada pelo cliente ao executar método de um Session Bean que inicie transação BMT •  Stateless Session Bean –  Transação deve terminar antes do método terminar •  Stateful Session Beans, –  Transação pode ser iniciada em um método e terminada em outro: será suspensa no fim da primeira chamada e reiniciada na segunda –  Este não é um procedimento recomendado) •  Para saber o estado de transação existente –  UserTransaction.getStatus()
  • 49. Transações em Message-driven beans •  Um cliente não chama um MDB diretamente –  MDBs lêem mensagens de um destino JMS –  Não há, portanto, propagação de transações de um cliente para um MDB •  MDBs podem iniciar novas transações –  O escopo da transação deve iniciar e terminar dentro do método onMessage() •  Sempre que possível, use CMT com MDBs –  CMT: entrega da mensagem é parte da transação: se houver rollback, container pode reenviar a mensagem –  BMT: é preciso provocar EJBException para evitar o acknowledgement e forçar o reenvio
  • 50. Propagação de transações •  Transações terminam no mesmo lugar onde começaram •  Pode-se melhorar a performance de operações que fazem muitas chamadas colocando-as em contexto transacional –  O contexto da transação será propagado para todos os métodos chamados (se não iniciarem nova transação) –  Se métodos chamados iniciarem nova transação, a transação principal será suspensa até que o método termine Cliente Session EJB Session Bean Entity Local Entity Entity Local Entity Session EJB Session Bean Entity Local Entity Transação suspensa (será reiniciada quando método retornar) Transação iniciada no container
  • 51. Controle implícito (declarativo) •  Container-Managed Transactions (CMT) –  Controle de transações totalmente gerenciado pelo container –  Não permite o uso de métodos commit() e rollback() de java.sql.Connection ou javax.jms.Session dentro do código •  Na declaração espeficique o uso de CMT @Stateless! @TransactionManagement(! TransactionManagementType.CONTAINER! ) ! public class Fachada {…}! •  Depois, pode-se definir a política de propagação de transações para toda a classe e cada método
  • 52. Atributos (políticas de propagação) •  O elemento @TransactionAttribute define a política transacional do componente ou método –  Define como ele irá reagir quando o seu método for chamado por um cliente dentro ou fora do contexto de uma transação •  Os valores suportados para este elemento (depende do tipo de bean) são –  TransactionAttributeType.NOT_SUPPORTED! –  TransactionAttributeType.SUPPORTS! –  TransactionAttributeType.REQUIRED! –  TransactionAttributeType.REQUIRES_NEW! –  TransactionAttributeType.MANDATORY! –  TransactionAttributeType.NEVER!
  • 53. REQUIRED •  Indica que o método tem que ser chamado dentro do escopo de uma transação –  Se não existe transação, uma nova é criada e dura até que o método termine (é propagada para todos os métodos chamados) –  Se já existe uma transação iniciada pelo cliente, o bean é incluído no seu escopo durante a chamada do método Cliente (EJB ou aplicação) EJB Cliente (EJB ou aplicação) EJB Cliente não está no contexto uma transação Cliente está no contexto de uma transação chama metodo() que tem atributo Required Bean cria nova transação Bean é incluido na transação chama metodo() que tem atributo Required
  • 54. SUPPORTS •  Indica que o método suporta transações –  Será incluído no escopo da transação do cliente se existir –  Se ele for chamado fora do escopo de uma transação ele realizará suas tarefa sem transações e pode chamar objetos que não suportam transações Cliente (EJB ou aplicação) EJB Cliente (EJB ou aplicação) EJB Cliente não está no contexto uma transação Cliente está no contexto de uma transação chama metodo() que tem atributo Supports Método é executado sem transação Bean é incluido na sua transação chama metodo() que tem atributo Supports
  • 55. REQUIRES_NEW •  Indica que uma nova transação, iniciada no escopo do bean, é sempre criada –  Estando ou não o cliente no escopo de uma transação, o bean irá iniciar uma nova transação que iniciará e terminará no bean. Cliente (EJB ou aplicação) EJB Cliente (EJB ou aplicação) Cliente não está no contexto uma transação Cliente está no contexto de uma transação chama metodo() que tem atributo RequiresNew Bean cria nova transação chama metodo() que tem atributo RequiresNew EJB Bean cria nova transação Transação é suspensa Transação é reiniciada
  • 56. NOT_SUPPORTED •  Indica que o método não suporta transações –  Se o método for chamado pelo cliente no escopo de uma transação, a mesma será suspensa enquanto durar a chamada do método (não haverá propagação de transações do cliente) Cliente (EJB ou aplicação) EJB Cliente não está no contexto uma transação Método executado sem transação chama metodo() que tem atributo NotSupported Cliente (EJB ou aplicação) Cliente está no contexto de uma transação chama metodo() que tem atributo NotSupported EJB Método é executado sem transação Transação é suspensa Transação é reiniciada
  • 57. MANDATORY •  Indica que o método só pode ser chamado no escopo de uma transação do cliente –  Se o método for chamado fora de uma transação, ele causará javax.transaction.TransactionRequiredException (ou javax.ejb.TransactionRequiredLocalException) Cliente (EJB ou aplicação) EJB Cliente não está no contexto uma transação Método provoca exceção chama metodo() que tem atributo Mandatory Exception Cliente (EJB ou aplicação) EJB Cliente está no contexto de uma transação chama metodo() que tem atributo Mandatory Bean é incluido na sua transação
  • 58. NEVER •  Indica que o método nunca pode ser chamado no escopo de uma transação –  Se o cliente que chama o método for parte de uma transação, o bean irá provocar um RemoteException (ou EJBException em clientes locais) Cliente está no contexto de uma transação Método provoca exceção Cliente (EJB ou aplicação) EJB Remote ou EJBException chama metodo() que tem atributo Never Cliente (EJB ou aplicação) Cliente não está no contexto uma transação chama metodo() que tem atributo Never EJB Método é executado sem transação
  • 59. Destino de uma transação em CMT •  Apenas exceções do sistema (Runtime, Remote, EJBException) provocam rollback automático –  O container não tem como adivinhar que outras exceções sejam graves o suficiente para causar rollback (isto pode ser feito anotando as exceções com @ApplicationException) •  Pode-se condenar uma transação CMT usando o método setRollbackOnly() de EJBContext –  Flag usado pelo container para monitorar estado de transações –  Pode-se saber o estado da transação usando getRollbackOnly() try { return new ClientePK(clienteDAO.create(clienteDTO)); } catch (UsuarioJaExisteException e) { if (!ctx.getRollbackOnly()) ctx.setRollbackOnly(); // doom this transaction throw e; }
  • 60. Transações em Stateful Session Beans •  Entities (JPA) mantêm seu estado no banco de dados –  Quaisquer alterações em suas variáveis de instância, durante uma operação, serão revertidas em um rollback •  Já o estado de Stateful Session Beans é mantido em variáveis de instância e não no banco de dados –  O container não tem como recuperar o estado de suas variáveis em caso de rollback •  É preciso guardar o estado anterior do bean para reverter caso a transação falhe –  Se o bean inicia a transação (BMT), podemos guardar o estado antes do begin e recuperar após o rollback –  E se o container iniciar a transação (CMT)?
  • 61. Interface SessionSynchronization •  Pode ser implementada por Stateful Session Beans para capturar eventos lançados nos pontos de demarcação •  void afterBegin(): –  Chamado logo após o início da transação. –  Guarde o estado do bean para recuperação em caso de falha •  void beforeCompletion(): –  Chamado antes do commit() ou rollback(). –  Geralmente vazio, mas pode ser usado pelo bean para abortar a transação se desejar (usando setRollbackOnly()) •  void afterCompletion(boolean state): –  Chamado após o commit() ou rollback(). –  Se a transação terminou com sucesso, state é true; caso contrário, é false deve-se restaurar o estado do bean aos valores guardados em afterBegin()
  • 62. Interceptadores •  Interceptadores são operações que podem ser injetadas em outros métodos durante a chamada –  É uma implementação de aspectos (AOP) –  Pode ser aplicado a vários métodos via anotações –  Permite realizar operações antes, depois ou antes e depois dos métodos interceptados •  Como usar 1.  Declare métodos interceptadores (um por classe) com @AroundInvoke recebendo parâmetro InvocationContext 2.  Chame invocationContext.proceed() no ponto do código em que o método a ser interceptado será chamado 3.  Declare @Interceptors({Intercep1.class, Intercept2.class, ...}) nas classes ou métodos interceptados (ou use <interceptor- binding> no ejb-jar.xml)
  • 63. Exemplo •  Interceptador •  Usando um interceptador (para todos os métodos) public class Intercep1 {! @AroundInvoke! public Object m(InvocationContext ctx) throws Exception {! System.out.println("*** antes ***");! Object resultado = ctx.proceed();! System.out.println("*** depois***");! return resultado;! }! } ! @Stateless! @Interceptors({Intercep1.class}) ! public class MyBean implements MyBeanIF { ... }!
  • 64. Web Services SOAP (JAX-WS) •  Session Beans podem ter sua interface exportada como um Web Service SOAP –  Declare interface de métodos remotos com @WebService –  Sua classe do bean ou implementa a interface ou declara @WebService(endpointInterface="nome da interface”) •  Com o deploy, o servidor gera as classes TIE do servidor, WSDL, e estabelece um endpoint –  Nomes default usam nome do JAR e interface na URI –  URI?wsdl retorna WSDL que pode ser usado para gerar o cliente •  Outras anotações como @WebMethod, @WebParam, @WebContext e seus atributos podem ser usadas para configurar serviço e mudar defaults •  Suporte a esse recurso ainda é limitado e dependente de configurações proprietárias
  • 65. Exemplo: interface e implementação @Stateless @WebService! public class WSBean implements WSBeanInterface {! @Override! public int[] numerosDaSorte() {! int[] numeros = new int[6];! for(int i = 0; i < numeros.length; i++) {! int numero = (int)Math.ceil(Math.random() * 60);! numeros[i] = numero;! }! return numeros;! }! }! @WebService! interface WSBeanInterface {! int[] numerosDaSorte();! }! Forma de implementação ainda depende do container (anotações proprietárias não incluídas aqui)
  • 66. Exemplo de cliente (GF) •  Geração de stubs com JAX-WS –  wscompile –s . http://servico/endpoint?wsdl •  Cliente public class App { public static void main( String[] args ) throws Exception { WSBeanService service = new WSBeanService(); WSBeanInterface proxy = service.getWSBeanPort(); java.util.List<Integer> numeros = proxy.numerosDaSorte(); System.out.println("Numeros da sorte: "); for(int numero: numeros) { System.out.print(numero + " "); } System.out.println(); } } Classe gerada
  • 67. Referências •  Especificação EJB 3.0 •  Tutorial Java EE 5 •  Documentação do JBoss •  Material do curso de Java EE 5