Interstage Studio プログラマーズガイド
目次 索引 前ページ次ページ

第2部 Java編> 第4章 Enterprise JavaBeans (EJB)を開発する> 4.3 EJBのプログラミング

4.3.10 EJBクライアントプログラミング

+Session Beanのクライアントプログラミング

Session Beanが公開する機能(ビジネスメソッド)を使用するためには、以下の順序でプログラムする必要があります。

  1. Session Beanのオブジェクトの所在をネーミングサービスに問い合わせ、LocalHomeインタフェースにオブジェクトを取得します(lookup処理)。
  2. Homeインタフェースを介して、Session Beanのインスタンスを生成し、Localインタフェースにインスタンスを取得します(create処理)。
  3. Localインタフェースを介して、ビジネスメソッドを呼び出します。
  4. Localインタフェースを介して、Session Beanのインスタンス削除(解放)を行います(remove処理)。

以下にSession Beanを呼び出す例を示します。

import java.rmi.*;
import javax.rmi.*;
import javax.ejb.*;
import javax.naming.*;
import PackageHelloEJB.*;

public class SessionClient {
        
        public static void main(String [] args) {
                final String beanName = "java:comp/env/ejb/HelloEJB";
                
                HelloEJBLocalHome home = null;
                try {
                        javax.naming.Context ic = new javax.naming.InitialContext();
                        home = (HelloEJBLocalHome)ic.lookup(beanName);
                }
                catch (javax.naming.NameNotFoundException e) {
                        e.printStackTrace();
                }
                catch(javax.naming.NamingException e) {
                        e.printStackTrace();
                }
                
                HelloEJBLocal eb = null;
                try {
                        eb = home.create();
                }
                catch (javax.ejb.CreateException e) {
                        e.printStackTrace();
                }
                
                System.out.println(eb.hello());
                
                try {
                        eb.remove();
                        eb = null;
                }
                catch (javax.ejb.RemoveException e) {
                        e.printStackTrace();
                }
        }
}

リモート環境のクライアントからEJBにアクセスする場合は、Homeインタフェース、Remoteインタフェースを使用します。
Homeインタフェースのオブジェクト取得では以下のように記述します。
・・・
   HelloEJBHome home = null;
   try {
      javax.naming.Context ic = new javax.naming.InitialContext();
      java.lang.Object obj = (Object)ic.lookup(beanName);
      home = (HelloEJBHome) 
      javax.rmi.PortableRemoteObject.narrow(obj, HelloEJBHome.class);
   }
・・・

+Entity Beanのクライアントプログラミング

Entity Beanを用いて永続データを操作するためには、以下の順序でプログラムする必要があります。なお、lookup処理以降は、データ挿入、データ削除、データ検索(更新)、インスタンスに依存しないなどのデータ操作によって処理が異なります。

++データ挿入

  1. Entity Beanのオブジェクトの所在をネーミングサービスに問い合わせ、LocalHomeインタフェースにオブジェクトを取得します(lookup処理)。
  2. LocalHomeインタフェースを介して、挿入するデータのEntity Beanのインスタンス生成を行います(create処理)。

++データ削除

  1. Entity Beanのオブジェクトの所在をネーミングサービスに問い合わせ、LocalHomeインタフェースにオブジェクトを取得します(lookup処理)。
  2. LocalHomeインタフェースを介して、削除するデータに対応するEntity Beanのインスタンスを検索し、Localインタフェースに検索したインスタンスを取得します(find処理)。
  3. Localインタフェースを介して、インスタンスに対して削除処理を行います(remove処理)。

++データ検索(更新)

  1. Entity Beanのオブジェクトの所在をネーミングサービスに問い合わせ、LocalHomeインタフェースにオブジェクトを取得します(lookup処理)。
  2. LocalHomeインタフェースを介して、処理対象となるEntity Beanのインスタンスを検索し、Localインタフェースに検索したインスタンスを取得します(find処理)。
  3. Localインタフェースを介して、インスタンスに対して、データの取得または更新処理を行います。

++インスタンスに依存しない処理(EJB2.0以降)

  1. Entity Beanのオブジェクトの所在をネーミングサービスに問い合わせ、LocalHomeインタフェースにオブジェクトを取得します(lookup処理)。
  2. LocalHomeインタフェースを介して、インスタンスに依存しない処理を行うHomeメソッドを呼び出します。

以下にEntity Beanを呼び出す例を示します。

import java.rmi.*;
import javax.rmi.*;
import javax.ejb.*;
import javax.naming.*;
import Sample.*;

public class EntityClient {
        public static void main(String [] args) {
                final String lookupId = "java:comp/env/ejb/MemberBmp";
                
                MemberBmpLocalHome home = null;
                MemberBmpLocal eb = null;
                try {
                        javax.naming.Context ic = new javax.naming.InitialContext();
                        home = (MemberBmpLocal)ic.lookup(lookupId);
                                        }
                catch (javax.naming.NameNotFoundException e) {
                        e.printStackTrace();
                }
                catch (javax.naming.NamingException e) {
                        e.printStackTrace();
                }
                
                try {
                        java.util.Collection ebCollection = home.findBySalary(100);
                        java.util.Iterator ebs = ebCollection.iterator();
                        while(ebs.hasNext()) {
                                eb = (MemberBmpLocal)ebs.next();
                                System.out.println("NAME:" + eb.getNAME());
                                System.out.println("ID:" + eb.getID());
                                System.out.println("AGE:" + eb.getAGE());
                                System.out.println("SALARY:" + eb.getSALARY());
                        }
                }
                catch (javax.ejb.FinderException e) {
                        e.printStackTrace();
                }
        }
}

+Message-driven Beanのクライアントプログラミング

Webアプリケーション、EJBアプリケーションまたはJ2EEアプリケーションクライアントからMessage-driven Beanを呼び出す場合、JNDIを使用してJMS Destinationをlookupします。
J2EE1.4のMessage-driven Beanを呼び出す手順を以下に示します。

++deployment descriptorの編集

クライアントアプリケーションの形態に応じて以下のdeployment descriptorにJMS Destinationについて記述を定義する必要があります。

クライアントアプリケーションの形態

deployment descriptor

WebアプリケーションからJMSメッセージを送信する場合

web.xml

EJBアプリケーションからJMSメッセージを送信する場合

ejb-jar.xml

J2EEアプリケーションクライアントからJMSメッセージを送信する場合

application-client.xml

[Webアプリケーション(web.xml)での定義例]

<?xml version="1.0" encoding="UTF-8" ?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
             ・・・
      <message-destination-ref>
          <description>JMS Destination</description>
          <message-destination-ref-name>jms/Topic</message-destination-ref-name>
          <message-destination-type>javax.jms.Topic</message-destination-type>
          <message-destination-usage>Produces</message-destination-usage>
     </message-destination-ref >
</web-app>

deployment descriptorのタグの詳細は、"Interstage Application Server J2EEユーザーズガイド"を参照してください。

JMSメッセージを送信するJNDIを使用してJMS Destinationオブジェクトをlookupして、メッセージを送信します。

  1. InitialContextオブジェクトを生成する
    InitialContextオブジェクトを新規に生成します。

  2. ConnectionFactoryオブジェクトを取得する
    取得したInitialContextオブジェクトのlookupメソッドを使用して、ConnectionFactoryオブジェクトを取得します。
    lookupの引数には、以下の文字列を指定します。
    java:comp/env/[deployment descriptorの<resource-ref>に指定したコネクションファクトリ名]
  3. Destinationオブジェクトを取得する
    取得したInitialContextオブジェクトのlookupメソッドを使用して、Destinationオブジェクトを取得します。
    lookupの引数には、以下の文字列を指定します。
    java:comp/env/[deployment descriptorの<message-destination-ref-name>に指定したDestination名]
  4. Connectionを作成する
    ConnectionFactoryからcreateConnectionメソッドを使用して、Connectionオブジェクトを取得します。

  5. Sessionを作成する
    ConnectionのcreateSessionメソッドを使用して、Sessionオブジェクトを取得します。

  6. MessageProducerを作成する
    SessionのcreateProducerメソッドを使用して、MessageProducerオブジェクトを取得します。

  7. メッセージを送信する
    MessageProducerのsendメソッドを使用して作成したメッセージを送信します。

  8. Connectionをクローズする
    接続したConnectionのcloseメソッドを使用して、クローズします。

[JMS Destinationオブジェクトのlookupによるメッセージの送信例]

package sample;

import javax.jms.*;
import javax.naming.*;
 
public class TopicClient {
    public static void main(String[] args) {
        try {
            InitialContext initialContext = new InitialContext();
            ConnectionFactory connectionFactory = (ConnectionFactory) 
            initialContext.lookup("java:comp/env/jms/ConnectionFactory");
            Destination destination = (Destination) 
            initialContext.lookup("java:comp/env/jms/Topic");
            Connection connection = connectionFactory.createConnection(); 
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer messageProducer = session.createProducer(destination); 
            TextMessage Message = session.createTextMessage( ); 
            Message.setText( "Message" ); 
            messageProducer.send(Message);
            connection.close(); 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

J2EEアプリケーションクライアントからJNDIを使用する場合は、JNDIサービスプロバイダの環境設定をする必要があります。JNDIサービスプロバイダの環境設定については、"Interstage Application Server J2EEユーザーズガイド"を参照してください。

目次 索引 前ページ次ページ

Copyright 2007-2008 FUJITSU LIMITED