SlideShare uma empresa Scribd logo
1 de 59
Baixar para ler offline
1   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
As novidades do
Java Message Service 2.0
Bruno Borges
Java EE Evangelist, Product Manager




2   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
The following is intended to outline our general product direction. It is intended
        for information purposes only, and may not be incorporated into any contract.
        It is not a commitment to deliver any material, code, or functionality, and should
        not be relied upon in making purchasing decisions. The development, release,
        and timing of any features or functionality described for Oracle’s products
        remains at the sole discretion of Oracle.




3   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMS


           API java para enviar e receber mensagens
           Diversas implementações no mercado
           Duas variações distintas
                    – Aplicações Java SE
                    – Aplicações Java EE (web, EJB, client)
                                  suporta JTA e MDBs
                                  remove funcionalidades consideradas inapropriadas em um ambiente
                                      de servidor de aplicação gerenciado


4   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
O que o JMS é e não é


           Uma API padronizada
                    – Não é um sistema de mensagens pronto para ser utilizado
                    – Não é um protocolo de comunicação
           Define somente uma API Java
                    – Não define uma API para clientes de outras linguagens (C++, HTTP, C#,
                            etc)
           Uma API para aplicações
                    – Não é (ainda) uma API para administrar, gerenciar ou monitorar



5   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMS 2.0


           JMS 1.1: última atualização em 2002
           JMS 2.0 proposto em 2011 pela JSR 343
                    – EG possui 20 membros:
                                  FuseSource, IBM, Oracle, Pramati, Red Hat, TIBCO
                    – Public Review aprovado em 18 de Fevereiro de 2013
                                  20 a favor, 4 abstenções
                    – Participação do SouJava
                    – Será lançado como parte do Java EE 7


6   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
 Simplicidade e facilidade de uso
                                                                            Novas funcionalidades de mensageria
Objetivos
                                                                            Melhor integração com o Java EE
JMS 2.0
                                                                             – API c/ maior clareza de acordo com a
                                                                               especificação
                                                                             – Configuração simplificada de recursos
                                                                             – Padronização de configuração de MDBs
                                                                             – Melhor plugabilidade entre servidores de aplicação

                                                                            Pequenas correções
                                                                            Cloud / PaaS postergadas p/ Java EE 8

7   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMS 2.0:
        Simplificação da API




8   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Qual o problema da versão
        1.1 da API?




9   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMS 1.1: Enviando uma mensagem
@Resource(lookup = "java:global/jms/demoConnectionFactory")
ConnectionFactory connectionFactory;

@Resource(lookup = "java:global/jms/demoQueue")
Queue demoQueue;

public void sendMessage(String payload) {
   try {
      Connection connection = connectionFactory.createConnection();
      try {
         Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
         MessageProducer messageProducer = session.createProducer(demoQueue);
         TextMessage textMessage = session.createTextMessage(payload);
         messageProducer.send(textMessage);                                 13 linhas
      } finally {                                                           de código
         connection.close();
                                                                            pra enviar
      }
   } catch (JMSException ex) {                                              1 msg
      Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
   }
}

10   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Simplificação da JMS 1.1 API
         Estratégia


            Simplificar a API 1.1 existente sem quebrar compatibilidade
            Definir a nova API de forma mais simplificada exigindo poucos objetos
                     – JMSContext, JMSProducer, JMSConsumer
            No Java EE, permitir que o JMSContext seja injetado e gerenciado
                pelo container




16   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Simplificação da JMS 1.1 API
         API mais simples para criar uma Session


            Precisa manter compatibilidade e limitar escopo de mudanças
            Novos métodos javax.jms.Connection para criar Session:
                     – Método atual (será mantido)
                        connection.createSession(transacted,deliveryMode)
                     – Novo método (para usar em ambiente Java SE)
                        connection.createSession(sessionMode)
                     – Novo método (para usar em ambiente Java EE)
                                 connection.createSession()


17   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Simplificação da JMS 1.1 API
         API mais simples para criar uma Session

            connection.createSession(transacted,sessionMode)
            Java EE
                     – com JTA: argumentos são ignorados. Sessão participa da tx
                     – sem JTA: ‘transacted’ é ignorado, sempre local-tx.
                             ‘sessionMode’ é propcessado (AUTO_ACK ou DUPS_OK)
            Java SE
                     – ‘transacted’ = true: sessão usa local-tx. ‘sessionMode’ é ignorado
                     – ‘transacted’ = false: sessão non-tx. ‘sessionMode’ será lido e interpretado
                             de acordo com a documentação


18   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Simplificação da JMS 1.1 API
         API mais simples para criar uma Session

            connection.createSession(sessionMode)
            Java EE
                     – com JTA: ‘sessionMode’ é ignorado
                     – sem JTA: sessão non-tx. ‘sessionMode’ = AUTO ou DUPS_OK
            Java SE
                     – ‘sessionMode’ = SESSION_TRANSACTED: possui local-tx
                     – ‘sessionMode’ = CLIENT, AUTO, DUPS_OK: non-tx, mensagens será ACK
                             pelo modo definido.




19   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Simplificação da JMS 1.1 API
         API simplificada para criar uma Session

            connection.createSession()
            Java EE
                     – com JTA: participate da TX
                     – sem JTA: sessão non-tx. AUTO_ACK é usado
            Java SE
                     – Sessão non-tx. AUTO_ACK é usado




20   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Simplificação da JMS 1.1 API
         API simplificada para fechar os objetos JMS


            Definir objetos JMS como java.jang.AutoCloseable
                     – Connection
                     – Session
                     – MessageProducer
                     – MessageConsumer
                     – QueueBrowser

            Requer Java SE 7




21   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Simplificação da JMS 1.1 API
         API simplificada para fechar os objetos JMS
           @Resource(lookup = "jms/connFactory")        Fecha recursos
           ConnectionFactory cf;
            Make JMS objects implement java.jang.AutoCloseable
                                                        dentro do bloco
           @Resource(lookup="jms/inboundQueue")         try-with-resources
              – Connection, Session, MessageProducer, MessageConsumer,
           Destination dest;
                             QueueBrowser
           public void sendMessage (String payload) throws JMSException {
              try ( Connection conn = connectionFactory.createConnection();
                    Session session = conn.createSession();
                    MessageProducer producer = session.createProducer(dest);
              ){
                 Message mess = sess.createTextMessage(payload);
                 producer.send(mess);                               close() é chamado
              } catch(JMSException e){                              automaticamente
                 // exception handling                              no final do bloco
              }
           }
22   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Nova API simplificada para o JMS 2.0
         Introdução ao JMSContext e JMSProducer

           @Resource(lookup = "java:global/jms/demoConnectionFactory")
           ConnectionFactory connectionFactory;

           @Resource(lookup = "java:global/jms/demoQueue")                   13 linhas
           Queue demoQueue;                                                  reduzido
                                                                             para 5
           public void sendMessageNew(String payload) {
              try (JMSContext context = connectionFactory.createContext();){
                 context.createProducer().send(demoQueue, payload);
              } catch (JMSRuntimeException ex) {
                 Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
              }
           }



23   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMSContext (1/2)

            Novo objeto que encapsula Connection, Session e MessageProducer


            Criado através de um ConnectionFactory
            JMSContext context = connectionFactory.createContext(sessionMode);

            Chamar close() depois de usar, ou colocar em um bloco try-with-
             resources
            Pode ser injetado (numa aplicação EJB ou Java EE Web)




25   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMSContext (2/2)

            Pode ser criado a partir de outro JMSContext
                (para reutilizar conexão – Java SE somente)
            JMSContext context2 = context1.createContext(sessionMode);


            Usado para criar objetos JMSProducer
            Usado para criar JMSConsumer
            Métodos do JMSContext, JMSProducer e JMSConsumer só disparam
                unchecked exceptions



26   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMSProducer

            JMS 1.1
               MessageProducer producer = session.createProducer();
               producer.send(destination,message);


            JMS 2.0
               JMSProducer producer = context.createProducer();
               producer.send(destination,message);




27   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMSProducer
         Configuração de delivery com Fluent API ou method chaining


            JMS 1.1

             MessageProducer producer = session.createProducer();
             producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
             producer.setPriority(1);
             producer.setTimeToLive(1000);
             producer.send(destination,message);


            JMS 2.0

           context.createProducer().setDeliveryMode(DeliveryMode.NON_PERSISTENT).
              setPriority(1).setTimeToLive(1000).send(destination,message);


28   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMSProducer
         Configuração de headers e propriedades de mensagens


            JMS 1.1

        MessageProducer producer = session.createProducer();
        TextMessage textMessage = session.createTextMessage("Hello);
        textMessage.setStringProperty("foo","bar");
        producer.send(destination,message);



            JMS 2.0

        context.createProducer().setProperty("foo","bar").send(destination,"Hello");



29   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMSProducer
         Envio de mensagens diretas


            Métodos do JMSProducer para enviar a Message
                     – send(Destination dest, Message message)
            Não precisa criar um Message
                     – send(Destination dest, Map<String,Object> payload)
                     – send(Destination dest, Serializable payload)
                     – send(Destination dest, String payload)
                     – send(Destination dest, byte[] payload)




30   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMSConsumer

            Mensagens são consumidas criando um objeto JMSConsumer
                     – Encapsula um MessageConsumer
                     – Funcionalidade e API similar do MessageConsumer
            Synchronous
            JMSConsumer consumer = context.createConsumer(destination);
            Message message = consumer.receive(1000);


            Asynchronous
           JMSConsumer consumer = context.createConsumer(destination);
           consumer.setMessageListener(messageListener);


            Connection is automatically started (configurable)
31   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMSConsumer
         Recebendo conteúdo de mensagens diretamente


            Métodos do JMSConsumer que retornam a Message
                     – Message receive();
                     – Message receive(long timeout);
                     – Message receiveNoWait();

            Métodos do JMSConsumer que retornam o conteúdo da mensagem
                diretamente
                     – <T> T receivePayload(Class<T>                        c);
                     – <T> T receivePayload(Class<T> c, long timeout);
                     – <T> T receivePayloadNoWait(Class<T> c);

32   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMSConsumer
         Recebendo conteúdo de mensagens diretamente


            public String receiveMessage() throws NamingException {
               InitialContext initialContext = getInitialContext();
               ConnectionFactory connectionFactory =
                  (ConnectionFactory) initialContext.lookup("jms/connectionFactory");
               Queue inboundQueue = (Queue)initialContext.lookup("jms/inboundQueue");

                      try (JMSContext context = connectionFactory.createContext();) {
                         JMSConsumer consumer = context.createConsumer(inboundQueue);
                         return consumer.receivePayload(String.class);
                      }
            }




33   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Injeção de objetos JMSContext
         Em um container EJB ou Java EE Web


           @Inject
           @JMSConnectionFactory("jms/connectionFactory")
           private JMSContext context;

           @Resource(mappedName = "jms/inboundQueue")
           private Queue inboundQueue;

           public void sendMessage (String payload) {
              context.createProducer().send(inboundQueue, payload);
           }




34   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Injeção de objetos JMSContext
         Em um container EJB ou Java EE Web
                                                                                                Use @Inject
                                                                                                para injetar o
           @Inject                                                                              JMSContext,
           @JMSConnectionFactory("jms/connectionFactory")                                       especificando
           private JMSContext context;                                                          connection
                                                                                                factory
           @Resource(mappedName = "jms/inboundQueue")
           private Queue inboundQueue;

           public void sendMessage (String payload) {
              context.createProducer().send(inboundQueue, payload);
           }

                                                                            Container se
                                                                            responsabiliza em
                                                                            fechar o objeto

35   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Injeção de objetos JMSContext
         Em um container EJB ou Java EE Web

            Connection factory padrão do container
            @Inject private JMSContext context;

            Com definição de Session Mode
            @Inject
            @JMSConnectionFactory("jms/connectionFactory")
            @JMSSessionMode(JMSContext.AUTO_ACKNOWLEDGE)
            private JMSContext context;

            Com definição de user e password
           @Inject
           @JMSConnectionFactory("jms/connectionFactory")
           @JMSPasswordCredential(userName="admin",password="mypassword")
           private JMSContext context;
36   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Injeção de objetos JMSContext
         Em um container EJB ou Java EE Web


            Objetos JMSContext injetados possuem escopo
                     – Com JTA transaction, escopo é a transação
                     – Sem JTA transaction, escopo é o request
            JMSContext é automaticamente fechado quando o escopo termina
            Injete dois objetos JMSContext com mesmo escopo e terá o mesmo
                objeto
                     – se valores de @JMSConnectionFactory, @JMSPasswordCredential e
                             @JMSSessionMode são idênticos
                     – Torna mais fácil usar a mesma sessão dentro de uma transação

37   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
JMS 2.0:
         Novas features da API




38   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Mais fácil criar Durable Subscribers


            Durable subscriptions são identificados por
             {clientId, subscriptionName}
            ClientId não é mais obrigatório quando usar durable subscriptions
            Para MDBs, o container vai gerar um nome padrão (EJB 3.2)




39   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Delivery delay

            Permite um cliente JMS agendar entrega futura de mensagem
            Novo método no MessageProducer
             public void setDeliveryDelay(long deliveryDelay)

            Novo método no JMSProducer

             public JMSProducer setDeliveryDelay(long deliveryDelay)


            Configure tempo minimo em ms para quem uma mensagem deve ser
                retida no sistema até ser enviada


40   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Envio Assíncrono

            Envia uma mensagem e retorna imediatamente sem bloquear até o
             ACK de que foi recebida pelo servidor
            Uso de callback quando tiver o ACK do servidor
            Novo método do MessageProducer


             messageProducer.send(message,completionListener)

            Disponível também no JMSProducer



41   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Envio Assíncrono


            Aplicação define um CompletionListener

             public interface CompletionListener {
                void onCompletion(Message message);
                void onException(Message message, Exception exception);
             }




42   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Melhor tratamento de mensagens ruins
         Torna a propriedade JMSMXDeliveryCount obrigatória


            JMS 1.1 define uma propriedade de mensagem opcional
                JMSXDeliveryCount.
                     – Quando usado, é setado pelo provedor JMS quando a mensagem é
                             recebida, e indica o número de vezes que esta mensagem foi entrege
                             (incluindo a primeira vez).
            JMS 2.0 torna esta propriedade obrigatória pelas implementações




43   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Múltiplos consumidores numa subscrição de
         tópico
            Permite consumo escalável de mensagems a partir de um Topic
                Subscription
                     – Múltiplas threads, multiplas JVMs
            Novos métodos para non-durable subscriptions
             MessageConsumer messageConsumer=
                session.createSharedConsumer(topic,sharedSubscriptionName);


            Métodos existentes para durable subscriptions
             MessageConsumer messageConsumer=
                session.createDurableConsumer(topic,durableSubscriptionName);


            Disponível também no JMSContext
44   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Definição de recursos JMS
         simplificada no Java EE




         Em conjunto com
         JSR 342 (Java EE 7 platform)

45   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Definição de recursos JMS simplificada no Java
         EE
        O problema

            Java EE e JMS recomenda que aplicações devem obter o
                ConnectionFactory e a Destination via JNDI
           @Resource(lookupName = "jms/inboundQueue")
           private Queue inboundQueue;

            Mantém o código portável
            Criar estes recursos é um incômodo para os desenvolvedores




46   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Connection Factory default na plataforma
         Simplifica o uso de JMS na maioria dos casos


            Se você quiser somente usar o serviço JMS do servidor de aplicação


           @Resource(lookup="java:comp/defaultJMSConnectionFactory")
           ConnectionFactory myJMScf;




47   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Definição de recursos JMS simplificada no Java EE
          Funções novas e opcionais no Java EE 7


            Aplicação pode especificar os JMS connection factories e JMS
             destinations que precisa via anotações
            Deployer pode então definir requerimentos com os deployment
             descriptors
            Servidor de aplicação pode usar esta informação para criar
             automaticamente os recursos quando a aplicação for instalada
            Equivalente às anotações referentes a @DataSourceDefinition
            É opcional suportar estes recursos


48   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Definição de recursos JMS simplificada no Java EE
         Uso de anotações para definir recursos


            @JMSConnectionFactoryDefinition(
                name="java:global/jms/demoConnectionFactory",
                className= "javax.jms.ConnectionFactory",
                description="ConnectionFactory to use in demonstration")


            @JMSDestinationDefinition(
                name = "java:global/jms/demoQueue",
                description = "Queue to use in demonstration",
                className = "javax.jms.Queue",
                destinationName="demoQueue")




49   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Definição de recursos JMS simplificada no Java EE
         Deployer configura informações específicas posteriormente
            <jms-destination>
               <name>"java:global/jms/demoQueue</name>
               <class-name>javax.jms.Queue</class-name>
               <resource-adapter-name>jmsra</resource-adapter-name>
               <destination-name>demoQueue</destination-name>
            </jms-destination>

             <jms-connection-factory>
               <name>java:global/jms/demoConnectionFactory</name>           Pode definir
               <property>                                                   propriedades
                  <name>addressList</name>                                  específicas
                  <value>mq://localhost:7676</value>                        do provedor
                                                                            JMS
               </property>
               <max-pool-size>30</max-pool-size>
               <min-pool-size>20</min-pool-size>
               <max-idle-time>5</max-idle-time>
            </jms-connection-factory>
50   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Configuração padronizada
         de MDBs



         Em conjunto com
         JSR 345 (EJB 3.2)



51   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Configuração padronizada de MDBs


            Configuração de MDBs não é padronizada
            EJB 3.1 não define como especificar
                     – Nome JNDI da queue or topic (usando annotation)
                     – Nome JNDI da connection factory
                     – clientID
                     – durableSubscriptionName
            EJB 3.1 não define como que mensagens de tópicos devem ser
                entregues para MDBs clusterizados


52   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Configuração padronizada de MDBs
         Novas propriedades de ativação para Queue ou Topic

            @MessageDriven(activationConfig = {
               @ActivationConfigProperty(
                  propertyName = "destinationLookup",
                  propertyValue = "jms/myTopic"),
               . . .
            })


            Também pode ser definido no ejb-jar.xml




53   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Configuração padronizada de MDBs
         Novas propriedades de ativação para Queue ou Topic

            @MessageDriven(activationConfig = {
               @ActivationConfigProperty(
                  propertyName = "connectionFactoryLookup",
                  propertyValue = "jms/myCF"),
               . . .
            })


            Também pode ser definido no ejb-jar.xml




54   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Configuração padronizada de MDBs
         Novas propriedades de ativação para Queue ou Topic

            @MessageDriven(activationConfig = {
               @ActivationConfigProperty(
                  propertyName = "subscriptionDurability",
                  propertyValue = "Durable"),
               @ActivationConfigProperty(
                  propertyName = "clientId",
                  propertyValue = "myClientID"),
               @ActivationConfigProperty(
                  propertyName = "subscriptionName",
                  propertyValue = "MySub"),
               . . .
            })


            Estas propriedades nunca tinham sido padronizadas

55   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Topic delivery para MDBs em cluster
         Uma mensagem por instância ou uma por cluster?

                                                                                        Topic



                                                                                                  ?
                     MDB                MDB                MDB                    MDB     MDB     MDB           MDB     MDB     MDB




         Application server instance                                         Application server instance   Application server instance


                                                                            Application server cluster
57   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Topic delivery para MDBs em cluster


            Se subscriptionName e clientId não estão definidos
                     – cada mensagem será entregue uma vez, por cluster
                     – instâncias do cluster compartilharão o mesmo nome de subscrição
            Para desligar configure sharedSubscriptions para false
                     – cada mensagem será entregue uma por instância de MDB
                     – cada instância do servidor de aplicação terá uma subscription separada
            Aplica-se a durable e non-durable subscriptions



58   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Melhor plugabilidade com
         Java EE




59   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Melhor plugabilidade com Java EE


            Objetivo
                     – Facilitar o uso de um provedor JMS em outros servidores de aplicação
                     – e.g. aplicação GlassFish enviando mensagens para o WebLogic JMS
            Solução
                     – Obrigar provedores JMS a oferecer um adaptador JCA




60   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Melhor plugabilidade com Java EE
         usando a especificação Java Connector Architecture (JCA)


            Java Connector Architecture é desenhado para:
                     – Integrar recursos transacionais com o servidor de aplicação
                     – processamento assíncrono de MDBs
            Suporte ao JCA é obrigatório no Java EE
            Muitos vendors de JMS vendors já oferecem adaptadores
            JMS 2.0 obriga o provisionamento de adaptador JCA
            Deve ser transparente para as aplicações!



61   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
 Simplicidade e facilidade de uso
                                                                             Novas features
Novidades                                                                     – multi-threaded Topic Subscribers
do JMS 2.0                                                                    – delivery delay
                                                                              – envio async

                                                                             Melhor integração com Java EE
                                                                              – configuração de recursos simplificada
                                                                              – Padronização na configuração de MDBs
                                                                              – melhor plugabilidade entre servidores de aplicação

                                                                             Muitas outras melhorias e correções

62   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Experimente o Java EE 7
         JMS 2.0, EJB 3.2 and Java EE


            GlassFish 4.0
                     – http://glassfish.java.net/
                     – http://dlc.sun.com.edgesuite.net/glassfish/4.0/promoted/
            Open Message Queue 5.0
                     – http://mq.java.net/
                     – http://mq.java.net/5.0.html




64   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Perguntas?




65   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Graphic Section Divider




66   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
67   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.

Mais conteúdo relacionado

Mais procurados

Maratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBMaratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBDextra
 
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
 
Bancos de dados e jdbc java para desenvolvimento web
Bancos de dados e jdbc   java para desenvolvimento webBancos de dados e jdbc   java para desenvolvimento web
Bancos de dados e jdbc java para desenvolvimento websilvio_sas
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
Anatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesAnatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesRafael Ponte
 
Java OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMIJava OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMIYitzhak Stone
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Adriano Teixeira de Souza
 
Trabalho teorico de Linguagem de Programação
Trabalho teorico de Linguagem de ProgramaçãoTrabalho teorico de Linguagem de Programação
Trabalho teorico de Linguagem de Programaçãocarlosveiga
 
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
 
JavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em DesenvolvimentoJavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em DesenvolvimentoEduardo Bregaida
 
CON22150 - The Future of JVM Performance Tuning
CON22150 - The Future of JVM Performance TuningCON22150 - The Future of JVM Performance Tuning
CON22150 - The Future of JVM Performance TuningRicardo Ferreira
 

Mais procurados (20)

Maratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBMaratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESB
 
Java Web 1 Introducao
Java Web 1 IntroducaoJava Web 1 Introducao
Java Web 1 Introducao
 
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
 
Bancos de dados e jdbc java para desenvolvimento web
Bancos de dados e jdbc   java para desenvolvimento webBancos de dados e jdbc   java para desenvolvimento web
Bancos de dados e jdbc java para desenvolvimento web
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Apresentação JSF
Apresentação JSFApresentação JSF
Apresentação JSF
 
Flisolgo2010
Flisolgo2010Flisolgo2010
Flisolgo2010
 
Tutorial +login+mvc
Tutorial +login+mvcTutorial +login+mvc
Tutorial +login+mvc
 
Introdução a jsf
Introdução a jsfIntrodução a jsf
Introdução a jsf
 
Anatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer FacesAnatomia do JSF, JavaServer Faces
Anatomia do JSF, JavaServer Faces
 
Java OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMIJava OO Middleware - JEE / EJB / RMI
Java OO Middleware - JEE / EJB / RMI
 
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
Sistemas Distribuídos - Comunicação Distribuída - EJB (JBoss 7)
 
Serra StarTec 2013 - Java EE
Serra StarTec 2013 - Java EESerra StarTec 2013 - Java EE
Serra StarTec 2013 - Java EE
 
Aula1
Aula1Aula1
Aula1
 
Trabalho teorico de Linguagem de Programação
Trabalho teorico de Linguagem de ProgramaçãoTrabalho teorico de Linguagem de Programação
Trabalho teorico de Linguagem de Programação
 
Workshop05
Workshop05Workshop05
Workshop05
 
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
 
JavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em DesenvolvimentoJavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em Desenvolvimento
 
ServiceMix e CXF
ServiceMix e CXFServiceMix e CXF
ServiceMix e CXF
 
CON22150 - The Future of JVM Performance Tuning
CON22150 - The Future of JVM Performance TuningCON22150 - The Future of JVM Performance Tuning
CON22150 - The Future of JVM Performance Tuning
 

Semelhante a JMS 2.0: Simplificação da API

GlassFish, Maven, Cloud e o futuro do Java EE
GlassFish, Maven, Cloud e o futuro do Java EEGlassFish, Maven, Cloud e o futuro do Java EE
GlassFish, Maven, Cloud e o futuro do Java EEBruno Borges
 
JSP - Java Serves Pages
JSP - Java Serves PagesJSP - Java Serves Pages
JSP - Java Serves PagesAmanda Luz
 
Repensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeRepensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeAdriano Tavares
 
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO, Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO, Vinicius Pulgatti
 
Como Sobreviver Com Java2
Como Sobreviver Com Java2Como Sobreviver Com Java2
Como Sobreviver Com Java2Saulo Arruda
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebElenilson Vieira
 
Introdução a Plataforma Java EE
Introdução a Plataforma Java EEIntrodução a Plataforma Java EE
Introdução a Plataforma Java EEEder Magalhães
 
Curso de Java (Parte 5)
Curso de Java (Parte 5)Curso de Java (Parte 5)
Curso de Java (Parte 5)Mario Sergio
 
MySQL + Java - Manuel Contreras
MySQL + Java - Manuel ContrerasMySQL + Java - Manuel Contreras
MySQL + Java - Manuel ContrerasMySQL Brasil
 
TDC2012 - Implementando aplicativos Web com JSF, CDI e JPA
TDC2012 - Implementando aplicativos Web com JSF, CDI e JPA  TDC2012 - Implementando aplicativos Web com JSF, CDI e JPA
TDC2012 - Implementando aplicativos Web com JSF, CDI e JPA Rodrigo Cândido da Silva
 
Java EE no ambiente corporativo: primeiros passos WebLogic 12c
Java EE no ambiente corporativo: primeiros passos WebLogic 12cJava EE no ambiente corporativo: primeiros passos WebLogic 12c
Java EE no ambiente corporativo: primeiros passos WebLogic 12cBruno Borges
 

Semelhante a JMS 2.0: Simplificação da API (20)

JUDCon Brazil 2013
JUDCon Brazil 2013JUDCon Brazil 2013
JUDCon Brazil 2013
 
GlassFish, Maven, Cloud e o futuro do Java EE
GlassFish, Maven, Cloud e o futuro do Java EEGlassFish, Maven, Cloud e o futuro do Java EE
GlassFish, Maven, Cloud e o futuro do Java EE
 
JSP - Java Serves Pages
JSP - Java Serves PagesJSP - Java Serves Pages
JSP - Java Serves Pages
 
GUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EEGUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EE
 
Repensando padrões e boas práticas java ee
Repensando padrões e boas práticas java eeRepensando padrões e boas práticas java ee
Repensando padrões e boas práticas java ee
 
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO, Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
 
Curso jsf
Curso jsfCurso jsf
Curso jsf
 
GUJavaSC - Java EE 7 In Action
GUJavaSC - Java EE 7 In ActionGUJavaSC - Java EE 7 In Action
GUJavaSC - Java EE 7 In Action
 
Tutorial Java EE
Tutorial Java EETutorial Java EE
Tutorial Java EE
 
Como Sobreviver Com Java2
Como Sobreviver Com Java2Como Sobreviver Com Java2
Como Sobreviver Com Java2
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
MC - Java Enterprise Edition 6 (Java EE)
MC - Java Enterprise Edition 6 (Java EE)MC - Java Enterprise Edition 6 (Java EE)
MC - Java Enterprise Edition 6 (Java EE)
 
Introdução a Plataforma Java EE
Introdução a Plataforma Java EEIntrodução a Plataforma Java EE
Introdução a Plataforma Java EE
 
Curso de Java (Parte 5)
Curso de Java (Parte 5)Curso de Java (Parte 5)
Curso de Java (Parte 5)
 
MySQL + Java - Manuel Contreras
MySQL + Java - Manuel ContrerasMySQL + Java - Manuel Contreras
MySQL + Java - Manuel Contreras
 
TDC2012 - Implementando aplicativos Web com JSF, CDI e JPA
TDC2012 - Implementando aplicativos Web com JSF, CDI e JPA  TDC2012 - Implementando aplicativos Web com JSF, CDI e JPA
TDC2012 - Implementando aplicativos Web com JSF, CDI e JPA
 
Apache e Java
Apache e JavaApache e Java
Apache e Java
 
Java EE no ambiente corporativo: primeiros passos WebLogic 12c
Java EE no ambiente corporativo: primeiros passos WebLogic 12cJava EE no ambiente corporativo: primeiros passos WebLogic 12c
Java EE no ambiente corporativo: primeiros passos WebLogic 12c
 
Java ee 5
Java ee 5Java ee 5
Java ee 5
 
Javaone2010
Javaone2010Javaone2010
Javaone2010
 

Mais de Bruno Borges

Secrets of Performance Tuning Java on Kubernetes
Secrets of Performance Tuning Java on KubernetesSecrets of Performance Tuning Java on Kubernetes
Secrets of Performance Tuning Java on KubernetesBruno Borges
 
[Outdated] Secrets of Performance Tuning Java on Kubernetes
[Outdated] Secrets of Performance Tuning Java on Kubernetes[Outdated] Secrets of Performance Tuning Java on Kubernetes
[Outdated] Secrets of Performance Tuning Java on KubernetesBruno Borges
 
From GitHub Source to GitHub Release: Free CICD Pipelines For JavaFX Apps
From GitHub Source to GitHub Release: Free CICD Pipelines For JavaFX AppsFrom GitHub Source to GitHub Release: Free CICD Pipelines For JavaFX Apps
From GitHub Source to GitHub Release: Free CICD Pipelines For JavaFX AppsBruno Borges
 
Making Sense of Serverless Computing
Making Sense of Serverless ComputingMaking Sense of Serverless Computing
Making Sense of Serverless ComputingBruno Borges
 
Visual Studio Code for Java and Spring Developers
Visual Studio Code for Java and Spring DevelopersVisual Studio Code for Java and Spring Developers
Visual Studio Code for Java and Spring DevelopersBruno Borges
 
Taking Spring Apps for a Spin on Microsoft Azure Cloud
Taking Spring Apps for a Spin on Microsoft Azure CloudTaking Spring Apps for a Spin on Microsoft Azure Cloud
Taking Spring Apps for a Spin on Microsoft Azure CloudBruno Borges
 
A Look Back at Enterprise Integration Patterns and Their Use into Today's Ser...
A Look Back at Enterprise Integration Patterns and Their Use into Today's Ser...A Look Back at Enterprise Integration Patterns and Their Use into Today's Ser...
A Look Back at Enterprise Integration Patterns and Their Use into Today's Ser...Bruno Borges
 
Melhore o Desenvolvimento do Time com DevOps na Nuvem
Melhore o Desenvolvimento do Time com DevOps na NuvemMelhore o Desenvolvimento do Time com DevOps na Nuvem
Melhore o Desenvolvimento do Time com DevOps na NuvemBruno Borges
 
Tecnologias Oracle em Docker Containers On-premise e na Nuvem
Tecnologias Oracle em Docker Containers On-premise e na NuvemTecnologias Oracle em Docker Containers On-premise e na Nuvem
Tecnologias Oracle em Docker Containers On-premise e na NuvemBruno Borges
 
Java EE Arquillian Testing with Docker & The Cloud
Java EE Arquillian Testing with Docker & The CloudJava EE Arquillian Testing with Docker & The Cloud
Java EE Arquillian Testing with Docker & The CloudBruno Borges
 
Migrating From Applets to Java Desktop Apps in JavaFX
Migrating From Applets to Java Desktop Apps in JavaFXMigrating From Applets to Java Desktop Apps in JavaFX
Migrating From Applets to Java Desktop Apps in JavaFXBruno Borges
 
Servidores de Aplicação: Por quê ainda precisamos deles?
Servidores de Aplicação: Por quê ainda precisamos deles?Servidores de Aplicação: Por quê ainda precisamos deles?
Servidores de Aplicação: Por quê ainda precisamos deles?Bruno Borges
 
Build and Monitor Cloud PaaS with JVM’s Nashorn JavaScripts [CON1859]
Build and Monitor Cloud PaaS with JVM’s Nashorn JavaScripts [CON1859]Build and Monitor Cloud PaaS with JVM’s Nashorn JavaScripts [CON1859]
Build and Monitor Cloud PaaS with JVM’s Nashorn JavaScripts [CON1859]Bruno Borges
 
Cloud Services for Developers: What’s Inside Oracle Cloud for You? [CON1861]
Cloud Services for Developers: What’s Inside Oracle Cloud for You? [CON1861]Cloud Services for Developers: What’s Inside Oracle Cloud for You? [CON1861]
Cloud Services for Developers: What’s Inside Oracle Cloud for You? [CON1861]Bruno Borges
 
Booting Up Spring Apps on Lightweight Cloud Services [CON10258]
Booting Up Spring Apps on Lightweight Cloud Services [CON10258]Booting Up Spring Apps on Lightweight Cloud Services [CON10258]
Booting Up Spring Apps on Lightweight Cloud Services [CON10258]Bruno Borges
 
Java EE Application Servers: Containerized or Multitenant? Both! [CON7506]
Java EE Application Servers: Containerized or Multitenant? Both! [CON7506]Java EE Application Servers: Containerized or Multitenant? Both! [CON7506]
Java EE Application Servers: Containerized or Multitenant? Both! [CON7506]Bruno Borges
 
Running Oracle WebLogic on Docker Containers [BOF7537]
Running Oracle WebLogic on Docker Containers [BOF7537]Running Oracle WebLogic on Docker Containers [BOF7537]
Running Oracle WebLogic on Docker Containers [BOF7537]Bruno Borges
 
Lightweight Java in the Cloud
Lightweight Java in the CloudLightweight Java in the Cloud
Lightweight Java in the CloudBruno Borges
 
Tweet for Beer - Beertap Powered by Java Goes IoT, Cloud, and JavaFX
Tweet for Beer - Beertap Powered by Java Goes IoT, Cloud, and JavaFXTweet for Beer - Beertap Powered by Java Goes IoT, Cloud, and JavaFX
Tweet for Beer - Beertap Powered by Java Goes IoT, Cloud, and JavaFXBruno Borges
 
Integrando Oracle BPM com Java EE e WebSockets
Integrando Oracle BPM com Java EE e WebSocketsIntegrando Oracle BPM com Java EE e WebSockets
Integrando Oracle BPM com Java EE e WebSocketsBruno Borges
 

Mais de Bruno Borges (20)

Secrets of Performance Tuning Java on Kubernetes
Secrets of Performance Tuning Java on KubernetesSecrets of Performance Tuning Java on Kubernetes
Secrets of Performance Tuning Java on Kubernetes
 
[Outdated] Secrets of Performance Tuning Java on Kubernetes
[Outdated] Secrets of Performance Tuning Java on Kubernetes[Outdated] Secrets of Performance Tuning Java on Kubernetes
[Outdated] Secrets of Performance Tuning Java on Kubernetes
 
From GitHub Source to GitHub Release: Free CICD Pipelines For JavaFX Apps
From GitHub Source to GitHub Release: Free CICD Pipelines For JavaFX AppsFrom GitHub Source to GitHub Release: Free CICD Pipelines For JavaFX Apps
From GitHub Source to GitHub Release: Free CICD Pipelines For JavaFX Apps
 
Making Sense of Serverless Computing
Making Sense of Serverless ComputingMaking Sense of Serverless Computing
Making Sense of Serverless Computing
 
Visual Studio Code for Java and Spring Developers
Visual Studio Code for Java and Spring DevelopersVisual Studio Code for Java and Spring Developers
Visual Studio Code for Java and Spring Developers
 
Taking Spring Apps for a Spin on Microsoft Azure Cloud
Taking Spring Apps for a Spin on Microsoft Azure CloudTaking Spring Apps for a Spin on Microsoft Azure Cloud
Taking Spring Apps for a Spin on Microsoft Azure Cloud
 
A Look Back at Enterprise Integration Patterns and Their Use into Today's Ser...
A Look Back at Enterprise Integration Patterns and Their Use into Today's Ser...A Look Back at Enterprise Integration Patterns and Their Use into Today's Ser...
A Look Back at Enterprise Integration Patterns and Their Use into Today's Ser...
 
Melhore o Desenvolvimento do Time com DevOps na Nuvem
Melhore o Desenvolvimento do Time com DevOps na NuvemMelhore o Desenvolvimento do Time com DevOps na Nuvem
Melhore o Desenvolvimento do Time com DevOps na Nuvem
 
Tecnologias Oracle em Docker Containers On-premise e na Nuvem
Tecnologias Oracle em Docker Containers On-premise e na NuvemTecnologias Oracle em Docker Containers On-premise e na Nuvem
Tecnologias Oracle em Docker Containers On-premise e na Nuvem
 
Java EE Arquillian Testing with Docker & The Cloud
Java EE Arquillian Testing with Docker & The CloudJava EE Arquillian Testing with Docker & The Cloud
Java EE Arquillian Testing with Docker & The Cloud
 
Migrating From Applets to Java Desktop Apps in JavaFX
Migrating From Applets to Java Desktop Apps in JavaFXMigrating From Applets to Java Desktop Apps in JavaFX
Migrating From Applets to Java Desktop Apps in JavaFX
 
Servidores de Aplicação: Por quê ainda precisamos deles?
Servidores de Aplicação: Por quê ainda precisamos deles?Servidores de Aplicação: Por quê ainda precisamos deles?
Servidores de Aplicação: Por quê ainda precisamos deles?
 
Build and Monitor Cloud PaaS with JVM’s Nashorn JavaScripts [CON1859]
Build and Monitor Cloud PaaS with JVM’s Nashorn JavaScripts [CON1859]Build and Monitor Cloud PaaS with JVM’s Nashorn JavaScripts [CON1859]
Build and Monitor Cloud PaaS with JVM’s Nashorn JavaScripts [CON1859]
 
Cloud Services for Developers: What’s Inside Oracle Cloud for You? [CON1861]
Cloud Services for Developers: What’s Inside Oracle Cloud for You? [CON1861]Cloud Services for Developers: What’s Inside Oracle Cloud for You? [CON1861]
Cloud Services for Developers: What’s Inside Oracle Cloud for You? [CON1861]
 
Booting Up Spring Apps on Lightweight Cloud Services [CON10258]
Booting Up Spring Apps on Lightweight Cloud Services [CON10258]Booting Up Spring Apps on Lightweight Cloud Services [CON10258]
Booting Up Spring Apps on Lightweight Cloud Services [CON10258]
 
Java EE Application Servers: Containerized or Multitenant? Both! [CON7506]
Java EE Application Servers: Containerized or Multitenant? Both! [CON7506]Java EE Application Servers: Containerized or Multitenant? Both! [CON7506]
Java EE Application Servers: Containerized or Multitenant? Both! [CON7506]
 
Running Oracle WebLogic on Docker Containers [BOF7537]
Running Oracle WebLogic on Docker Containers [BOF7537]Running Oracle WebLogic on Docker Containers [BOF7537]
Running Oracle WebLogic on Docker Containers [BOF7537]
 
Lightweight Java in the Cloud
Lightweight Java in the CloudLightweight Java in the Cloud
Lightweight Java in the Cloud
 
Tweet for Beer - Beertap Powered by Java Goes IoT, Cloud, and JavaFX
Tweet for Beer - Beertap Powered by Java Goes IoT, Cloud, and JavaFXTweet for Beer - Beertap Powered by Java Goes IoT, Cloud, and JavaFX
Tweet for Beer - Beertap Powered by Java Goes IoT, Cloud, and JavaFX
 
Integrando Oracle BPM com Java EE e WebSockets
Integrando Oracle BPM com Java EE e WebSocketsIntegrando Oracle BPM com Java EE e WebSockets
Integrando Oracle BPM com Java EE e WebSockets
 

JMS 2.0: Simplificação da API

  • 1. 1 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 2. As novidades do Java Message Service 2.0 Bruno Borges Java EE Evangelist, Product Manager 2 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 3. The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. 3 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 4. JMS  API java para enviar e receber mensagens  Diversas implementações no mercado  Duas variações distintas – Aplicações Java SE – Aplicações Java EE (web, EJB, client)  suporta JTA e MDBs  remove funcionalidades consideradas inapropriadas em um ambiente de servidor de aplicação gerenciado 4 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 5. O que o JMS é e não é  Uma API padronizada – Não é um sistema de mensagens pronto para ser utilizado – Não é um protocolo de comunicação  Define somente uma API Java – Não define uma API para clientes de outras linguagens (C++, HTTP, C#, etc)  Uma API para aplicações – Não é (ainda) uma API para administrar, gerenciar ou monitorar 5 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 6. JMS 2.0  JMS 1.1: última atualização em 2002  JMS 2.0 proposto em 2011 pela JSR 343 – EG possui 20 membros:  FuseSource, IBM, Oracle, Pramati, Red Hat, TIBCO – Public Review aprovado em 18 de Fevereiro de 2013  20 a favor, 4 abstenções – Participação do SouJava – Será lançado como parte do Java EE 7 6 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 7.  Simplicidade e facilidade de uso  Novas funcionalidades de mensageria Objetivos  Melhor integração com o Java EE JMS 2.0 – API c/ maior clareza de acordo com a especificação – Configuração simplificada de recursos – Padronização de configuração de MDBs – Melhor plugabilidade entre servidores de aplicação  Pequenas correções  Cloud / PaaS postergadas p/ Java EE 8 7 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 8. JMS 2.0: Simplificação da API 8 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 9. Qual o problema da versão 1.1 da API? 9 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 10. JMS 1.1: Enviando uma mensagem @Resource(lookup = "java:global/jms/demoConnectionFactory") ConnectionFactory connectionFactory; @Resource(lookup = "java:global/jms/demoQueue") Queue demoQueue; public void sendMessage(String payload) { try { Connection connection = connectionFactory.createConnection(); try { Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(demoQueue); TextMessage textMessage = session.createTextMessage(payload); messageProducer.send(textMessage); 13 linhas } finally { de código connection.close(); pra enviar } } catch (JMSException ex) { 1 msg Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } 10 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 11. Simplificação da JMS 1.1 API Estratégia  Simplificar a API 1.1 existente sem quebrar compatibilidade  Definir a nova API de forma mais simplificada exigindo poucos objetos – JMSContext, JMSProducer, JMSConsumer  No Java EE, permitir que o JMSContext seja injetado e gerenciado pelo container 16 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 12. Simplificação da JMS 1.1 API API mais simples para criar uma Session  Precisa manter compatibilidade e limitar escopo de mudanças  Novos métodos javax.jms.Connection para criar Session: – Método atual (será mantido) connection.createSession(transacted,deliveryMode) – Novo método (para usar em ambiente Java SE) connection.createSession(sessionMode) – Novo método (para usar em ambiente Java EE) connection.createSession() 17 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 13. Simplificação da JMS 1.1 API API mais simples para criar uma Session connection.createSession(transacted,sessionMode)  Java EE – com JTA: argumentos são ignorados. Sessão participa da tx – sem JTA: ‘transacted’ é ignorado, sempre local-tx. ‘sessionMode’ é propcessado (AUTO_ACK ou DUPS_OK)  Java SE – ‘transacted’ = true: sessão usa local-tx. ‘sessionMode’ é ignorado – ‘transacted’ = false: sessão non-tx. ‘sessionMode’ será lido e interpretado de acordo com a documentação 18 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 14. Simplificação da JMS 1.1 API API mais simples para criar uma Session connection.createSession(sessionMode)  Java EE – com JTA: ‘sessionMode’ é ignorado – sem JTA: sessão non-tx. ‘sessionMode’ = AUTO ou DUPS_OK  Java SE – ‘sessionMode’ = SESSION_TRANSACTED: possui local-tx – ‘sessionMode’ = CLIENT, AUTO, DUPS_OK: non-tx, mensagens será ACK pelo modo definido. 19 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 15. Simplificação da JMS 1.1 API API simplificada para criar uma Session connection.createSession()  Java EE – com JTA: participate da TX – sem JTA: sessão non-tx. AUTO_ACK é usado  Java SE – Sessão non-tx. AUTO_ACK é usado 20 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 16. Simplificação da JMS 1.1 API API simplificada para fechar os objetos JMS  Definir objetos JMS como java.jang.AutoCloseable – Connection – Session – MessageProducer – MessageConsumer – QueueBrowser  Requer Java SE 7 21 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 17. Simplificação da JMS 1.1 API API simplificada para fechar os objetos JMS @Resource(lookup = "jms/connFactory") Fecha recursos ConnectionFactory cf;  Make JMS objects implement java.jang.AutoCloseable dentro do bloco @Resource(lookup="jms/inboundQueue") try-with-resources – Connection, Session, MessageProducer, MessageConsumer, Destination dest; QueueBrowser public void sendMessage (String payload) throws JMSException { try ( Connection conn = connectionFactory.createConnection(); Session session = conn.createSession(); MessageProducer producer = session.createProducer(dest); ){ Message mess = sess.createTextMessage(payload); producer.send(mess); close() é chamado } catch(JMSException e){ automaticamente // exception handling no final do bloco } } 22 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 18. Nova API simplificada para o JMS 2.0 Introdução ao JMSContext e JMSProducer @Resource(lookup = "java:global/jms/demoConnectionFactory") ConnectionFactory connectionFactory; @Resource(lookup = "java:global/jms/demoQueue") 13 linhas Queue demoQueue; reduzido para 5 public void sendMessageNew(String payload) { try (JMSContext context = connectionFactory.createContext();){ context.createProducer().send(demoQueue, payload); } catch (JMSRuntimeException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } } 23 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 19. JMSContext (1/2)  Novo objeto que encapsula Connection, Session e MessageProducer  Criado através de um ConnectionFactory JMSContext context = connectionFactory.createContext(sessionMode);  Chamar close() depois de usar, ou colocar em um bloco try-with- resources  Pode ser injetado (numa aplicação EJB ou Java EE Web) 25 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 20. JMSContext (2/2)  Pode ser criado a partir de outro JMSContext (para reutilizar conexão – Java SE somente) JMSContext context2 = context1.createContext(sessionMode);  Usado para criar objetos JMSProducer  Usado para criar JMSConsumer  Métodos do JMSContext, JMSProducer e JMSConsumer só disparam unchecked exceptions 26 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 21. JMSProducer  JMS 1.1 MessageProducer producer = session.createProducer(); producer.send(destination,message);  JMS 2.0 JMSProducer producer = context.createProducer(); producer.send(destination,message); 27 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 22. JMSProducer Configuração de delivery com Fluent API ou method chaining  JMS 1.1 MessageProducer producer = session.createProducer(); producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); producer.setPriority(1); producer.setTimeToLive(1000); producer.send(destination,message);  JMS 2.0 context.createProducer().setDeliveryMode(DeliveryMode.NON_PERSISTENT). setPriority(1).setTimeToLive(1000).send(destination,message); 28 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 23. JMSProducer Configuração de headers e propriedades de mensagens  JMS 1.1 MessageProducer producer = session.createProducer(); TextMessage textMessage = session.createTextMessage("Hello); textMessage.setStringProperty("foo","bar"); producer.send(destination,message);  JMS 2.0 context.createProducer().setProperty("foo","bar").send(destination,"Hello"); 29 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 24. JMSProducer Envio de mensagens diretas  Métodos do JMSProducer para enviar a Message – send(Destination dest, Message message)  Não precisa criar um Message – send(Destination dest, Map<String,Object> payload) – send(Destination dest, Serializable payload) – send(Destination dest, String payload) – send(Destination dest, byte[] payload) 30 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 25. JMSConsumer  Mensagens são consumidas criando um objeto JMSConsumer – Encapsula um MessageConsumer – Funcionalidade e API similar do MessageConsumer  Synchronous JMSConsumer consumer = context.createConsumer(destination); Message message = consumer.receive(1000);  Asynchronous JMSConsumer consumer = context.createConsumer(destination); consumer.setMessageListener(messageListener);  Connection is automatically started (configurable) 31 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 26. JMSConsumer Recebendo conteúdo de mensagens diretamente  Métodos do JMSConsumer que retornam a Message – Message receive(); – Message receive(long timeout); – Message receiveNoWait();  Métodos do JMSConsumer que retornam o conteúdo da mensagem diretamente – <T> T receivePayload(Class<T> c); – <T> T receivePayload(Class<T> c, long timeout); – <T> T receivePayloadNoWait(Class<T> c); 32 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 27. JMSConsumer Recebendo conteúdo de mensagens diretamente public String receiveMessage() throws NamingException { InitialContext initialContext = getInitialContext(); ConnectionFactory connectionFactory = (ConnectionFactory) initialContext.lookup("jms/connectionFactory"); Queue inboundQueue = (Queue)initialContext.lookup("jms/inboundQueue"); try (JMSContext context = connectionFactory.createContext();) { JMSConsumer consumer = context.createConsumer(inboundQueue); return consumer.receivePayload(String.class); } } 33 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 28. Injeção de objetos JMSContext Em um container EJB ou Java EE Web @Inject @JMSConnectionFactory("jms/connectionFactory") private JMSContext context; @Resource(mappedName = "jms/inboundQueue") private Queue inboundQueue; public void sendMessage (String payload) { context.createProducer().send(inboundQueue, payload); } 34 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 29. Injeção de objetos JMSContext Em um container EJB ou Java EE Web Use @Inject para injetar o @Inject JMSContext, @JMSConnectionFactory("jms/connectionFactory") especificando private JMSContext context; connection factory @Resource(mappedName = "jms/inboundQueue") private Queue inboundQueue; public void sendMessage (String payload) { context.createProducer().send(inboundQueue, payload); } Container se responsabiliza em fechar o objeto 35 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 30. Injeção de objetos JMSContext Em um container EJB ou Java EE Web  Connection factory padrão do container @Inject private JMSContext context;  Com definição de Session Mode @Inject @JMSConnectionFactory("jms/connectionFactory") @JMSSessionMode(JMSContext.AUTO_ACKNOWLEDGE) private JMSContext context;  Com definição de user e password @Inject @JMSConnectionFactory("jms/connectionFactory") @JMSPasswordCredential(userName="admin",password="mypassword") private JMSContext context; 36 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 31. Injeção de objetos JMSContext Em um container EJB ou Java EE Web  Objetos JMSContext injetados possuem escopo – Com JTA transaction, escopo é a transação – Sem JTA transaction, escopo é o request  JMSContext é automaticamente fechado quando o escopo termina  Injete dois objetos JMSContext com mesmo escopo e terá o mesmo objeto – se valores de @JMSConnectionFactory, @JMSPasswordCredential e @JMSSessionMode são idênticos – Torna mais fácil usar a mesma sessão dentro de uma transação 37 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 32. JMS 2.0: Novas features da API 38 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 33. Mais fácil criar Durable Subscribers  Durable subscriptions são identificados por {clientId, subscriptionName}  ClientId não é mais obrigatório quando usar durable subscriptions  Para MDBs, o container vai gerar um nome padrão (EJB 3.2) 39 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 34. Delivery delay  Permite um cliente JMS agendar entrega futura de mensagem  Novo método no MessageProducer public void setDeliveryDelay(long deliveryDelay)  Novo método no JMSProducer public JMSProducer setDeliveryDelay(long deliveryDelay)  Configure tempo minimo em ms para quem uma mensagem deve ser retida no sistema até ser enviada 40 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 35. Envio Assíncrono  Envia uma mensagem e retorna imediatamente sem bloquear até o ACK de que foi recebida pelo servidor  Uso de callback quando tiver o ACK do servidor  Novo método do MessageProducer messageProducer.send(message,completionListener)  Disponível também no JMSProducer 41 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 36. Envio Assíncrono  Aplicação define um CompletionListener public interface CompletionListener { void onCompletion(Message message); void onException(Message message, Exception exception); } 42 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 37. Melhor tratamento de mensagens ruins Torna a propriedade JMSMXDeliveryCount obrigatória  JMS 1.1 define uma propriedade de mensagem opcional JMSXDeliveryCount. – Quando usado, é setado pelo provedor JMS quando a mensagem é recebida, e indica o número de vezes que esta mensagem foi entrege (incluindo a primeira vez).  JMS 2.0 torna esta propriedade obrigatória pelas implementações 43 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 38. Múltiplos consumidores numa subscrição de tópico  Permite consumo escalável de mensagems a partir de um Topic Subscription – Múltiplas threads, multiplas JVMs  Novos métodos para non-durable subscriptions MessageConsumer messageConsumer= session.createSharedConsumer(topic,sharedSubscriptionName);  Métodos existentes para durable subscriptions MessageConsumer messageConsumer= session.createDurableConsumer(topic,durableSubscriptionName);  Disponível também no JMSContext 44 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 39. Definição de recursos JMS simplificada no Java EE Em conjunto com JSR 342 (Java EE 7 platform) 45 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 40. Definição de recursos JMS simplificada no Java EE O problema  Java EE e JMS recomenda que aplicações devem obter o ConnectionFactory e a Destination via JNDI @Resource(lookupName = "jms/inboundQueue") private Queue inboundQueue;  Mantém o código portável  Criar estes recursos é um incômodo para os desenvolvedores 46 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 41. Connection Factory default na plataforma Simplifica o uso de JMS na maioria dos casos  Se você quiser somente usar o serviço JMS do servidor de aplicação @Resource(lookup="java:comp/defaultJMSConnectionFactory") ConnectionFactory myJMScf; 47 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 42. Definição de recursos JMS simplificada no Java EE Funções novas e opcionais no Java EE 7  Aplicação pode especificar os JMS connection factories e JMS destinations que precisa via anotações  Deployer pode então definir requerimentos com os deployment descriptors  Servidor de aplicação pode usar esta informação para criar automaticamente os recursos quando a aplicação for instalada  Equivalente às anotações referentes a @DataSourceDefinition  É opcional suportar estes recursos 48 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 43. Definição de recursos JMS simplificada no Java EE Uso de anotações para definir recursos @JMSConnectionFactoryDefinition( name="java:global/jms/demoConnectionFactory", className= "javax.jms.ConnectionFactory", description="ConnectionFactory to use in demonstration") @JMSDestinationDefinition( name = "java:global/jms/demoQueue", description = "Queue to use in demonstration", className = "javax.jms.Queue", destinationName="demoQueue") 49 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 44. Definição de recursos JMS simplificada no Java EE Deployer configura informações específicas posteriormente <jms-destination> <name>"java:global/jms/demoQueue</name> <class-name>javax.jms.Queue</class-name> <resource-adapter-name>jmsra</resource-adapter-name> <destination-name>demoQueue</destination-name> </jms-destination> <jms-connection-factory> <name>java:global/jms/demoConnectionFactory</name> Pode definir <property> propriedades <name>addressList</name> específicas <value>mq://localhost:7676</value> do provedor JMS </property> <max-pool-size>30</max-pool-size> <min-pool-size>20</min-pool-size> <max-idle-time>5</max-idle-time> </jms-connection-factory> 50 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 45. Configuração padronizada de MDBs Em conjunto com JSR 345 (EJB 3.2) 51 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 46. Configuração padronizada de MDBs  Configuração de MDBs não é padronizada  EJB 3.1 não define como especificar – Nome JNDI da queue or topic (usando annotation) – Nome JNDI da connection factory – clientID – durableSubscriptionName  EJB 3.1 não define como que mensagens de tópicos devem ser entregues para MDBs clusterizados 52 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 47. Configuração padronizada de MDBs Novas propriedades de ativação para Queue ou Topic @MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName = "destinationLookup", propertyValue = "jms/myTopic"), . . . })  Também pode ser definido no ejb-jar.xml 53 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 48. Configuração padronizada de MDBs Novas propriedades de ativação para Queue ou Topic @MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName = "connectionFactoryLookup", propertyValue = "jms/myCF"), . . . })  Também pode ser definido no ejb-jar.xml 54 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 49. Configuração padronizada de MDBs Novas propriedades de ativação para Queue ou Topic @MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName = "subscriptionDurability", propertyValue = "Durable"), @ActivationConfigProperty( propertyName = "clientId", propertyValue = "myClientID"), @ActivationConfigProperty( propertyName = "subscriptionName", propertyValue = "MySub"), . . . })  Estas propriedades nunca tinham sido padronizadas 55 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 50. Topic delivery para MDBs em cluster Uma mensagem por instância ou uma por cluster? Topic ? MDB MDB MDB MDB MDB MDB MDB MDB MDB Application server instance Application server instance Application server instance Application server cluster 57 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 51. Topic delivery para MDBs em cluster  Se subscriptionName e clientId não estão definidos – cada mensagem será entregue uma vez, por cluster – instâncias do cluster compartilharão o mesmo nome de subscrição  Para desligar configure sharedSubscriptions para false – cada mensagem será entregue uma por instância de MDB – cada instância do servidor de aplicação terá uma subscription separada  Aplica-se a durable e non-durable subscriptions 58 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 52. Melhor plugabilidade com Java EE 59 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 53. Melhor plugabilidade com Java EE  Objetivo – Facilitar o uso de um provedor JMS em outros servidores de aplicação – e.g. aplicação GlassFish enviando mensagens para o WebLogic JMS  Solução – Obrigar provedores JMS a oferecer um adaptador JCA 60 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 54. Melhor plugabilidade com Java EE usando a especificação Java Connector Architecture (JCA)  Java Connector Architecture é desenhado para: – Integrar recursos transacionais com o servidor de aplicação – processamento assíncrono de MDBs  Suporte ao JCA é obrigatório no Java EE  Muitos vendors de JMS vendors já oferecem adaptadores  JMS 2.0 obriga o provisionamento de adaptador JCA  Deve ser transparente para as aplicações! 61 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 55.  Simplicidade e facilidade de uso  Novas features Novidades – multi-threaded Topic Subscribers do JMS 2.0 – delivery delay – envio async  Melhor integração com Java EE – configuração de recursos simplificada – Padronização na configuração de MDBs – melhor plugabilidade entre servidores de aplicação  Muitas outras melhorias e correções 62 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 56. Experimente o Java EE 7 JMS 2.0, EJB 3.2 and Java EE  GlassFish 4.0 – http://glassfish.java.net/ – http://dlc.sun.com.edgesuite.net/glassfish/4.0/promoted/  Open Message Queue 5.0 – http://mq.java.net/ – http://mq.java.net/5.0.html 64 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 57. Perguntas? 65 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 58. Graphic Section Divider 66 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  • 59. 67 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.