Uploaded on

Java Messaging Service 2.0 at JavaOne Latin America 2011

Java Messaging Service 2.0 at JavaOne Latin America 2011

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,784
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
98
Comments
0
Likes
6

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 1 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 2. ably probWhats comingin Java Message Service 2.0Adam LeftikProduct Management 2 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 3. The following is intended to outline our general product direction. It isintended for information purposes only, and may not be incorporated into anycontract. It is not a commitment to deliver any material, code, or functionality,and should not be relied upon in making purchasing decisions. Thedevelopment, release, and timing of any features or functionality describedfor Oracle s products remains at the sole discretion of Oracle.3 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 3  
  • 4. Agenda •  JSR 343 Update •  Whats coming in the JMS 2.0 Early Draft –  Simplifying the JMS API –  Improving integration with application servers –  New API features •  Q&A4 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 4   4  
  • 5. JMS •  Java Message Service (JMS) specification –  Part of Java EE but also stands alone –  Last maintenance release (1.1) was in 2003 •  Does not mean JMS is moribund! –  Multiple active commercial and open source implementations –  Shows strength of existing spec •  Meanwhile –  Java EE has moved on since, and now Java EE 7 is planned –  Time for JMS 2.05 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 5  
  • 6. JMS 2.0•  March 2011: JSR 343 launched to develop JMS 2.0•  Target: to be part of Java EE 7 in Q3 2012•  Expert group now in operation and working towards the "early draft" for public review•  Community involvement invited –  Visit jms-spec.java.net and get involved –  Join the mailing list –  Submit suggestions to the issue tracker 6 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 6  
  • 7. JSR 343 Expert Group•  Oracle (lead) •  Red Hat•  Caucho •  Pramati Technologies•  IBM •  Vmware•  Red Hat •  FuseSource (soon)•  TIBCO •  ...and 6 individual members 7 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 8. Initial goals of JMS 2.0•  Simpler and easier to use •  Standardise interface with –  simplify the API application servers –  make use of CDI (Contexts and •  Clarify relationship with other Dependency Injection) Java EE specs –  clarify any ambiguities in the spec –  some JMS behaviour defined in•  Support new themes of Java EE 7 other specs –  PaaS •  New messaging features –  Multi-tenancy –  standardize some existing vendor extensions (or will retrospective standardisation be difficult?) 8 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 8  
  • 9. JMS 2.0 Timeline Forma0on  of  expert  group   Q2  2011   Prepara0on  of  early  dra;   Early  dra;  review   Q1  2012   Prepara0on  of  public  dra;   Public  review   Q2  2012   Comple0on  of  RI  and  TCK   Q3  2012   Final  approval  ballot  9 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 9  
  • 10. Whats coming in the Early Draft •  Here are some items expected in the JMS 2.0 Early Draft –  Based on Expert Group members priorities –  All items in JIRA at jms-spec.java.net –  Subject to final approval by the Expert Group •  Things are still changing •  Its not too late –  to give us your views on these items –  to propose additional items for a later draft or revision10 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 10  
  • 11. Simplifying the JMS API11 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 12. Whats wrong with the JMS API? Not a lot...12 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 13. Receiving messages in Java EE@MessageDriven(mappedName = "jms/inboundQueue")public class MyMDB implements MessageListener { public void onMessage(Message message) { String payload = (TextMessage)textMessage.getText(); // do something with payload }} 13 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 14. Sending messages in Java EE@Resource(lookup = "jms/connFactory")ConnectionFactory cf;@Resource(lookup="jms/inboundQueue")Destination dest;public void sendMessage (String payload) throws JMSException { Connection conn = cf.createConnection(); Session sess = conn.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer producer = sess.createProducer(dest); TextMessage textMessage = sess.createTextMessage(payload); messageProducer.send(textMessage); connection.close();} 14 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 15. Sending messages in Java EE@Resource(lookup = "jms/connFactory") Need to createConnectionFactory cf; intermediate objects@Resource(lookup="jms/inboundQueue") just to satisfy the APIDestination dest;public void sendMessage (String payload) throws JMSException { Connection conn = cf.createConnection(); Session sess = conn.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer producer = sess.createProducer(dest); TextMessage textMessage = sess.createTextMessage(payload); messageProducer.send(textMessage); connection.close();} 15 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 16. Sending messages in Java EE@Resource(lookup = "jms/connFactory")ConnectionFactory cf; Redundant@Resource(lookup="jms/inboundQueue") argumentsDestination dest;public void sendMessage (String payload) throws JMSException { Connection conn = cf.createConnection(); Session sess = conn.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer producer = sess.createProducer(dest); TextMessage textMessage = sess.createTextMessage(payload); messageProducer.send(textMessage); connection.close();} 16 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 17. Sending messages in Java EE@Resource(lookup = "jms/connFactory")ConnectionFactory cf; Boilerplate code@Resource(lookup="jms/inboundQueue")Destination dest;public void sendMessage (String payload) throws JMSException { Connection conn = cf.createConnection(); Session sess = conn.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer producer = sess.createProducer(dest); TextMessage textMessage = sess.createTextMessage(payload); messageProducer.send(textMessage); connection.close();} 17 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 18. Sending messages in Java EEpublic void sendMessage (String payload) throws JMSException { try { Connection conn = null; con = cf.createConnection(); Session sess = conn.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer producer = sess.createProducer(dest); TextMessage textMessage=sess.createTextMessage(payload); messageProducer.send(textMessage); } finally { connection.close(); }} Need to close connections after use 18 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 19. Sending messages in Java EEpublic void sendMessage (String payload) { Connection conn = null; try { con = cf.createConnection(); Session sess = conn.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer producer = sess.createProducer(dest); TextMessage textMessage=sess.createTextMessage(payload); messageProducer.send(textMessage); } catch (JMSException e1) { // do something } finally { try { if (conn!=null) connection.close(); } catch (JMSException e2){ // do something else And theres } } always exception} handling to add 19 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 20. Approaches to simplification •  Simplify the existing API •  Define new simplified API •  Use CDI annotations to hide the boilerplate code20 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 20  
  • 21. Simplify the existing API•  Need to maintain backwards compatibility limits scope for change –  New methods on javax.jms.Connection: •  Keep existing method connection.createSession(transacted,deliveryMode) •  New method for Java SE connection.createSession(sessionMode) •  New method for Java EE connection.createSession() –  Make javax.jms.Connection implement java.lang.AutoCloseable 21 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 22. Possible new API@Resource(mappedName="jms/contextFactory")ContextFactory contextFactory;@Resource(mappedName="jms/orderQueue")Queue orderQueue;public void sendMessage(String payload) { try (MessagingContext mCtx = contextFactory.createContext();){ TextMessage textMessage = mCtx.createTextMessage(payload); mCtx.send(orderQueue,textMessage); }} 22 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 23. Annotations for the new API@Resource(mappedName="jms/orderQueue")Queue orderQueue;@Inject@MessagingContext(lookup="jms/contextFactory")MessagingContext mCtx;@InjectTextMessage textMessage;public void sendMessage(String payload) { textMessage.setText(payload); mCtx.send(orderQueue,textMessage);} 23 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 24. Annotations for the old API@Inject@JMSConnection(lookup="jms/connFactory")@JMSDestination(lookup="jms/inboundQueue")MessageProducer producer;@InjectTextMessage textMessage;public void sendMessage (String payload){ try { textMessage.setText(payload); producer.send(textMessage); } catch {JMSException e} // do something }} 24 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 25. Some other simplifications25 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 26. Sending object payloads directly •  No need to create a message –  producer.send(String text); –  producer.send(Serializable object); •  But: –  wouldnt allow message properties to be set –  may not be appropriate for BytesMessage etc –  less obvious how to offer this for receive() methods •  How useful is this in practice?26 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 26  
  • 27. Making durable subscriptions easier to use •  Durable subscriptions are identified by {clientId, subscriptionName} •  ClientId will no longer be mandatory when using durable subscriptions •  For a MDB, container will generate default subscription name (EJB 3.2)27 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8 27  
  • 28. New features for PaaS28 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 29. Annotations to create resources in Java EE •  Currently no standard way for an application to define what JMS resources should be created in the application server and registered in JNDI •  No equivalent to DataSourceDefinition:@DataSourceDefinition(name="java:global/MyApp/MyDataSource", className="com.foobar.MyDataSource", portNumber=6689, serverName="myserver.com", user="lance", password="secret" ) 29 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 30. Annotations to create resources in Java EE •  JSR 342 (Java EE 7) will define new annotations •  Possible new SPI to create the physical destinations as well@JMSConnectionFactoryDefinition( name="java:app/MyJMSFactory", resourceType="javax.jms.QueueConnectionFactory", clientId="foo", resourceAdapter="jmsra", initialPoolSize=5, maxPoolSize=15 )@JMSDestinationDefinition( name="java:app/orderQueue", resourceType="javax.jms.Queue", resourceAdapter="jmsra", destinationName="orderQueue") 30 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 31. Improving integration with application servers31 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 32. Defining the interface between JMS provider and an application server •  Requirement: allowing any JMS provider to work in any Java EE application server •  Current solution: JMS 1.1 Chapter 8 JMS Application Server Facilities32 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 33. JMS 1.1 Chapter 8 JMS Application Server Facilities API for concurrent processing ofAPI for JTA transactions messagesXAQueueConnectionFactory XAConnection ServerSessionXAQueueConnection XASession ServerSessionPoolXAQueueSession XAConnectionFactory ConnectionConsumerXATopicConnectionFactory XAConnection Session.setMessageListenerXATopicConnection XASession Session.getMessageListenerXATopicSession Session.runXAConnectionFactory 33 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 34. JMS 1.1 Chapter 8 JMS Application Server Facilities •  Interfaces all optional, so not all vendors implement them •  No requirement for application servers to support them •  Some omissions –  No support for pooled connections •  Meanwhile…34 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 35. Java EE Connector Architecture (JCA) •  Designed for integrating pooled, transactional resources in an application server •  Designed to support async processing of messages by MDBs •  JCA support already mandatory in Java EE •  Many JMS vendors already provide JCA adapters35 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 36. Defining the interface between JMS provider and an application server •  JMS 2.0 will make provision of a JCA adaptor mandatory •  JMS 1.1 Chapter 8 API remains optional, under review36 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 37. Improvements to MDBs •  Proposals being sent to JSR 342 (EJB 3.2) •  Fill "gaps" in MDB configuration •  Surprisingly, no standard way to specify –  JNDI name of queue or topic (using annotation) –  JNDI name of connection –  clientID –  durableSubscriptionName37 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 38. Defining the destination used by a MDB •  annotation... MessageDriven(messageDestinationLookup="jms/inboundQueue") public class MyMDB implements MessageListener { ... •  ejb-jar.xml... <ejb-jar> <enterprise-beans> <message-driven> <ejb-name>MessageBean</ejb-name> <message-destination-lookup-name> jms/inboundQueue <message-destination-lookup-name> … all names are provisional38 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 39. Defining the connection factory used by a MDB •  annotation... MessageDriven(connectionFactoryLookup="jms/myCF") public class MyMDB implements MessageListener { ... •  ejb-jar.xml... <ejb-jar> <enterprise-beans> <message-driven> <ejb-name>MessageBean</ejb-name> <connection-factory-lookup-name> jms/myCF <connection-factory-lookup-name> ...all names provisional39 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 40. Defining the clientId and durable subscription name used by a MDB •  Define as standard activation config properties @MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName="subscriptionDurability",propertyValue="Durable"), @ActivationConfigProperty( propertyName="clientId",propertyValue="MyMDB"), @ActivationConfigProperty( propertyName="subscriptionName",propertyValue="MySub") }) •  Many app servers support these already40 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 41. New API Features41 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 42. New API features •  Delivery delay •  Send a message with async acknowledgement from server •  JMSXDeliveryCount becomes mandatory •  Topic hierarchies •  Multiple consumers on the same topic subscription (both durable and non-durable) •  Batch delivery •  Some products implement some of these already42 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 43. Delivery delay •  Allows a JMS client to schedule the future delivery of a message •  New method on MessageProducer public void setDeliveryDelay(long deliveryDelay) •  Sets the minimum length of time in milliseconds from its dispatch time that a produced message should be retained by the messaging system before delivery to a consumer. •  Why? If the business requires deferred processing, e.g. end of day43 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 44. Send a message with async acknowledgement from server •  Send a message and return immediately without blocking until an acknowledgement has been received from the server. •  Instead, when the acknowledgement is received, an asynchronous callback will be invoked producer.send(message, new AcknowledgeListener(){ public void onAcknowledge(Message message) { // process ack } }); •  Why? Allows thread to do other work whilst waiting for the acknowledgement44 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 45. Make JMSXDeliveryCount mandatory •  JMS 1.1 defines an optional JMS defined message property JMSXDeliveryCount. –  When used, this is set by the JMS provider when a message is received, and is set to the number of times this message has been delivered (including the first time). The first time is 1, the second time 2, etc •  JMS 2.0 will make this mandatory •  Why? Allows app servers and applications to handle "poisonous" messages better45 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 46. Topic hierarchies •  Topics can be arranged in a hierarchy –  STOCK.NASDAQ.TECH.ORCL –  STOCK.NASDAQ.TECH.GOOG –  STOCK.NASDAQ.TECH.ADBE –  STOCK.NYSE.TECH.HPQ •  Consumers can subscribe using wildcards –  STOCK.*.TECH.* –  STOCK.NASDAQ.TECH.* •  Most vendors support this already •  Details TBD46 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 47. Multiple consumers on a topic subscription •  Allows scalable consumption of messages from a topic subscription –  multiple threads –  multiple JVMs •  No further change to API for durable subscriptions (clientID not used) •  New API for non-durable subscriptions MessageConsumer messageConsumer= session.createSharedConsumer(topic,sharedSubscriptionName); •  Why? Scalability •  Why? Allows greater scalability47 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 48. Batch delivery •  Will allow messages to be delivered asynchronously in batches •  New method on MessageConsumervoid setBatchMessageListener( BatchMessageListener listener, int batchSize, long batchTimeOut) •  New listener interface BatchMessageListenervoid onMessages(Message[] messages) •  Acks also sent in a batch •  Why? May be more efficient for JMS provider or application48 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 49. Agenda for the Early Draft •  Those were some items being considered for the JMS 2.0 Early Draft •  Many items still being discussed by the Expert Group •  A more detailed description can be found in JIRA at jms- spec.java.net •  Its not too late –  to give us your views on these items –  to propose additional items for a later draft (or for JMS 2.1)49 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 50. Get involved! •  Mailing lists, issue tracker and wiki: –  jms-spec.java.net •  Applications to join the expert group –  http://jcp.org/en/jsr/summary?id=343 •  Look out for the Early Draft in Jan 2012 •  Contact the spec lead –  nigel.deakin@oracle.com50 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 51. Questions & Answers51 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8
  • 52. 52 | Copyright © 2011, Oracle and/or it’s affiliates. All rights reserved. | Insert Information Protection Policy Classification from Slide 8