Whats comming JMS 2.0

6,671 views
6,590 views

Published on

Published in: Technology, News & Politics
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,671
On SlideShare
0
From Embeds
0
Number of Embeds
5,451
Actions
Shares
0
Downloads
33
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Whats comming JMS 2.0

  1. 1. 1 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  2. 2. JSR 343 : What s Coming Java Message Service 2.0日本オラクル株式会社 シニア Java エバンジェリスト寺田 佳央 2 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  3. 3. 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。 OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標 です。文中の社名、商品名等は各社の商標または登録商標である場合があります。3 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  4. 4. Program Agenda •  はじめに –  JMS の復習 •  JMS 2.0 の新機能 •  まとめ •  参考情報4 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  5. 5. はじめに5 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8 5
  6. 6. 6 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  7. 7. つながり7 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  8. 8. Messaging とは•  ソフトウェアやアプリケーションをつなぐための手段 – 類似例:電子メール(人と人とをつなぐ手段)8 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  9. 9. 9 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  10. 10. Point To Point (1対1)プロデューサー メッセージプロバイダ コンシュマー 送信 受信10 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  11. 11. Publish / Subscribe (1対多) サブスクライバ サブスクライバパブリッシャ メッセージプロバイダ サブスクライバ パブリッシュ サブスクライブ11 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  12. 12. Java SE/EE 環境で利用可能 JMS API JMS API EJB Java SE Java EE※ Application Client Container も利用可能12 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  13. 13. アプリケーション実装方法の比較 Application Java SE Message Client Appilcation Driven Bean Container開発生産性(低) 開発生産性(高)開発者の考慮が必要 コンテナが豊富な機能 を実装13 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  14. 14. JMS 参照実装 Open MQ14 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  15. 15. http://mq.java.net/ ※ GlassFish の Enterprise Platform 版にバンドル15 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  16. 16. Open MQ(メッセージ・プロバイダ) の起動 GlassFish> ./imqbrokerd -name “myBroker”! メッセージプロバイダが [27/3/2012:16:10:28 JST] ! OpenMQ の場合 ========================================================  ! Open Message Queue 4.5.2! Oracle バージョン: 4.5.2 (Build 2-d)!! … (中略)!! [27/3/2012:16:10:29 JST] [B1039]: ブローカ ! “myBroker@192.168.0.1:7676” の準備ができました。 16 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  17. 17. メッセージプロバイダの送信先(宛先)一覧 GlassFish> ./imqcmd list dst ! ユーザ名: admin! パスワード: [admin]! 指定されたブローカ上のすべての送信先のリスト:!--------------------------------------------------------------- !名前 タイプ 状態 プロデューサ コンシューマ Msgs !Total ワイルドカード Total ワイルドカード カウント リモート UnAck Avg Size!--------------------------------------------------------------- ! mq.sys.dmq キュー 実行中 0 – 0 – 1 0 0 996.0!送信先のリストに成功しました。 17 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  18. 18. JMS API Java SE Java SE 環境の 実装18 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  19. 19. JMS アプリケーション on Java SE •  メッセージ・プロバイダに接続 –  直接アドレス指定、JNDIルックアップ •  キューへの接続 •  メッセージ作成 •  メッセージ送信 宛先のキュー名 JMS クライアント メッセージプロバイダ19 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  20. 20. JMS アプリケーション ‒ 接続public class Sender {! public static void main(String[] args) throws JMSException {! com.sun.messaging.ConnectionFactory connectionFactory = ! new com.sun.messaging.ConnectionFactory();! connectionFactory.setProperty(com.sun.messaging.! ConnectionConfiguration.imqAddressList,! "mq://127.0.0.1:7676");! javax.jms.QueueConnection queueConnection = ! connectionFactory.createQueueConnection("admin", "admin");! …… (続く)! 20 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  21. 21. JMS アプリケーション on Java SE 環境public class Sender {! ……(続き)! javax.jms.QueueSession queueSession = queueConnection.! createQueueSession (false, Session.AUTO_ACKNOWLEDGE);! javax.jms.Queue smsQueue = queueSession. ! createQueue("sample_queue");! javax.jms.MessageProducer producer = queueSession. ! createSender(smsQueue);! Message msg = queueSession.createTextMessage(“メッセージ送信”);! producer.send(msg);! queueConnection.close();}} 21 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  22. 22. Java SE 環境で利用した場合の課題 •  接続ファクトリを自身で生成 –  MQプロバイダと密結合 –  MQプロバイダ・依存クラスを利用 –  可読性・保守性・移植性の低下 •  コネクション・プールの利用が不可能 –  コネクションの再利用が困難 –  大量リクエストでMQプロバイダへ高負荷を掛ける可能性あり •  トランザクション処理を自身で実装22 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  23. 23. JMS API App/EJB Java SE コンテナ上で動作23 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  24. 24. メッセージ・プロバイダ設定 •  アプリケーション・サーバの設定 –  接続ファクトリ –  宛先 jms/MyQueue 宛先のキュー名 JNDI 名前空間 管理者 接続 ファクトリ 宛先 メッセージプロバイダ jms/MyFactory24 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  25. 25. GlassFish の場合 管理ツールから接続ファクトリの設定 メッセージプロバイダGlassFishの管理コンソール 接続ファクトリの設定 (コネクション・ファクトリ) 25 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  26. 26. GlassFish の場合 管理ツールから送信先(宛先)の設定 宛先のキュー名 メッセージプロバイダ26 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  27. 27. JMS アプリケーション on コンテナ •  アプリケーション・クライアント・コンテナ •  EJB コンテナ リソース・ インジェクション JNDI 名前空間 jms/MyFactory開発者 jms/MyQueue 接続 宛先のキュー名 ファクトリ 宛先JMS クライアント メッセージプロバイダ クライアントはJNDI経由で 論理的に接続 27 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  28. 28. JMS API App Client アプリケーション・ Java SE クライアント・ コンテナの実装28 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  29. 29. リソースのインジェクションpublic class OrderSender {! @Resource( mappedName="jms/MyConnectionFactory” )! private static ConnectionFactory connectionFactory; ! @Resource( mappedName="jms/mySampleQueue” )! private static Queue queue;! public static void main(String argv[]) throws ! JMSException{ ! …… (続く) !29 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  30. 30. メッセージの送信public static void main(String argv[]) throws JMSException{ ! Connection con = connectionFactory.createConnection();! Session session = ! con.createSession(false, Session.AUTO_ACKNOWLEDGE);! MessageProducer prod = session.createProducer(queue);! TextMessage message = session.createTextMessage();! message.setText(“メッセージ送信”);! prod.send(message);! session.close();! con.close();!}! 30 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  31. 31. メッセージの受信 public class MyMessageListener implements MessageListener{! @Resource( mappedName="jms/MyConnectionFactory” )! private static ConnectionFactory connectionFactory; ! @Resource( mappedName="jms/mySampleQueue” )! private static Queue queue;!! public void onMessage(Message message){! System.out.println("Message received: " ! + ((TextMessage)message).getText();! }! …… (続く) 31 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  32. 32. メッセージの受信 …… (続き)!   public static void main(String[] args){! Connection connection = ! connectionFactory.createConnection();! Session session = !   connection.createSession(false,Session.AUTO_ACKNOWLEDGE);! MessageConsumer consumer = session.createConsumer(queue);! consumer.setMessageListener(new MyMessageListener());! connection.start(); ! } }! 32 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  33. 33. JMS API Java SE EJB EJB コンテナ (MDB) の実装33 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  34. 34. Message Driven Bean とは •  EJBコンテナで実行されるコンシュマー(受信者) –  プロデューサ(送信者)として実装することも可能 •  コードの大幅な簡略化 MDB –  マルチスレッド EJB –  セキュリティ Java EE –  トランザクション •  EJB による AOP開発 –  Interceptor –  PostConstruct, Predestroy34 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  35. 35. MDBによるメッセージ受信@MessageDriven(mappedName = "jms/mySampleQueue”)!public class ReceiverMDB implements MessageListener {! public void onMessage(Message message) {! try {! TextMessage msg = (TextMessage) message;! System.out.println(“Message received:" ! + msg.getText());! } catch (JMSException jmse) {! jmse.printStackTrace();! }}} トランザクション、セキュリティ、 Interceptor 等も利用可能35 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  36. 36. JMS 2.0の新機能36 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8 5
  37. 37. Java Message Service 2.0 (JSR 343) •  2011年3月:全開一致承認 •  Java EE 7 仕様の一部として提供 •  エキスパート・グループによって作業中 •  コミュニティ活動への参加の呼びかけ –  jms-spec.java.net –  メーリング・リストへの参加、コメント Spec Lead Nigel Deakin 37 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  38. 38. JMS 2.0 ロードマップ パブリック・レビュー ドラフト提出(計画) Q4 Q1 Q2 2011 2012 2013アーリー・ドラフト Java EE 7ファイナル提出(予定) リリース(予定)38 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  39. 39. http://jms-spec.java.net39 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  40. 40. 40 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  41. 41. JMS 2.0 の変更点のポイント41 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  42. 42. • 新規簡易 API を提供 • 例外の実装方法が変更 • 既存 API に対する改善 • CDI を利用した冗長コードの排除42 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  43. 43. 既存のMDB : メッセージ受信 in Java EE @MessageDriven(mappedName = "jms/mySampleQueue”)! public class ReceiverMDB implements MessageListener {! public void onMessage(Message message) {! TextMessage msg = (TextMessage) message;! System.out.println(“受信したメッセージ:" ! + msg.getText());! }!} 受信用コード実装は簡単43 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  44. 44. 既存のMDB : メッセージ送信 in Java EE @Resource( mappedName="jms/MyConnectionFactory” )! private static ConnectionFactory connectionFactory; ! @Resource( mappedName="jms/mySampleQueue” )! private static Queue queue;!! メッセージ送信の実装は面倒 public void sendMessage(String text){! Connection con = connectionFactory.createConnection();! Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);! MessageProducer prod = session.createProducer(queue);! TextMessage message = session.createTextMessage(text);! message.setText(message);! prod.send(message);! con.close();44 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  45. 45. 既存の問題点: メッセージ送信 in Java EE @Resource( mappedName="jms/MyConnectionFactory” )! private static ConnectionFactory connectionFactory; ! @Resource( mappedName="jms/mySampleQueue” )! private static Queue queue;! 単なるメッセージ送信に! 中間オブジェクトが必要 public void sendMessage(String text){! Connection con = connectionFactory.createConnection();! Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);! MessageProducer prod = session.createProducer(queue);! TextMessage message = session.createTextMessage(text);! message.setText(message);! prod.send(message);! con.close();45 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  46. 46. 既存の問題点: メッセージ送信 in Java EE @Resource( mappedName="jms/MyConnectionFactory” )! private static ConnectionFactory connectionFactory; ! @Resource( mappedName="jms/mySampleQueue” )! private static Queue queue;! 定型的なコード! public void sendMessage(String text){! Connection con = connectionFactory.createConnection();! Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);! MessageProducer prod = session.createProducer(queue);! TextMessage message = session.createTextMessage(text);! message.setText(message);! prod.send(message);! con.close();46 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  47. 47. 新規簡易 API MessagingContext を提供 javax.jms.MessagingContext インタフェース MessagingContext •  別々のクラスを1つに統合 –  Connection Connection Session –  Session –  MessageProducer –  MessageConsumer MessageProducer MessageConsumer 47 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  48. 48. MessagingContext の利用例 メッセージ送信 MessagingContext context = conFactory.createMessagingContext();! TextMessage textMsg = context.createTextMessage(message);! context.send(queue, textMsg);!! メッセージ受信 MessagingContext context = conFactory.! createMessagingContext(AUTO_ACKNOWLEDGE);! MessageListener mListener = new MyMsgListener();! context.setMessageListener(queue, mListener);!48 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  49. 49. 既存の問題点: メッセージ送信 in Java EEpublic void sendMessage(String text){! Connection con = null;! try{! con = connectionFactory.createConnection();! Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);! MessageProducer prod = session.createProducer(queue);! TextMessage message = session.createTextMessage(text);! message.setText(message);! prod.send(message);! 使用後コネクションの }finally{! クローズが必要 con.close();! }49 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  50. 50. Java SE 7 の try-with-resource に対応 AutoCloseable による実装 (close()の実装が不要) ! public void sendMessage(String text){!  try(MessagingContext ctx = cFactory.createContext()){! TextMessage message = session.createTextMessage(text);! message.sendText(outQueue,message);! }! }!50 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  51. 51. 既存の問題点: メッセージ送信 in Java EEpublic void sendMessage(String text){! try{! ……// 送信処理! 例外処理の実装が prod.send(message);! 必要 }catch(JMSException jmse){! // 例外処理! }finally{! try{! if(con != null) con.close();! }catch (JMSException jmse2){! // 例外処理! }! }}51 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  52. 52. 例外の実装方法が変更チェック例外から非チェック例外へ 過去の例外クラス 今後の例外クラスJMSException JMSRuntimeExceptionTransactionRolledBackException TransactionRolledBackRuntimeEx ceptionIllegalStateException IllegalStateRuntimeException!InvalidDestinationException IllegalDestinationRuntimeExcep tion!InvalidSelectorException InvalidSelectorRuntimeExceptio nMessageFormatException MessageFormatRuntimeException 52 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  53. 53. 例外の実装方法が変更例外処理の実装は不要 (RuntimeException) public void sendMessage(String text){! ……// 送信処理! prod.send(message);! }53 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  54. 54. 既存の問題点: メッセージ送信 in Java EE @Resource( mappedName="jms/MyConnectionFactory” )! private static ConnectionFactory connectionFactory; ! @Resource( mappedName="jms/mySampleQueue” )! private static Queue queue;! 冗長的な引数! public void sendMessage(String text){! Connection con = connectionFactory.createConnection();! Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);! MessageProducer prod = session.createProducer(queue);! TextMessage message = session.createTextMessage(text);! message.setText(message);! prod.send(message);! con.close();54 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  55. 55. javax.jms.Connection に対する改善 セッション作成方法の簡易化 •  今まで –  Connection#createSession( transacted, deliveryMode ) •  今後 –  Java SE で利用可能な新規メソッド •  Connection#createSession( sessionMode ) –  Java EE で利用可能な新規メソッド •  Connection#createSession()55 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  56. 56. CDIアノテーションを使用した依存性注入MessagingContext に対する注入 @Inject! private MessagingContext context; •  リクエスト・スコープ •  リクエスト毎にコネクションを生成 •  処理終了時に自動的にコネクション切断56 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  57. 57. CDIアノテーションを使用した依存性注入MessagingContext に対する注入 @Inject! @JMSConnectionFactory(“jms/MyConFactory”)! private MessagingContext context; •  JNDI ルックアップでコンテナの接続ファクトリを使用 –  コネクション・プール等を利用可能 •  JNDI 名を未指定時、システムのデフォルト使用57 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  58. 58. CDIアノテーションを使用した依存性注入MessagingContext に対する注入 @Inject! @JMSConnectionFactory(“jms/MyConFactory”) ! @JMSPasswordCredential(userName=“admin”,password=“admin”)! private MessagingContext context; •  ユーザ名・パスワードを指定58 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  59. 59. CDIアノテーションを使用した依存性注入MessagingContext に対する注入 @Inject! @JMSConnectionFactory(“jms/MyConFactory”) ! @JMSSessionMode(MessagingContext.AUTO_ACKNOWLEDGE)! private MessagingContext context; •  セッション・モードを指定 –  SESSION_TRANSACTED, CLIENT_ACKNOWLEDGE, AUTO_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE –  (デフォルト:AUTO_ACKNOWLEDGE)59 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  60. 60. CDIアノテーションを使用した依存性注入MessagingContext に対する注入 @Inject! @JMSConnectionFactory(“jms/MyConFactory”) ! @JMSAutoStart(false)! private MessagingContext context; •  JMSContext#setAutoStart(false)と同等 •  コンシューマ作成時JMSContextで使用する 接続を自動的に起動60 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  61. 61. 61 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  62. 62. Java EE 6 までのメッセージ送信 @Resource( mappedName="jms/MyConnectionFactory” )! private static ConnectionFactory connectionFactory; ! @Resource( mappedName="jms/mySampleQueue” )! private static Queue queue;!! public void sendMessage(String text){! Connection con = connectionFactory.createConnection();! Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);! MessageProducer prod = session.createProducer(queue);! TextMessage message = session.createTextMessage(text);! message.setText(message);! prod.send(message);! con.close();62 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  63. 63. Java EE 7 におけるメッセージ送信 @Inject! @JMSConnectionFactory(“jms/MyConFactory”) ! private MessagingContext context;!! @Resource(mappedName = “jms/queue”)! private Queue queue;!! public void sendNewMessage(String msg){! context.send(queue, msg);! }63 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  64. 64. • マルチテナンシーのサポート – リソース生成用メタデータ • 議論中の内容 – http://java.net/jira/browse/ JMS_SPEC-57 • Java EE 7 仕様中で定義 – EE.5.17.4、EE.5.17.5(JMSでない)64 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  65. 65. 今までの実装・運用方法 ‒ 手順 1 •  アプリケーション・サーバの設定 –  接続ファクトリ –  宛先 jms/MyQueue 宛先のキュー名 JNDI 名前空間 管理者 接続 ファクトリ 宛先 メッセージプロバイダ jms/MyFactory65 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  66. 66. 今までの実装・運用方法 ‒ 手順 2 •  設定済のリソースをルックアップ リソース・ インジェクション JNDI 名前空間 jms/MyFactory開発者 jms/MyQueue 接続 宛先 宛先のキュー名 ファクトリJMS クライアント メッセージプロバイダ クライアントはJNDI経由で 論理的に接続 66 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  67. 67. 現状ではマルチテナンシー対応が困難 テナント A 管理者が接続ファクトリ、宛先を設定 開発者は管理者が設定したJNDI 名をコードに反映 テナント B 管理者が接続ファクトリ、宛先を設定 開発者は管理者が設定したJNDI 名をコードに反映 テナント C 管理者が接続ファクトリ、宛先を設定 開発者は管理者が設定したJNDI 名をコードに反映67 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  68. 68. 実現したい事•  アプリケーション上で必要なリソースを設定可能 JNDI 名前空間 テナントA宛先 接続 ファクトリ 宛先 管理者 テナントB宛先 (配備者) 接続 ファクトリ 宛先 メッセージプロバイダ68 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  69. 69. 新規メタデータを提供 ‒ 接続ファクトリ@JMSConnectionFactoryDefinition @JMSConnectionFactoryDefinition(! name=“java:app/MyJMSFactory” ,! resoureType=“javax.jms.QueueConnectionFactory” ,! clientId=“foo” ,! resourceAdapter=“jmsra” ,! initialPoolSize=5 ,! maxPoolSize=15! ※ 同等の XML 設定を提供 )69 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  70. 70. 新規メタデータを提供 ‒ 宛先@JMSDestinationDefinition @JMSDestinationDefinition(! name=“java:app/MyQueue” ,! resoureType=“javax.jms.Queue” ,! resourceAdapter=“jmsra” ,! destinationName=“myQueue”,! tenantIsolation=“ISOLATED or SHARED”! ) ※ 同等の XML 設定を提供70 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  71. 71. • 開発容易性の大幅な向上 • Java EE 7 のテーマをサポート – クラウド対応 – マルチ・テナンシー • その他71 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  72. 72. 参考情報 •  JSR 343 –  http://jcp.org/en/jsr/detail?id=343 •  JMS 2.0 の仕様 –  http://java.net/projects/jms-spec –  http://java.net/projects/jms-spec/downloads •  JMS-Spec JIRA –  http://java.net/jira/browse/JMS_SPEC •  OpenMQ –  http://mq.java.net/72 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  73. 73. Russia 17–18 April 2012 India 3–4 May 2012 San Francisco September 30–October 4, 201273 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  74. 74. 74 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  75. 75. 75 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  76. 76. •  直接オブジェクト内容送信 •  永続サブスクリプションの簡易化 •  JMSプロバイダ、アプリケーションサーバ間インタフェース定義 •  MDBの設定改善 •  遅延配信 •  サーバからの非同期ACKを受信するメッセージ送信 •  JMSDeliveryCount の必須化 •  トピックの階層構造化 •  特定トピックのサブスクリプションに対する複数のコンシュマー •  バッチ配信76 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  77. 77. 直接オブジェクトの内容を送信可能 •  メッセージの作成は不要 –  producer#send(String text); –  producer#send(Serializable object); •  制限事項 –  メッセージ・プロパティの設定は不可 –  BytesMessage での使用は非推奨 –  receive() メソッドでの同様操作は検討中(不明確)77 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  78. 78. 永続サブスクリプションの実装の簡易化 •  今までの永続サブスクリプションの識別方法 –  {clientId, subscriptionName} •  今後、永続サブスクリプションで clientId は省略可能 •  EJB 3.2 より MDB を使用する場合、コンテナがデフ ォルトのサブスクリプション名を自動生成78 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  79. 79. JMSプロバイダ・アプリケーションサーバ間のインタフェースを定義 •  目的: –  任意のプロバイダと任意のアプリケーションサーバの動作を保証 •  対応: –  Java EE Connector Architecture (JCA) を必須で提供79 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  80. 80. MDB の改善 (提案中) •  JSR 342 (EJB 3.2) へ提案中 •  MDB における標準的な設定方法 –  宛先(キュー、トピック)の JNDI 名 (メタデータ中) –  接続の JNDI 名 (メタデータ中) –  クライアント ID –  永続サブスクリプション名80 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  81. 81. MDB の改善 (提案中) ‒ 宛先の定義 •  アノテーションによる設定 @MessageDriven(messageDestinationLookup=“jms/queue”)! public class MyMDB implements MessageListener{! ……! }81 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  82. 82. MDB の改善 (提案中) ‒ 接続の定義 •  アノテーションによる設定 @MessageDriven(connectionFactoryLookup=“jms/myCF”)! public class MyMDB implements MessageListener{! ……! }82 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  83. 83. MDB の改善 (提案中) ‒ 永続サブスクリプションの定義 •  アノテーションによる設定 @MessageDriven(activationConfig = {! @ActivationConfigProperty(! propertyName=“subscriptionDurability”, propertyValue="Durable"),! @ActivationConfigProperty(! propertyName="clientId",propertyValue="MyMDB"),! @ActivationConfigProperty(! propertyName="subscriptionName",propertyValue="MySub”)! })! public class MyMDB implements MessageListener{! ……!83 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  84. 84. 遅延配信 •  メッセージ配信におけるスケジューリングが可能 •  MessageProducer に対する新規追加メソッド –  Public void setDeliveryDelay (long deliveryDelay) •  生成したメッセージを、メッセージプロバイダ上で、コ ンシュマーに配信するまで保持する時間をミリ秒で指定84 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  85. 85. サーバからの非同期応答を受け取る  メッセージ配信 •  メッセージを送信後、応答をサーバから受け取るまで処 理をブロックせずに即座に返す •  応答を受信した際、代わりに非同期コールバックを呼び 出す producer.send(message, new AcknowledgeListener(){! public void onAcknowledge(Message message){! // ACK に対する処理! }! });!85 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  86. 86. JMSXDeliveryCount が必須に •  JMS 1.1 では JMSXDeliveryCount のプロパティは  省略可能 –  使用した場合: •  メッセージを受信した際、JMSプロバイダが設定を実施 •  メッセージが配信された回数を設定(最初の配信も含め) •  初回配信時:1、次回配信時:2 •  JMS 2.0 では必須86 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  87. 87. トピックの階層構造 ‒ 詳細検討中 •  トピックを階層構造に配置可能 –  STOCK.NASDAQ.TECH.ORCL –  STOCK.NASDAQ.TECH.GOOG –  STOCK.NASDAQ.TECH.ADBE –  STOCK.NYSE.TECH.HPQ •  コンシュマーはワイルドカードでサブスクライブ可能 –  STOCK.*.TECH.* –  STOCK.NASDAQ.TECH.*87 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  88. 88. 特定トピックのサブスクリプションに 対する複数のコンシュマー •  スケーラビリティの向上を目的 •  トピックのサブスクリプションからのメッセージをスケ ーラブルに処理可能 –  マルチスレッド –  マルチ JavaVM •  永続サブスクリプションのAPIには変更無し •  非永続サブスクリプション用の新規 API MessageConsumermessageConsumer =! session.createSharedConsumer(topic,sharedSubscriptionName);!88 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  89. 89. バッチ配信 •  メッセージをバッチで非同期配信 •  MessageConsumer に対する新規追加メソッド void setBatchMessageListener(! BatchMessageListener listener,int batchSize,long batchTimeOut)! •  新規 BatchMessageListener リスナー void onMessages(Message[]messages)! •  ACK もバッチで送信 •  JMSプロバイダもしくはアプリケーションの効果的利用89 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  90. 90. 90 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8
  91. 91. 91 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 8

×