JMS.Next(): JMS 2.0 and Beyond
Upcoming SlideShare
Loading in...5
×
 

JMS.Next(): JMS 2.0 and Beyond

on

  • 33,382 views

JMS is the Java standard for accessing enterprise messaging systems. This session introduces JMS 2.0 (JSR 343), the first update in more than a decade and easily the longest-awaited component of the ...

JMS is the Java standard for accessing enterprise messaging systems. This session introduces JMS 2.0 (JSR 343), the first update in more than a decade and easily the longest-awaited component of the forthcoming Java EE 7 standard. The biggest new feature of JMS 2.0 is a new API that makes JMS much easier to use, especially in a Java EE application. JMS 2.0 also provides API features to support greater scalability as well as additional messaging features and a long list of minor enhancements and clarifications. With JMS 2.0 final with Java EE 7, now is an ideal time to find out more about it.

In this session, we will also discuss what might be next for the JMS specification.

Statistics

Views

Total Views
33,382
Views on SlideShare
22,324
Embed Views
11,058

Actions

Likes
14
Downloads
187
Comments
2

52 Embeds 11,058

https://blogs.oracle.com 7303
http://java.dzone.com 1426
http://www.tutego.de 899
http://architects.dzone.com 721
http://cloud.feedly.com 231
http://feedly.com 105
http://www-ig-opensocial.googleusercontent.com 78
http://feedreader.com 31
http://www.newsblur.com 24
http://rss.neurozone.fr 19
https://feedly.com 19
http://glassfish.collected.info 19
http://digg.com 15
http://blogs.oracle.com 14
http://127.0.0.1 14
http://www.feedspot.com 13
http://newsblur.com 13
http://cuckoo9.okoza.com 13
https://www.inoreader.com 12
http://www.dzone.com 10
http://news.google.com 10
http://translate.googleusercontent.com 6
http://bloggers1033.rssing.com 5
http://nofluffjuststuff.com 5
http://www.inoreader.com 5
http://feeds.iti.bz 4
https://twitter.com 4
http://reader.aol.com 4
https://trovepromo-tf.trove-stg.com 3
https://translate.googleusercontent.com 3
http://architects-portal.cybage.com 3
https://inoreader.com 2
http://www.feedly.com 2
http://de.flavors.me 2
http://www.plagscan.com 2
http://oracle.com 2
https://nofluffjuststuff.com 2
https://bazqux.com 1
https://m.facebook.com 1
http://prsync.com 1
https://137.254.16.27 1
https://uberconf.com 1
https://www.newsblur.com 1
https://beta.inoreader.com 1
http://www.theserverside.com 1
http://www.tuicool.com 1
http://summary 1
http://localhost 1
http://pi 1
https://www.google.no 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Please post on the GlassFish forums with details? Sounds like a classpath problem.
    Are you sure you want to
    Your message goes here
    Processing…
  • Hi Reza,
    I get a NoSuchMethodException when I try to call createContext on my connection factory. Can you think of any reason why this would happen?
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

JMS.Next(): JMS 2.0 and Beyond JMS.Next(): JMS 2.0 and Beyond Presentation Transcript

  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public1 JMS.Next(): JMS 2.0 and Beyond Reza Rahman Java EE/GlassFish Evangelist Reza.Rahman@Oracle.com @reza_rahman
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public2 JMS  Small, successful Java API for Message Oriented Middleware (MOM)  JMS 1.1 – 2002 – J2EE era!  JMS 2 – 2013 – Included in Java EE 7  Overdue and well received  JMS 2.1 starting soon – Included in Java EE 8 – Projected delivery 2016
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public3Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public JMS 2 Goals  API Modernization  Some New Features  Java EE Alignment  EJB3/MDB Alignment  Minor Corrections and Clarifications
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public4 Modernizing the API
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public5 JMS 1.1 @Resource(lookup = "java:global/jms/demoConnectionFactory") private ConnectionFactory connectionFactory; @Resource(lookup = "java:global/jms/demoQueue") private 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); } finally { connection.close(); } } catch (JMSException ex) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); } }
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public6 Simplifying the API  Maintain backwards compatibility!  Simplify existing JMS API where possible  Define new abstractions where needed – JMSContext, JMSProducer, JMSConsumer  Take advantage of modern Java EE paradigms – Annotations – Convention-over-configuration – Injection/scoping Strategy
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public7 Streamlining Session Creation  Methods in javax.jms.Connection to create a Session: – Existing method (will remain)  connection.createSession(transacted, deliveryMode) – New method mainly for Java SE  connection.createSession(sessionMode) – New method mainly for Java EE  connection.createSession()
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public8 Auto Closing JMS Objects  Primarily useful in Java SE  Make JMS objects implement java.jang.AutoCloseable – Connection – Session – MessageProducer – MessageConsumer – QueueBrowser
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public9 JMS Auto Closable Example @Resource(lookup = "jms/connFactory") private ConnectionFactory cf; @Resource(lookup="jms/inboundQueue") Destination dest; public void sendMessage (String payload) throws JMSException { try (Connection conn = cf.createConnection(); Session session = conn.createSession(); MessageProducer producer = session.createProducer(dest); ){ Message mess = sess.createTextMessage(payload); producer.send(mess); } catch(JMSException e){ // exception handling } }
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public10 A First Look at the New API @Resource(lookup = "java:global/jms/demoConnectionFactory") private ConnectionFactory connectionFactory; @Resource(lookup = "java:global/jms/demoQueue") private Queue demoQueue; 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); } }
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public11 JMSContext  An abstraction that encapsulates Connection, Session, Producer and Consumer – Created from ConnectionFactory  JMSContext context = connectionFactory.createContext(sessionMode); – Used to create JMSProducer objects for sending messages – Used to create JMSConsumer objects for receiving messages  Methods on JMSContext, JMSProducer and JMSConsumer throw only unchecked exceptions
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public12 JMSProducer  Messages are sent by creating a JMSProducer object  Geared towards common use cases while retaining flexibility  Fluent API
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public13 JMSProducer Example  JMS 1.1  JMS 2 Setting message delivery options MessageProducer producer = session.createProducer(); producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); producer.setPriority(1); producer.setTimeToLive(1000); producer.send(destination,message); context.createProducer().setDeliveryMode(DeliveryMode.NON_PERSISTENT) .setPriority(1).setTimeToLive(1000).send(destination, message);
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public14 JMSProducer Example  JMS 1.1  JMS 2 Setting message properties and headers MessageProducer producer = session.createProducer(); TextMessage textMessage = session.createTextMessage("Hello); textMessage.setStringProperty("foo", "bar"); producer.send(destination, message); context.createProducer().setProperty("foo","bar").send(destination,"Hello");
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public15 Sending Message Payloads Directly  Sending just the payload – send(Destination dest, String payload) – send(Destination dest, Serializable payload) – send(Destination dest, byte[] payload) – send(Destination dest, Map<String, Object> payload) – Use methods on JMSProducer to set delivery options, message headers and message properties  Sending JMS Message Object – send(Destination dest, Message message)
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public16 JMSConsumer  Messages are consumed by creating a JMSConsumer object  Geared towards common use cases while retaining flexibility – Underlying connection is automatically started (configurable)
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public17 Receiving Message Payloads Directly  Methods on JMSConsumer that return message payload directly: – <T> T receivePayload(Class<T> c); – <T> T receivePayload(Class<T> c, long timeout); – <T> T receivePayloadNoWait(Class<T> c);  You can still return a JMS Message Object: – Message receive(); – Message receive(long timeout); – Message receiveNoWait();
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public18 JMSConsumer Example 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); } }
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public19 Enter the Injection Dragon @Inject @JMSConnectionFactory("jms/connectionFactory") private JMSContext context; @Resource(mappedName = "jms/inboundQueue") private Queue inboundQueue; public void sendMessage (String payload) { context.createProducer().send(inboundQueue, payload); }
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public20 Injection of JMSContext Objects  Connection factory will default to platform default JMS  Specifying session mode  Specifying username and password (may be aliased) @Inject private JMSContext context; @Inject @JMSConnectionFactory("jms/connectionFactory") @JMSSessionMode(JMSContext.AUTO_ACKNOWLEDGE) private JMSContext context; @Inject @JMSConnectionFactory("jms/connectionFactory") @JMSPasswordCredential(userName="admin", password="mypassword") private JMSContext context;
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public21 Injection Under the Hood  Injected JMSContext objects have a scope – In a JTA transaction, scope is the transaction – If no JTA transaction, scope is the request  JMSContext is automatically closed when scope ends  Inject two JMSContext objects within the same scope and you get the same object – If @JMSConnectionFactory, @JMSPasswordCredential and @JMSSessionMode annotations match – Makes it easier to use same session within a transaction
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public22 The New Features
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public23 Delivery Delay  Allows future timed delivery of a message – Deferred processing, e.g. end of day  Method on JMSProducer  Sets minimum time in ms from that a message should be retained by the messaging system before delivery to a consumer  Also available in the old API public void setDeliveryDelay(long deliveryDelay)
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public24 Asynchronous Send  Send a message and return immediately without blocking until an acknowledgement has been received from the JMS server – Allows thread to do other work whilst waiting for acknowledgement  When the acknowledgement is received an asynchronous callback will be invoked  Method on JMSProducer:  Also available in the old API producer.send(message, completionListener)
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public25 Asynchronous Send Listener public interface CompletionListener { void onCompletion(Message message); void onException(Message message, Exception exception); }
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public26 Better Handling of Poison Messages  JMS 1.1 defines optional JMS message property JMSXDeliveryCount – Number of times message has been delivered  JMS 2 makes this mandatory  Allows applications (and the JMS provider) to handle poison messages better – Not a replacement to dead letter queues, etc JMSXDeliveryCount mandatory
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public27 Multiple Consumers on a Topic Subscription  Allows scalable consumption of messages from a topic subscription – multiple threads, multiple JVMs  New methods needed for non-durable subscriptions:  Existing methods used for durable subscriptions:  Also available in old API JMSConsumer consumer = context.createSharedConsumer(topic, sharedSubscriptionName); JMSConsumer consumer = context.createDurableConsumer(topic, durableSubscriptionName);
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public28 Java EE Alignment
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public29 Platform Default Connection Factory  Ships preconfigured with the runtime  Useful for majority of cases @Resource(lookup="java:comp/defaultJMSConnectionFactory") ConnectionFactory myJMScf;
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public30 Defining JMS Resources @JMSConnectionFactoryDefinition( name = "java:global/jms/demoConnectionFactory", interfaceName = "javax.jms.ConnectionFactory", description = "ConnectionFactory to use in demonstration") @JMSDestinationDefinition( name = "java:global/jms/demoQueue", description = "Queue to use in demonstration", interfaceName = "javax.jms.Queue", destinationName = "demoQueue")
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public31 Supplanted/Overridden in XML… <jms-destination> <name>java:global/jms/demoQueue</name> <interface-name>javax.jms.Queue</interface-name> <resource-adapter-name>jmsra</resource-adapter-name> <destination-name>demoQueue</destination-name> </jms-destination> <jms-connection-factory> <name>java:global/jms/demoConnectionFactory</name> <property> <name>addressList</name> <value>mq://localhost:7676</value> </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>
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public32 EJB3/MDB Alignment
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public33 Better Standard Configuration for MDBs  Configuration of MDBs surprisingly non-standard – JNDI name of queue or topic – JNDI name of connection factory – Client ID – Durable subscription name
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public34 Specifying Queue or Topic @MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName = "destinationLookup", propertyValue = "jms/myTopic"), ... })
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public35 Specifying Connection Factory @MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName = "connectionFactoryLookup", propertyValue = "jms/myCF"), ... })
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public36 Specifying Durable Subscriptions @MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName = "subscriptionDurability", propertyValue = "Durable"), @ActivationConfigProperty( propertyName = "clientId", propertyValue = "myClientID"), @ActivationConfigProperty( propertyName = "subscriptionName", propertyValue = "MySub"), ... })
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public37 Try it Out! http://dlc.sun.com.edgesuite.net/glassfish/4.0.1/promoted/
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public38 JMS 2 Implementations GlassFish Java EE 7 Java EE 6 TomEE
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public39 JMS 2.1  Declarative JMS Listeners – https://java.net/jira/browse/JMS_SPEC-134  Cloud/Multitenancy – https://java.net/jira/browse/JMS_SPEC-57  Java SE 8 Alignment – https://java.net/jira/browse/JMS_SPEC-134  JMS/Java EE Pluggability – https://java.net/jira/browse/JMS_SPEC-25  Java SE Bootstrap – https://java.net/jira/browse/JMS_SPEC-89  Management/Monitoring – https://java.net/jira/browse/JMS_SPEC-18  Minor fixes and clarifications
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public40 Summary  Long awaited and well received  API modernization  Some new features  Java EE alignment  EJB3/MDB alignment  Minor corrections and clarifications  Get involved in JMS 2.1!
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public41 Learning More  Java EE/JMS Tutorials – http://docs.oracle.com/javaee/7/tutorial/doc/partmessaging.htm  JMS 2 Hands-on-Lab – https://github.com/m-reza-rahman/jms2-lab  JMS Transparent Expert Group – http://jms-spec.java.net  Java EE 7 Reference Implementation – http://glassfish.org  JMS Reference Implementation – http://mq.java.net  The Aquarium – http://blogs.oracle.com/theaquarium
  • Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Public42