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

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

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

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

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

  1. Session Beanのオブジェクトの所在をネーミングサービスに問い合わせ、Homeインタフェースにオブジェクトを取得します(lookup処理)。
  2. Homeインタフェースを介して、Session Beanのインスタンスを生成し、Remoteインタフェースにインスタンスを取得します(create処理)。
  3. Remoteインタフェースを介して、ビジネスメソッドを呼び出します。
  4. Remoteインタフェースを介して、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";
                
                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);
                }
                catch (javax.naming.NameNotFoundException e) {
                        e.printStackTrace();
                }
                catch(javax.naming.NamingException e) {
                        e.printStackTrace();
                }
                
                HelloEJBRemote eb = null;
                try {
                        eb = home.create();
                }
                catch (java.rmi.RemoteException e) {
                        e.printStackTrace();
                }
                catch (javax.ejb.CreateException e) {
                        e.printStackTrace();
                }
                
                try {
                        System.out.println(eb.hello());
                }
                catch (java.rmi.RemoteException e) {
                        e.printStackTrace();
                }
                
                try {
                        eb.remove();
                        eb = null;
                }
                catch (java.rmi.RemoteException e) {
                        e.printStackTrace();
                }
                catch (javax.ejb.RemoveException e) {
                        e.printStackTrace();
                }
        }
}

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

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

++データ挿入

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

++データ削除

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

++データ検索(更新)

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

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

  1. Entity Beanのオブジェクトの所在をネーミングサービスに問い合わせ、Homeインタフェースにオブジェクトを取得します(lookup処理)。
  2. Homeインタフェースを介して、インスタンスに依存しない処理を行う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";
                
                MemberBmpHome home = null;
                MemberBmpRemote eb = null;
                try {
                        javax.naming.Context ic = new javax.naming.InitialContext();
                        java.lang.Object obj = (Object)ic.lookup(lookupId);
                        home = (MemberBmpHome)javax.rmi.PortableRemoteObject.narrow(obj, MemberBmpHome.class);
                }
                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 = (MemberBmpRemote)javax.rmi.PortableRemoteObject.narrow(ebs.next(),MemberBmpRemote.class);
                                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 (java.rmi.RemoteException e) {
                        e.printStackTrace();
                }
                catch (javax.ejb.FinderException e) {
                        e.printStackTrace();
                }
        }
}

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

Message-driven Beanの場合は、直接呼出しは行わず、メッセージサービスにメッセージを送信します。
メッセージを送信する手順を以下に示します。

Interstage Application Server V9.0.1以降では、Webアプリケーション、EJBアプリケーションまたはJ2EEクライアントアプリケーションからJNDIを使用してJMS Destinationをlookupすることで、Message-driven Beanを呼び出すことができます。詳細は、"J2EE1.4 Message-driven Beanの呼び出し方法"を参照してください。

++Point-To-Pointモデルの場合

  1. QueueConnectionFactoryオブジェクトを取得します(lookup処理)。
  2. Queueオブジェクトを取得します(lookup処理)。
  3. QueueConnectionを作成します。
  4. QueueSessionを作成します。
  5. QueueSenderを作成します。
  6. メッセージを送信します。
  7. QueueConnectionをクローズします。

以下にキューにメッセージを送信する例を示します。

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

public class QueueSender {
        public static void main(String [] args) {
                final String factoryName = "java:comp/env/jms/TestQueueFactory ";
                final String queueName = "java:comp/env/jms/TestQueue ";
                
                javax.jms.QueueConnectionFactory factory = null;
                javax.jms.Queue queue = null;
                javax.jms.QueueConnection queueConnection = null;
                javax.jms.QueueSession queueSession = null;
                javax.jms.QueueSender queueSender = null;
                javax.jms.TextMessage textMessage = null;
                try {
                        javax.naming.InitialContext ic = new javax.naming.InitialContext();
                        factory = (javax.jms.QueueConnectionFactory)ic.lookup(factoryName);
                        queue = (javax.jms.Queue)ic.lookup(queueName);
                        queueConnection = factory.createQueueConnection();
                        queueSession = queueConnection.createQueueSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
                        queueSender = queueSession.createSender(queue);
                        
                        textMessage = queueSession.createTextMessage();
                        
                        queueSender.send(textMessage);
                        
                        queueConnection.close();
                }
                catch (javax.naming.NamingException ex) {
                        ex.printStackTrace();
                }
                catch (javax.jms.JMSException ex) {
                        ex.printStackTrace();
                }
        }
}

++Publish/Subscribeモデルの場合

  1. TopicConnectionFactoryオブジェクトを取得します(lookup処理)。
  2. Topicオブジェクトを取得します(lookup処理)。
  3. TopicConnectionを作成します。
  4. TopicSessionを作成します。
  5. TopicPublisherを作成します。
  6. メッセージを送信します。
  7. TopicConnectionをクローズします。

以下にトピックにメッセージを送信する例を示します。

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

public class TopicClient {
        public static void main(String [] args) {
                final String factoryName = "java:comp/env/jms/TestTopicFactory ";
                final String topicName = "java:comp/env/jms/TestTopic ";
                
                javax.jms.TopicConnectionFactory factory = null;
                javax.jms.Topic topic = null;
                javax.jms.TopicConnection topicConnection = null;
                javax.jms.TopicSession topicSession = null;
                javax.jms.TopicPublisher topicPublisher = null;
                javax.jms.TextMessage textMessage = null;
                try {
                        javax.naming.InitialContext ic = new javax.naming.InitialContext();
                        factory = (javax.jms.TopicConnectionFactory)ic.lookup(factoryName);
                        topic = (javax.jms.Topic)ic.lookup(topicName);
                        topicConnection = factory.createTopicConnection();
                        topicSession = topicConnection.createTopicSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
                        topicPublisher = topicSession.createPublisher(topic);
                        
                        textMessage = topicSession.createTextMessage();
                        
                        topicPublisher.publish(textMessage);
                        
                        topicConnection.close();
                }
                catch (javax.naming.NamingException ex) {
                        ex.printStackTrace();
                }
                catch (javax.jms.JMSException ex) {
                        ex.printStackTrace();
                }
        }
}

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

All Rights Reserved, Copyright (C) 富士通株式会社 1998-2007