送信側の実装
今回は説明を簡単にするために、送信側はJavaアプリケーションで実装します。MDBSample02という名前で新規にプロジェクトを作ります。Javaアプリケーションは前編で作成したPtpSenderを改良すればすぐに作成できます。リスト3が送信側のImoshochuCatalogSenderのメッセージ送信メソッドのsendMeigaraメソッドです。
001: public void sendMeigara() { 002: QueueConnectionFactory myConnectionFactory = null; 003: Queue myQueue = null; 004: Connection myConnection = null; 005: Session mySession = null; 006: MessageProducer messageProducer = null; 007: ObjectMessage objectMessage = null; 008: ImoshochuCatalogItem catalog = null; 009: try { 010: // コネクションファクトリとデスティネーションの取得(アノテーションは使用せず) 011: Context c = new InitialContext(); 012: myConnectionFactory = (QueueConnectionFactory)c.lookup("jms/MDBSampleConnectionFactory"); 013: myQueue = (Queue)c.lookup("jms/MDBSampleQueue"); 014: 015: myConnection = myConnectionFactory.createQueueConnection(); 016: mySession = myConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); 017: // MessageProducerとTextMessageはSessionオブジェクトから生成される 018: messageProducer = mySession.createProducer(myQueue); 019: objectMessage = mySession.createObjectMessage(); 020: 021: catalog = new ImoshochuCatalogItem(); 022: catalog.setName("がんご焼酎屋"); 023: catalog.setNameKana("がんごしょうちゅうや"); 024: catalog.setDosu(25); 025: catalog.setKoji("白"); 026: catalog.setSweetPotatoName("ジョイホワイト"); 027: catalog.setManufacturer("大石酒造"); 028: catalog.setVolume(1.8f); 029: catalog.setPrice(2630); 030: 031: objectMessage.setObject(catalog); 032: messageProducer.send(objectMessage); 033: 034: } catch (JMSException e) { 035: e.printStackTrace(); 036: } catch (NamingException ne) { 037: ne.printStackTrace(); 038: } finally { 039: try { 040: if (myConnection != null) { 041: myConnection.close(); 042: } 043: } catch (Exception e) { 044: e.printStackTrace(); 045: myConnection = null; 046: } 047: try { 048: if (mySession != null) { 049: mySession.close(); 050: } 051: } catch (Exception e) { 052: e.printStackTrace(); 053: mySession = null; 054: } 055: try { 056: if (messageProducer != null) { 057: messageProducer.close(); 058: } 059: } catch (Exception e) { 060: e.printStackTrace(); 061: messageProducer = null; 062: } 063: } 064: }
リスト3を説明します。MDBを見た後ではコーディングが非常に冗長に感じます。前編のPtpSenderとの大きな違いはメッセージタイプがTextMessageではなくObjectMessageであることです(7行目)。残りはImoshochuCatalogItemオブジェクトのフィールドに値を設定し、そのオブジェクトをObjectMessageのsetObjectメソッドで設定しているところくらいです。
ImoshochuCatalogItemクラスはフィールド変数のgetter/setterメソッドを持った単なるJava Beansクラスであるため説明は割愛します。サンプルコードで確認してください。1点だけ注意しなければならないのは、ObjectMessageに設定するオブジェクトはSerializableでなければならないことです。