日本語PDF

12 Oracle Java Message Serviceの基本操作

次のトピックでは、Oracle Database Advanced Queuing (AQ)の基本操作のためのJava Message Service (JMS)管理インタフェースについて説明します。

DBMS_AQINに対するEXECUTE権限

ユーザーがDBMS_AQINパッケージ内のメソッドを直接コールすることはありませんが、DBMS_AQINに対するEXECUTE権限が必要です。次の構文を使用して実行します。

GRANT EXECUTE ON DBMS_AQIN to user; 

ConnectionFactoryの登録

ConnectionFactoryは、次の4つの方法で登録できます。

データベースを介した登録: JDBCコネクション・パラメータの使用

public static int registerConnectionFactory(java.sql.Connection connection,
                                            java.lang.String conn_name,
                                            java.lang.String hostname,
                                            java.lang.String oracle_sid,
                                            int portno,
                                            java.lang.String driver,
                                            java.lang.String type)
                                     throws JMSException

このメソッドは、JDBCコネクション・パラメータを使用し、データベースを介してQueueConnectionFactoryまたはTopicConnectionFactoryをLightweight Directory Access Protocol(LDAP)サーバーに登録します。このメソッドは静的であり、次のパラメータを取ります。

パラメータ 説明

connection

登録に使用されるJDBCコネクション

conn_name

登録されるコネクションの名前

hostname

Oracle Database Advanced Queuingを実行しているホストの名前

oracle_sid

Oracleシステム識別子

portno

ポート番号

driver

JDBCドライバの型

type

コネクション・ファクトリのタイプ(QUEUEまたはTOPIC)

registerConnectionFactoryに渡されるデータベース接続には、AQ_ADMINISTRATOR_ROLEを付与する必要があります。登録後は、Java Naming and Directory Interface(JNDI)を使用してコネクション・ファクトリを検索できます。

例12-1 データベースを介した登録: JDBCコネクション・パラメータの使用

String               url;
java.sql.connection  db_conn;

url = "jdbc:oracle:thin:@sun-123:1521:db1";
db_conn = DriverManager.getConnection(url, "scott", "tiger");
AQjmsFactory.registerConnectionFactory(
   db_conn, "queue_conn1", "sun-123", "db1", 1521, "thin", "queue");

データベースを介した登録: JDBC URLの使用

public static int registerConnectionFactory(java.sql.Connection connection,
                                            java.lang.String conn_name,
                                            java.lang.String jdbc_url,
                                            java.util.Properties info,
                                            java.lang.String type)
                                     throws JMSException

このメソッドは、JDBC URLを使用し、データベースを介してQueueConnectionFactoryまたはTopicConnectionFactoryをLDAPに登録します。これは静的であり、次のパラメータを取ります。

パラメータ 説明

connection

登録に使用されるJDBCコネクション

conn_name

登録されるコネクションの名前

jdbc_url

接続先のURL

info

プロパティの情報

portno

ポート番号

type

コネクション・ファクトリのタイプ(QUEUEまたはTOPIC)

registerConnectionFactoryに渡されるデータベース接続には、AQ_ADMINISTRATOR_ROLEを付与する必要があります。登録後、JNDIを使用してコネクション・ファクトリを検索できます。

例12-2 データベースを介した登録: JDBC URLの使用

String                        url;
java.sql.connection           db_conn;

url = "jdbc:oracle:thin:@sun-123:1521:db1";
db_conn = DriverManager.getConnection(url, "scott", "tiger");
AQjmsFactory.registerConnectionFactory(
   db_conn, "topic_conn1", url, null, "topic");

LDAPを介した登録: JDBCコネクション・パラメータの使用

public static int registerConnectionFactory(java.util.Hashtable env,
                                            java.lang.String conn_name,
                                            java.lang.String hostname,
                                            java.lang.String oracle_sid,
                                            int portno,
                                            java.lang.String driver,
                                            java.lang.String type)
                                     throws JMSException

このメソッドは、JDBCコネクション・パラメータを使用し、LDAPを介してQueueConnectionFactoryまたはTopicConnectionFactoryをLDAPに登録します。これは静的であり、次のパラメータを取ります。

パラメータ 説明

env

LDAPコネクションの環境

conn_name

登録されるコネクションの名前

hostname

Oracle Database Advanced Queuingを実行しているホストの名前

oracle_sid

Oracleシステム識別子

portno

ポート番号

driver

JDBCドライバの型

type

コネクション・ファクトリのタイプ(QUEUEまたはTOPIC)

registerConnectionFactory()に渡されるハッシュ表に、LDAPサーバーと使用可能なコネクションを確立するための情報が含まれている必要があります。さらに、このコネクションには、LDAPサーバー内のコネクション・ファクトリのエントリに対する書込み権限が必要です(LDAPユーザーがデータベースそのものであるか、またはLDAPユーザーにGLOBAL_AQ_USER_ROLEが付与されている必要があります)。登録後、JNDIを使用してコネクション・ファクトリを検索します。

例12-3 LDAPを介した登録: JDBCコネクション・パラメータの使用

Hashtable            env = new Hashtable(5, 0.75f);
/* the following statements set in hashtable env:
   * service provider package
   * the URL of the ldap server
   * the distinguished name of the database server
   * the authentication method (simple)
   * the LDAP username
   * the LDAP user password
*/
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://sun-456:389");
env.put("searchbase", "cn=db1,cn=Oraclecontext,cn=acme,cn=com");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=db1aqadmin,cn=acme,cn=com");
env.put(Context.SECURITY_CREDENTIALS, "welcome");

AQjmsFactory.registerConnectionFactory(env, 
                                       "queue_conn1", 
                                       "sun-123",
                                       "db1", 
                                       1521, 
                                       "thin", 
                                       "queue");

LDAPを介した登録: JDBC URLの使用

public static int registerConnectionFactory(java.util.Hashtable env,
                                            java.lang.String conn_name,
                                            java.lang.String jdbc_url,
                                            java.util.Properties info,
                                            java.lang.String type)
                                     throws JMSException

このメソッドは、JDBCコネクション・パラメータを使用し、LDAPを介してQueueConnectionFactoryまたはTopicConnectionFactoryをLDAPに登録します。これは静的であり、次のパラメータを取ります。

パラメータ 説明

env

LDAPコネクションの環境

conn_name

登録されるコネクションの名前

jdbc_url

接続先のURL

info

プロパティの情報

type

コネクション・ファクトリのタイプ(QUEUEまたはTOPIC)

registerConnectionFactory()に渡されるハッシュ表に、LDAPサーバーと使用可能なコネクションを確立するための情報が含まれている必要があります。さらに、このコネクションには、LDAPサーバー内のコネクション・ファクトリのエントリに対する書込み権限が必要です(LDAPユーザーがデータベースそのものであるか、またはLDAPユーザーにGLOBAL_AQ_USER_ROLEが付与されている必要があります)。登録後、JNDIを使用してコネクション・ファクトリを検索します。

例12-4 LDAPを介した登録: JDBC URLの使用

String               url;
Hashtable            env = new Hashtable(5, 0.75f);

/* the following statements set in hashtable env:
   * service provider package
   * the URL of the ldap server
   * the distinguished name of the database server
   * the authentication method (simple)
   * the LDAP username
   * the LDAP user password
*/
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://sun-456:389");
env.put("searchbase", "cn=db1,cn=Oraclecontext,cn=acme,cn=com");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=db1aqadmin,cn=acme,cn=com");
env.put(Context.SECURITY_CREDENTIALS, "welcome");
url = "jdbc:oracle:thin:@sun-123:1521:db1";
AQjmsFactory.registerConnectionFactory(env, "topic_conn1", url, null, "topic");

キュー/トピックConnectionFactoryの登録解除

LDAPのキュー/トピックConnectionFactoryを登録解除するには、2つの方法があります。

データベースを介した登録解除

public static int unregisterConnectionFactory(java.sql.Connection connection,
                                              java.lang.String conn_name)
                                       throws JMSException

このメソッドは、LDAP内のQueueConnectionFactoryまたはTopicConnectionFactoryの登録を解除します。これは静的であり、次のパラメータを取ります。

パラメータ 説明

connection

登録に使用されるJDBCコネクション

conn_name

登録されるコネクションの名前

unregisterConnectionFactory()に渡されるデータベース接続には、AQ_ADMINISTRATOR_ROLEを付与する必要があります。

例12-5 データベースを介した登録解除

String               url;
java.sql.connection  db_conn;

url = "jdbc:oracle:thin:@sun-123:1521:db1";
db_conn = DriverManager.getConnection(url, "scott", "tiger");
AQjmsFactory.unregisterConnectionFactory(db_conn, "topic_conn1");

LDAPを介した登録解除

public static int unregisterConnectionFactory(java.util.Hashtable env,
                                              java.lang.String conn_name)
                                       throws JMSException

このメソッドは、LDAP内のQueueConnectionFactoryまたはTopicConnectionFactoryの登録を解除します。これは静的であり、次のパラメータを取ります。

パラメータ 説明

env

LDAPコネクションの環境

conn_name

登録されるコネクションの名前

unregisterConnectionFactory()に渡されるハッシュ表に、LDAPサーバーと使用可能なコネクションを確立するための情報が含まれている必要があります。さらに、このコネクションには、LDAPサーバー内のコネクション・ファクトリのエントリに対する書込み権限が必要です(LDAPユーザーがデータベースそのものであるか、またはLDAPユーザーにGLOBAL_AQ_USER_ROLEが付与されている必要があります)。

例12-6 LDAPを介した登録解除

Hashtable            env = new Hashtable(5, 0.75f);

/* the following statements set in hashtable env:
   * service provider package
   * the distinguished name of the database server
   * the authentication method (simple)
   * the LDAP username
   * the LDAP user password
*/
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://sun-456:389");
env.put("searchbase", "cn=db1,cn=Oraclecontext,cn=acme,cn=com");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=db1aqadmin,cn=acme,cn=com");
env.put(Context.SECURITY_CREDENTIALS, "welcome");
url = "jdbc:oracle:thin:@sun-123:1521:db1";
AQjmsFactory.unregisterConnectionFactory(env, "queue_conn1");

QueueConnectionFactoryまたはTopicConnectionFactoryの取得

この項の内容は次のとおりです。

QueueConnectionFactoryの取得: JDBC URLの使用

public static javax.jms.QueueConnectionFactory getQueueConnectionFactory(
              java.lang.String jdbc_url,
              java.util.Properties info)
       throws JMSException

このメソッドは、JDBC URLを使用してQueueConnectionFactoryを取得します。これは静的であり、次のパラメータを取ります。

パラメータ 説明

jdbc_url

接続先のURL

info

プロパティの情報

例12-7 QueueConnectionFactoryの取得: JDBC URLの使用

 String      url          = "jdbc:oracle:oci10:internal/oracle"
 Properties  info         = new Properties();
 QueueConnectionFactory   qc_fact;

 info.put("internal_logon", "sysdba");
 qc_fact = AQjmsFactory.getQueueConnectionFactory(url, info);

QueueConnectionFactoryの取得: JDBCコネクション・パラメータの使用

public static javax.jms.QueueConnectionFactory getQueueConnectionFactory(
              java.lang.String hostname,
              java.lang.String oracle_sid,
              int portno,
              java.lang.String driver)
       throws JMSException

このメソッドは、JDBC接続パラメータを使用してQueueConnectionFactoryを取得します。これは静的であり、次のパラメータを取ります。

パラメータ 説明

hostname

Oracle Database Advanced Queuingを実行しているホストの名前

oracle_sid

Oracleシステム識別子

portno

ポート番号

driver

JDBCドライバの型

例12-8 QueueConnectionFactoryの取得: JDBCコネクション・パラメータの使用

 String      host         = "dlsun";
 String      ora_sid      = "rdbms10i"
 String      driver       = "thin";
 int         port         = 5521;
 QueueConnectionFactory   qc_fact;

 qc_fact = AQjmsFactory.getQueueConnectionFactory(host, ora_sid, port, driver);

TopicConnectionFactoryの取得: JDBC URLの使用

public static javax.jms.QueueConnectionFactory getQueueConnectionFactory(
              java.lang.String jdbc_url,
              java.util.Properties info)
       throws JMSException

このメソッドは、JDBC URLを使用してTopicConnectionFactoryを取得します。これは静的であり、次のパラメータを取ります。

パラメータ 説明

jdbc_url

接続先のURL

info

プロパティの情報

例12-9 TopicConnectionFactoryの取得: JDBC URLの使用

 String      url          = "jdbc:oracle:oci10:internal/oracle"
 Properties  info         = new Properties();
 TopicConnectionFactory   tc_fact;

 info.put("internal_logon", "sysdba");
 tc_fact = AQjmsFactory.getTopicConnectionFactory(url, info);

TopicConnectionFactoryの取得: JDBCコネクション・パラメータの使用

public static javax.jms.TopicConnectionFactory getTopicConnectionFactory(
              java.lang.String hostname,
              java.lang.String oracle_sid,
              int portno,
              java.lang.String driver)
       throws JMSException

このメソッドは、JDBC接続パラメータを使用してTopicConnectionFactoryを取得します。これは静的であり、次のパラメータを取ります。

パラメータ 説明

hostname

Oracle Database Advanced Queuingを実行しているホストの名前

oracle_sid

Oracleシステム識別子

portno

ポート番号

driver

JDBCドライバの型

例12-10 TopicConnectionFactoryの取得: JDBCコネクション・パラメータの使用

String      host         = "dlsun";
String      ora_sid      = "rdbms10i"
String      driver       = "thin";
int         port         = 5521;
TopicConnectionFactory   tc_fact;

tc_fact = AQjmsFactory.getTopicConnectionFactory(host, ora_sid, port, driver);

LDAP内のQueueConnectionFactoryまたはTopicConnectionFactoryの取得

このメソッドは、LDAPからQueueConnectionFactoryまたはTopicConnectionFactoryを取得します。

例12-11 LDAP内のQueueConnectionFactoryまたはTopicConnectionFactoryの取得

Hashtable              env = new Hashtable(5, 0.75f);
DirContext             ctx;
queueConnectionFactory qc_fact;

/* the following statements set in hashtable env:
   * service provider package
   * the URL of the ldap server
   * the distinguished name of the database server
   * the authentication method (simple)
   * the LDAP username
   * the LDAP user password
*/
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://sun-456:389");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=db1aquser1,cn=acme,cn=com");
env.put(Context.SECURITY_CREDENTIALS, "welcome");

ctx = new InitialDirContext(env);
ctx = (DirContext)ctx.lookup("cn=OracleDBConnections,cn=db1,cn=Oraclecontext,cn=acme,cn=com");
qc_fact = (queueConnectionFactory)ctx.lookup("cn=queue_conn1");

LDAP内のキューまたはトピックの取得

このメソッドは、LDAPからキューまたはトピックを取得します。

例12-12 LDAP内のキューまたはトピックの取得

Hashtable              env = new Hashtable(5, 0.75f);
DirContext             ctx;
topic                  topic_1;

/* the following statements set in hashtable env:
   * service provider package
   * the URL of the ldap server
   * the distinguished name of the database server
   * the authentication method (simple)
   * the LDAP username
   * the LDAP user password
*/
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://sun-456:389");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=db1aquser1,cn=acme,cn=com");
env.put(Context.SECURITY_CREDENTIALS, "welcome");

ctx = new InitialDirContext(env);
ctx = (DirContext)ctx.lookup("cn=OracleDBQueues,cn=db1,cn=Oraclecontext,cn=acme,cn=com");
topic_1 = (topic)ctx.lookup("cn=topic_1");

非シャード・キュー表の作成

public oracle.AQ.AQQueueTable createQueueTable(
                 java.lang.String owner,
                 java.lang.String name,
                 oracle.AQ.AQQueueTableProperty property)
          throws JMSException

このメソッドはキュー表を作成します。次のパラメータがあります。

パラメータ 説明

owner

キュー表の所有者(スキーマ)

name

キュー表名

property

キュー表のプロパティ

キューを保持するためにキュー表を使用する場合、キュー表はマルチコンシューマに対して使用可能にすることはできません(デフォルト)。トピックを保持するためにキュー表を使用する場合、キュー表はマルチコンシューマに対して使用可能にする必要があります。

CLOBBLOBおよびBFILEオブジェクトはOracle Database Advanced Queuingオブジェクト型のロードで有効な属性です。ただし、CLOBおよびBLOBのみ、Oracle8i以降のOracle Database Advanced Queuing 伝播を使用して伝播できます。

注意:

現在、JMSシャード・キューは、DBMS_AQADM PL/SQL APIを介してのみ作成および削除できます。

例12-13 キュー表の作成

QueueSession              q_sess    = null;
AQQueueTable              q_table   = null;
AQQueueTableProperty      qt_prop   = null;

qt_prop = new AQQueueTableProperty("SYS.AQ$_JMS_BYTES_MESSAGE");
q_table = ((AQjmsSession)q_sess).createQueueTable(
    "boluser", "bol_ship_queue_table", qt_prop);

キューの作成

この項の内容は次のとおりです。

Point-to-Pointキューの作成

public javax.jms.Queue createQueue(
             oracle.AQ.AQQueueTable q_table,
             java.lang.String queue_name,
             oracle.jms.AQjmsDestinationProperty dest_property)
      throws JMSException

このメソッドは、指定したキュー表にキューを作成します。次のパラメータがあります。

パラメータ 説明

q_table

キューが作成されるキュー表。キュー表はシングル・コンシューマ・キュー表である必要があります。

queue_name

作成されるキューの名前。

dest_property

キューのプロパティ。

このメソッドは、Oracle JMSに固有です。このメソッドでは標準のJava javax.jms.Sessionオブジェクトは使用できません。かわりに、標準の型をOracle JMSの具体的なクラスoracle.jms.AQjmsSessionにキャストする必要があります。

例12-14 Point-to-Pointキューの作成

QueueSession             q_sess;
AQQueueTable             q_table;
AqjmsDestinationProperty dest_prop;
Queue                    queue;

queue = ((AQjmsSession)q_sess).createQueue(q_table, "jms_q1", dest_prop);

パブリッシュ・サブスクライブ・トピックの作成

public javax.jms.Topic createTopic(
             oracle.AQ.AQQueueTable q_table,
             java.lang.String topic_name,
             oracle.jms.AQjmsDestinationProperty dest_property)
      throws JMSException

このメソッドは、パブリッシュ・サブスクライブ・モデルにトピックを作成します。次のパラメータがあります。

パラメータ 説明

q_table

キューが作成されるキュー表。キュー表はマルチ・コンシューマ・キュー表である必要があります。

queue_name

作成されるキューの名前。

dest_property

キューのプロパティ。

このメソッドは、Oracle JMSに固有です。このメソッドでは標準のJava javax.jms.Sessionオブジェクトは使用できません。かわりに、標準の型をOracle JMSの具体的なクラスoracle.jms.AQjmsSessionにキャストする必要があります。

例12-16では、在庫不足のために受注を満たせない場合は、注文を処理しているトランザクションが終了されます。bookedordersトピックは、max_retries = 4、retry_delay = 12時間で設定されています。したがって、注文が2日で満たされない場合は、例外キューに移動されます。

例12-15 パブリッシュ・サブスクライブ・トピックの作成

TopicSession             t_sess;
AQQueueTable             q_table;
AqjmsDestinationProperty dest_prop;
Topic                    topic;

topic = ((AQjmsSessa)t_sess).createTopic(q_table, "jms_t1", dest_prop);

例12-16 メッセージの最大試行回数と最大遅延の指定

public BolOrder process_booked_order(TopicSession jms_session)
  {
    Topic            topic;
    TopicSubscriber  tsubs;
    ObjectMessage    obj_message;
    BolCustomer      customer;
    BolOrder         booked_order = null;
    String           country;
    int              i = 0;

    try
    {
      /* get a handle to the OE_bookedorders_topic */
      topic = ((AQjmsSession)jms_session).getTopic("WS",
                                                   "WS_bookedorders_topic");

      /* Create local subscriber - to track messages for Western Region  */
      tsubs = jms_session.createDurableSubscriber(topic, "SUBS1",
                                       "Region = 'Western' ",
                                                   false);

       /* wait for a message to show up in the topic */
       obj_message = (ObjectMessage)tsubs.receive(10);

       booked_order = (BolOrder)obj_message.getObject();

       customer = booked_order.getCustomer();
       country    = customer.getCountry();

       if (country == "US")
       {
          jms_session.commit();
       }
       else
       {
          jms_session.rollback();
          booked_order = null;
       }
    }catch (JMSException ex)
    { System.out.println("Exception " + ex) ;}

     return booked_order;
   }

Point-to-Pointキューおよびパブリッシュ・サブスクライブ・トピックのためのシャード・キューの作成

AQ JMSでは、シャード・キューを作成および削除するための新しいAPIが定義されました。JMSにはキュー変更APIはありません。署名は次のとおりです。

    /**
     * Create a JMS sharded queue. It also internally creates the related queue
     * objects (table, indexes) based on this name.
     *
     * @param queueName name of the queue to be created, format is schema.queueName
     *        (where the schema. is optional
     * @param isMultipleConsumer flag to indicate whether the queue is a
     *        multi-consumer or single-consumer queue
     * @return javax.jms.Destination
     * @throws JMSException if the queue could not be created
     */
    public synchronized javax.jms.Destination createJMSShardedQueue(String queueName,
            boolean isMultipleConsumer) throws JMSException {
        return createJMSShardedQueue(queueName, isMultipleConsumer, null, 0, null);
    }
    /**
     * Create a JMS sharded queue. It also internally creates the related queue
     * objects (table, indexes) based on this name.
     *
     * @param queueName name of the queue to be created, format is schema.queueName
     *        (where the schema. is optional
     * @param isMultipleConsumer flag to indicate whether the queue is a
     *        multi-consumer or single-consumer queue
     * @param storageClause additional storage clause
     * @param maxRetries retry count before skip the message while dequeue
     * @param comment comment for the queue
     * @return javax.jms.Destination
     * @throws JMSException if the queue could not be created 
*/
public Destination createJMSShardedQueue(java.lang.String queueName,
                                         boolean isMultipleConsumer,
                                         java.lang.String storageClause,
                                         int maxRetries,
                                         java.lang.String comment)
                                  throws JMSException

非シャード・キュー表の取得

public oracle.AQ.AQQueueTable getQueueTable(java.lang.String owner,
                                            java.lang.String name)
                                     throws JMSException

このメソッドは、非シャード・キューのキュー表を取得します。次のパラメータがあります。

パラメータ 説明

owner

キュー表の所有者(スキーマ)

name

キュー表名

コネクションをオープンしたコール側がキュー表の所有者ではない場合、コール側にはキュー表内のキュー/トピックに対するOracle Database Advanced Queuingエンキュー/デキュー権限が必要です。この権限がない場合、キュー表は取得できません。

例12-17 キュー表の取得

QueueSession              q_sess;
AQQueueTable              q_table;

q_table = ((AQjmsSession)q_sess).getQueueTable(
   "boluser", "bol_ship_queue_table");

権限の付与および取消し

この項の内容は次のとおりです。

Oracle Database Advanced Queuingシステム権限の付与

public void grantSystemPrivilege(java.lang.String privilege,
                                 java.lang.String grantee,
                                 boolean admin_option)
                          throws JMSException

このメソッドは、ユーザーおよびロールにOracle Database Advanced Queuingシステム権限を付与します。

パラメータ 説明

privilege

ENQUEUE_ANYDEQUEUE_ANYまたはMANAGE_ANY

grantee

権限受領者(ユーザー、ロールまたはPUBLIC)

admin_option

TRUEに設定すると、権限受領者はこのプロシージャを使用して他のユーザーまたはロールにシステム権限を付与できます。

最初は、SYSおよびSYSTEMのみがこのプロシージャを正常に使用できます。ENQUEUE_ANY権限を付与されたユーザーは、データベース内の任意のキューにメッセージをエンキューできます。DEQUEUE_ANY権限を付与されたユーザーは、データベース内の任意のキューからメッセージをデキューできます。MANAGE_ANY権限を付与されたユーザーは、データベースのすべてのスキーマに対してDBMS_AQADMコールを実行できます。

例12-18 Oracle Database Advanced Queuingシステム権限の付与

TopicSession             t_sess;

((AQjmsSession)t_sess).grantSystemPrivilege("ENQUEUE_ANY", "scott", false);

Oracle Database Advanced Queuingシステム権限の取消し

public void revokeSystemPrivilege(java.lang.String privilege,
                                  java.lang.String grantee)
                           throws JMSException

このメソッドは、ユーザーまたはロールからOracle Database Advanced Queuingシステム権限を取り消します。次のパラメータがあります。

パラメータ 説明

privilege

ENQUEUE_ANYDEQUEUE_ANYまたはMANAGE_ANY

grantee

権限受領者(ユーザー、ロールまたはPUBLIC)

ENQUEUE_ANY権限を付与されたユーザーは、データベース内の任意のキューにメッセージをエンキューできます。DEQUEUE_ANY権限を付与されたユーザーは、データベース内の任意のキューからメッセージをデキューできます。MANAGE_ANY権限を付与されたユーザーは、データベースのすべてのスキーマに対してDBMS_AQADMコールを実行できます。

例12-19 Oracle Database Advanced Queuingシステム権限の取消し

TopicSession             t_sess;

((AQjmsSession)t_sess).revokeSystemPrivilege("ENQUEUE_ANY", "scott");

パブリッシュ・サブスクライブ・トピック権限の付与

public void grantTopicPrivilege(javax.jms.Session session,
                                java.lang.String privilege,
                                java.lang.String grantee,
                                boolean grant_option)
                         throws JMSException

このメソッドは、パブリッシュ・サブスクライブ・モデルでトピック権限を付与します。初期設定では、キュー表の所有者のみがこのプロシージャを使用してそのトピックの権限を付与できます。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

privilege

ENQUEUEDEQUEUEまたはALL(ALLは両方を意味します。)

grantee

権限受領者(ユーザー、ロールまたはPUBLIC)

grant_option

TRUEに設定すると、権限受領者はこのプロシージャを使用して他のユーザーまたはロールにシステム権限を付与できます。

例12-20 パブリッシュ・サブスクライブ・トピック権限の付与

TopicSession             t_sess;
Topic                    topic;

((AQjmsDestination)topic).grantTopicPrivilege(
   t_sess, "ENQUEUE", "scott", false);

パブリッシュ・サブスクライブ・トピック権限の取消し

public void revokeTopicPrivilege(javax.jms.Session session,
                                 java.lang.String privilege,
                                 java.lang.String grantee)
                          throws JMSException

このメソッドは、パブリッシュ・サブスクライブ・モデルでトピック権限を取り消します。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

privilege

ENQUEUEDEQUEUEまたはALL(ALLは両方を意味します。)

grantee

権限が取り消される権限受領者(ユーザー、ロールまたはPUBLIC)

例12-21 パブリッシュ・サブスクライブ・トピック権限の取消し

TopicSession             t_sess;
Topic                    topic;

((AQjmsDestination)topic).revokeTopicPrivilege(t_sess, "ENQUEUE", "scott");

Point-to-Pointキュー権限の付与

public void grantQueuePrivilege(javax.jms.Session session,
                                java.lang.String privilege,
                                java.lang.String grantee,
                                boolean grant_option)
                         throws JMSException

このメソッドは、Point-to-Pointモデルでキュー権限を付与します。初期設定では、キュー表の所有者のみがこのプロシージャを使用してそのキューの権限を付与できます。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

privilege

ENQUEUEDEQUEUEまたはALL(ALLは両方を意味します。)

grantee

権限受領者(ユーザー、ロールまたはPUBLIC)

grant_option

TRUEに設定すると、権限受領者はこのプロシージャを使用して他のユーザーまたはロールにシステム権限を付与できます。

例12-22 Point-to-Pointキュー権限の付与

QueueSession             q_sess;
Queue                    queue;

((AQjmsDestination)queue).grantQueuePrivilege(
   q_sess, "ENQUEUE", "scott", false);

Point-to-Pointキュー権限の取消し

public void revokeQueuePrivilege(javax.jms.Session session,
                                 java.lang.String privilege,
                                 java.lang.String grantee)
                          throws JMSException

このメソッドは、Point-to-Pointモデルでキュー権限を取り消します。初期設定では、キュー表の所有者のみがこのプロシージャを使用してそのキューの権限を付与できます。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

privilege

ENQUEUEDEQUEUEまたはALL(ALLは両方を意味します。)

grantee

権限が取り消される権限受領者(ユーザー、ロールまたはPUBLIC)

権限を取り消すには、取消し実行者がその権限の付与者である必要があります。また、GRANTオプションによって伝播された権限は、伝播させた付与者の権限が取り消されたときに取り消されます。

例12-23 Point-to-Pointキュー権限の取消し

QueueSession             q_sess;
Queue                    queue;

((AQjmsDestination)queue).revokeQueuePrivilege(q_sess, "ENQUEUE", "scott");

宛先の管理

この項の内容は次のとおりです。

注意:

現在、JMSシャード・キューは、DBMS_AQADM PL/SQL APIを介してのみ管理できます。

宛先の開始

public void start(javax.jms.Session session,
                  boolean enqueue,
                  boolean dequeue)
           throws JMSException

このメソッドは、宛先を開始します。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

enqueue

TRUEに設定すると、エンキューが使用可能になります。

デキュー

TRUEに設定すると、デキューが使用可能になります。

例12-24 宛先の開始

TopicSession t_sess;
QueueSession q_sess;
Topic        topic;
Queue        queue;

(AQjmsDestination)topic.start(t_sess, true, true);
(AQjmsDestination)queue.start(q_sess, true, true);

宛先の停止

public void stop(javax.jms.Session session,
                 boolean enqueue,
                 boolean dequeue,
                 boolean wait)
          throws JMSException

このメソッドは、宛先を停止します。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

enqueue

TRUEに設定すると、エンキューが使用不可になります。

デキュー

TRUEに設定すると、デキューが使用不可になります。

wait

TRUEに設定すると、キュー/トピックの保留トランザクションは、宛先が停止する前に完了できます。

例12-25 宛先の停止

TopicSession t_sess;
Topic        topic;

((AQjmsDestination)topic).stop(t_sess, true, false);

宛先の変更

public void alter(javax.jms.Session session,
                  oracle.jms.AQjmsDestinationProperty dest_property)
           throws JMSException

このメソッドは、宛先を変更します。これには、次のプロパティがあります。

パラメータ 説明

session

JMSセッション

dest_property

キューまたはトピックの新規プロパティ

例12-26 宛先の変更

QueueSession q_sess;
Queue        queue;
TopicSession t_sess;
Topic        topic;
AQjmsDestionationProperty dest_prop1, dest_prop2;

((AQjmsDestination)queue).alter(dest_prop1);
((AQjmsDestination)topic).alter(dest_prop2);

宛先の削除

public void drop(javax.jms.Session session)
          throws JMSException

このメソッドは、宛先を削除します。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

例12-27 宛先の削除

QueueSession q_sess;
Queue        queue;
TopicSession t_sess;
Topic        topic;

((AQjmsDestionation)queue).drop(q_sess);
((AQjmsDestionation)topic).drop(t_sess);

伝播スケジュール

この項の内容は次のとおりです。

注意:

現在、JMSシャード・キューは、DBMS_AQADM PL/SQL APIを介してのみ管理され、伝播をサポートしていません。

伝播のスケジューリング

public void schedulePropagation(javax.jms.Session session,
                                java.lang.String destination,
                                java.util.Date start_time,
                                java.lang.Double duration,
                                java.lang.String next_time,
                                java.lang.Double latency)
                         throws JMSException

このメソッドは、伝播をスケジュールします。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

destination

伝播がスケジュールされているリモート・データベースのデータベース・リンク。文字列NULLは、伝播がトピックのデータベース内のすべてのサブスクライバに対してスケジュールされていることを示します。

start_time

伝播開始時刻。

duration

伝播継続時間。

next_time

次回の伝播開始時刻。

latency

許容可能な待機時間(秒単位)。待機時間は、メッセージがエンキューされた時間と伝播された時間の差異です。

メッセージ受信者が、同一または異なるキュー内の同じ宛先に複数存在する場合、メッセージはすべての受信者に同時に伝播されます。

例12-28 伝播のスケジューリング

TopicSession t_sess;
Topic        topic;

((AQjmsDestination)topic).schedulePropagation(
   t_sess, null, null, null, null, new Double(0));

伝播スケジュールの有効化

public void enablePropagationSchedule(javax.jms.Session session,
                                      java.lang.String destination)
                               throws JMSException

このメソッドは、伝播スケジュールを有効化します。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

destination

宛先データベースのデータベース・リンク。NULL文字列は、ローカル・データベースに伝播されることを意味します。

例12-29 伝播スケジュールの有効化

TopicSession             t_sess;
Topic                    topic;

((AQjmsDestination)topic).enablePropagationSchedule(t_sess, "dbs1");

伝播スケジュールの変更

public void alterPropagationSchedule(javax.jms.Session session,
                                     java.lang.String destination,
                                     java.lang.Double duration,
                                     java.lang.String next_time,
                                     java.lang.Double latency)
                              throws JMSException

このメソッドは、伝播スケジュールを変更します。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

destination

伝播がスケジュールされているリモート・データベースのデータベース・リンク。文字列NULLは、伝播がトピックのデータベース内のすべてのサブスクライバに対してスケジュールされていることを示します。

duration

伝播継続時間。

next_time

次回の伝播開始時刻。

latency

許容可能な待機時間(秒単位)。待機時間は、メッセージがエンキューされた時間と伝播された時間の差異です。

例12-30 伝播スケジュールの変更

TopicSession             t_sess;
Topic                    topic;

((AQjmsDestination)topic).alterPropagationSchedule(
   t_sess, null, 30, null, new Double(30));

伝播スケジュールの無効化

public void disablePropagationSchedule(javax.jms.Session session,
                                       java.lang.String destination)
                                throws JMSException

このメソッドは、伝播スケジュールを無効化します。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

destination

宛先データベースのデータベース・リンク。NULL文字列は、ローカル・データベースに伝播されることを意味します。

例12-31 伝播スケジュールの無効化

TopicSession             t_sess;
Topic                    topic;

((AQjmsDestination)topic).disablePropagationSchedule(t_sess, "dbs1");

伝播スケジュールの解除

public void unschedulePropagation(javax.jms.Session session,
                                  java.lang.String destination)
                           throws JMSException

このメソッドは、スケジュール済伝播のスケジュールを解除します。次のパラメータがあります。

パラメータ 説明

session

JMSセッション

destination

宛先データベースのデータベース・リンク。NULL文字列は、ローカル・データベースに伝播されることを意味します。

例12-32 伝播スケジュールの解除

TopicSession   t_sess;
Topic          topic;

((AQjmsDestination)topic).unschedulePropagation(t_sess, "dbs1");