EJB 3.1: A Community Update Reza Rahman Autor, EJB 3 in Action Expert Group Member, Java EE 6 and EJB 3.1 Fundador, Cognicellence Julho de 2008 1
EJB 3.0: Revisão Breve > As grandes mudanças > EJB simplificado > Java Persistence API > A queda dos EJB 2.x Entity Beans > Foco na facilidade de uso > programação POJO > Annotations desde o começo > Não mais configuração XML > Defaults inteligentes > Injeção de dependência > Bem recebido pela comunidade, apesar dos céticos > EJB 3.1 mantém a facilidade de uso e traz mais features 2
EJB 3.1: Novidades > Interfaces opcionais para Session Bean > Singleton Beans com controle de concorrência > Timers declarativos e programáticos no estilo Cron > Invocações assíncronas > Empacotamento WAR simplificado > Suporte em runtime para Java SE > Nomes JNDI globais padronizados > EJB Lite 3
Interfaces Opcionais para Session Bean > Acoplamento fraco através de interfaces não é sempre necessário > Um Session Bean é apenas uma classe bean com annotations > Todos métodos públicos são métodos de negócio > O Cliente tem referencia direta à classe bean > Especialmente útil ao usar Session Beans como backing beans JSF com WebBeans/Seam 4
Session Bean sem interface @Stateless public class PlaceBidBean { @PersistenceContext private EntityManager entitymanager; public void placebid(bid bid) { entitymanager.persist(bid); @EJB private PlaceBidBean placebid; placebid.placebid(bid); 5
Singleton Beans > Novo tipo de Session Bean > Instância única para a aplicação inteira > Ótimo para estado compartilhado > Pode ser usado como listener de ciclo de vida do container > Thread-safe garantido por default > Permite controle de concorrência mais refinado > Controle de concorrência poderia ser aplicado a Stateful Session Beans também? 6
Singleton Bean Simples @Singleton public class DiscountRateBean { private Rate rate; @PostConstruct private void init() { rate = @ConcurrencyAttribute(READ_WRITE_LOCK) public void setrate(rate rate) { this.rate = rate; @ConcurrencyAttribute(READ_LOCK) public Rate getrate() { return rate; 7
Singleton com Concorrência Bean-Managed @Singleton @ConcurrencyManagement(BEAN) public class DiscountRateBean { private Rate rate; @PostConstruct private void init() { rate = public synchronized void setrate(rate rate) { this.rate = rate; public synchronized Rate getrate() { return rate; 8
Timers estilo Cron > Agendamentos sem dor de cabeça, como no Cron, sem o inferno das configurações > Ambos Timers declarativos e programaticos > Reuso da semântica do Cron em vez de reinventar a roda, com melhorias na usabilidade 9
Timers Programáticos estilo Cron @Stateless public class NewsLetterGeneratorBean { @Resource private Session mailsession; @Schedule(second="0", minute="0", hour="0", dayofmonth="1", month="*", year="*") public void generatemonthlynewsletter() { 10
Cron-like Programmatic Timers @Stateless public class WatchListAlertBean { @Resource private Session mailsession; @Resource private TimerService timerservice; public void addwatchlistalert(watchlistalert alert) { ScheduleExpression schedule = new ScheduleExpression().dayOfWeek(alert.getWeekday()).hour(alert.getHour()); timerservice.createtimer(schedule, alert.getwatchlist()); @Timeout private void sendwatchlistalert(timer timer) { 11
Sintaxe de Expressões Timer > Atributos suportados > second (0-59), minute (0-59), hour (0-23) > Default = 0 > dayofmonth (1-31), month (1-12, Jan-Dec), dayofweek (0-7, Sun-Sat), year > Default = * >Sintaxe de atributos > Valor simples: minute= 30 > Lista: month= Jan, Jul, Dec > Faixa de valores: dayofweek= Mon-Fri > Coringa: hour= * > Outros?: minute= */15, dayofmonth= L 12
Invocações Assíncronas >Processamento assíncrono é uma necessidade comum para muitos sistemas > Usualmente evitado pela dificuldade de implementação (JMS é o mecanismo mais comum) > Combinação natural com o modelo de componentes EJB 3 > Métodos assíncrono podem ter tipo de retorno void ou java.util.concurrent.future<v> > Future<V> permite controle refinado, como resultado de processamento, tratamento de exceções e cancelamento do processamento 13
Session Bean Assíncrono @Stateless public class OrderBillingBean { @Asynchronous public Future<BillingStatus> billorder(order order) { try { bill(order); return new AsyncResult<BillingStatus>( BillingStatus.COMPLETE); catch (BillingException be) { return new AsyncResult<BilllingStatus>( BillingStatus.BILLING_FAILED); 14
Invocação Cliente Assíncrona @EJB private OrderBillingBean orderbilling; Order order = new Order(); Future<BillingStatus> future = orderbilling.billorder(order); BillingStatus status = future.get(); if (status == BillingStatus.COMPLETE) { notifybillingsuccess(order); else if (status == BillingStatus.BILLING_FAILED) { notifybillingfailure(order); 15
Session Bean Assíncrono com Cancelamento @Stateless public class OrderBillingBean { @Resource private SessionContext context; @Asynchronous public Future<BillingStatus> billorders( List<Order> orders) { for (Order order: orders) { if (!context.iscancelled()) { bill(order); 16
Invocação Assíncrona com Cancelamento @EJB private OrderBillingBean orderbilling; Future<BillingStatus> future = orderbilling.billorders(orders); future.cancel(true); 17
Empacotamento WAR Simplificado > As regras de modularização determinadas pelo empacotamento Java EE tradicional podem ser excessivas, especialmente para aplicações web de porte pequeno/médio > Empacotamento simplificado permitem o posicionamento de componentes EJB diretamente no WAR em vez de num EJB-JAR separado. > Funcionalidade total de EJB continua disponível > Já existente em muitos containers EJB embutidos como OpenEJB ou Embedded JBoss que podem ser utilizados com Tomcat 18
Empacotamento Java EE 5 19
EJB 3.1: Empacotamento WAR Simplificado 20
EJB 3.1 Java SE Runtime Support > Deveria ser possível executar componentes EJB fora do container > Especialmente importante para testes de unidade > Separado e aparte do suporte EJB a clientes JavaSE via Application Client Containers, como GlassFish ACC > Já possível via containers embutidos como OpenEJB, Embedded JBoss e EasyBeans 21
EJB 3 Java SE Runtime public class PlaceBidApplication { public static void main(string[] arguments) { Bid bid = new Bid(); PlaceBidBean placebidbean = (PlaceBidBean) new InitialContext().lookup( placebidbean ); placebidbean.placebid(bid); 22
EJB 3 Unit Testing @RunWith(EJB3Runner.class) public class UserBeanTest { @EJB private UserBean userbean; @Test public void getuser() { User user = userbean.getuser( rrahman ); assertnotnull(user); assetequals(user.getfirstname(), Reza ); assetequals(user.getlastname(), Rahman ); 23
Nomes JNDI Globais Padronizados > Uma das últimas questões sérias de portabilidade > mappedname é um começo, mas insuficiente, desde que é dependente de fabricante > Precisa ser endereçado no nível da plataforma JavaEE > Alguns fabricantes estão resistentes, desde que isso requer um escopo global JNDI bem definido, e torna redundantes os mapeamentos manuais via ferramentas de deployment! > Sua ajuda é necessária aqui 24
Nomes JNDI Globais em EJB @Stateless public class PlaceBidBean implements PlaceBid { @PersistenceContext private EntityManager entitymanager; public void placebid(bid bid) { entitymanager.persist(bid); @Remote public interface PlaceBid { public void placebid (Bid bid); action-bazaar.ear ------> action-bazaar-ejb.jar ------> PlaceBidBean.java PlaceBid.java 25
Nomes JNDI Globais em EJB @EJB(mappedName=?) private PlaceBid placebid; PlaceBid placebid = (PlaceBid) new InitialContext().lookup(?); nome JNDI global no JBoss nome JNDI global no GlassFish nome JNDI global no WebSphere CE nome JNDI global padronizado action-bazaar/placebidbean/remote PlaceBid action-bazaar-ejb/placebidbean/placebid action-bazaar/action-bazaar-ejb/placebidbean/placebid 26
EJB Lite > Funcionalidades completas de EJB, como acesso remoto e messageria, podem ser desnecessárias em vários ambientes > Permite um caminho de upgrade suave, quando necessário > Torna possível criar um container sem implementar funcionalidades legadas do EJB 2.x, como interfaces home, RMI-IIOP suporte a Entity Beans > Talvez um container construído sobre o Spring e levando o projeto PitchFork ao próximo nivel? > Torna possível criar containers EJB 3.1 modulares 27
Features EJB Lite Feature Stateless beans Stateful beans Singleton beans Message driven beans No interfaces Local interfaces Remote interfaces Web service interfaces Asynchronous invocation Interceptors Declarative security Declarative transactions Programmatic transactions Timer service EJB 2.x support CORBA interoperability 28 EJB Lite EJB
Summary > Continua o caminho da simplicidade sem sacrificar o poder > Interfaces opcionais para Session Bean > Empacotamento WAR simplificado > Nomes JNDI globais padronizados > EJB Lite > Mais serviços de container > Singleton Beans com controle de concorrência > Timers declarativos e programáticos estilo Cron > Invocação assíncrona de EJBs > Suporte em runtime para Java SE > WebBeans > Integração mais próxima com JSF > Injeção de Dependência type-safe, orientada a anotações > Melhorias nos interceptadores > JPA 2 > Constraints API > Criteria API 29
Referências New Features in EJB 3.1, http://www.theserverside.com/tt/articles/article.tss?l=newfeaturesinejb3-1 New Features in EJB 3.1 - Part 2, http://www.theserverside.com/tt/articles/article.tss?l=newfeaturesejb31 New Features in EJB 3.1 - Part 3, http://www.theserverside.com/tt/articles/article.tss?l=newfeaturesejb31-3 New Features in EJB 3.1 Part 4, http://www.theserverside.com/tt/articles/article.tss?l=newfeaturesinejb3-part4 JSR 316: Java EE 6, http://jcp.org/en/jsr/detail?id=316 Envie comentários para: jsr-316-comments@jcp.org JSR 318: Enterprise JavaBeans 3.1, http://jcp.org/en/jsr/detail?id=318 Envie comentários para : jsr-318-comments@jcp.org JSR 299: Web Beans, http://jcp.org/en/jsr/detail?id=299 Envie comentários para : jsr-299-comments@jcp.org 30