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)サーバーに登録します。このメソッドは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
登録に使用されるJDBCコネクション |
|
登録されるコネクションの名前 |
|
Oracle Database Advanced Queuingを実行しているホストの名前 |
|
Oracleシステム識別子 |
|
ポート番号 |
|
JDBCドライバの型 |
|
コネクション・ファクトリのタイプ( |
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に登録します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
登録に使用されるJDBCコネクション |
|
登録されるコネクションの名前 |
|
接続先のURL |
|
プロパティの情報 |
|
ポート番号 |
|
コネクション・ファクトリのタイプ( |
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に登録します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
LDAPコネクションの環境 |
|
登録されるコネクションの名前 |
|
Oracle Database Advanced Queuingを実行しているホストの名前 |
|
Oracleシステム識別子 |
|
ポート番号 |
|
JDBCドライバの型 |
|
コネクション・ファクトリのタイプ( |
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に登録します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
LDAPコネクションの環境 |
|
登録されるコネクションの名前 |
|
接続先のURL |
info |
プロパティの情報 |
|
コネクション・ファクトリのタイプ( |
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
の登録を解除します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
登録に使用されるJDBCコネクション |
|
登録されるコネクションの名前 |
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の登録を解除します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
LDAPコネクションの環境 |
|
登録されるコネクションの名前 |
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
を取得します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
接続先の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
を取得します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
Oracle Database Advanced Queuingを実行しているホストの名前 |
|
Oracleシステム識別子 |
|
ポート番号 |
|
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
を取得します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
接続先の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
を取得します。これは静的であり、次のパラメータを取ります。
パラメータ | 説明 |
---|---|
|
Oracle Database Advanced Queuingを実行しているホストの名前 |
|
Oracleシステム識別子 |
|
ポート番号 |
|
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
このメソッドはキュー表を作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
キュー表の所有者(スキーマ) |
name |
キュー表名 |
property |
キュー表のプロパティ |
キューを保持するためにキュー表を使用する場合、キュー表はマルチコンシューマに対して使用可能にすることはできません(デフォルト)。トピックを保持するためにキュー表を使用する場合、キュー表はマルチコンシューマに対して使用可能にする必要があります。
CLOB、BLOBおよび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
このメソッドは、指定したキュー表にキューを作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
キューが作成されるキュー表。キュー表はシングル・コンシューマ・キュー表である必要があります。 |
|
作成されるキューの名前。 |
|
キューのプロパティ。 |
このメソッドは、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
このメソッドは、パブリッシュ・サブスクライブ・モデルにトピックを作成します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
キューが作成されるキュー表。キュー表はマルチ・コンシューマ・キュー表である必要があります。 |
|
作成されるキューの名前。 |
|
キューのプロパティ。 |
このメソッドは、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
このメソッドは、非シャード・キューのキュー表を取得します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
キュー表の所有者(スキーマ) |
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システム権限を付与します。
パラメータ | 説明 |
---|---|
|
|
|
権限受領者(ユーザー、ロールまたは |
|
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システム権限を取り消します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
|
|
権限受領者(ユーザー、ロールまたは |
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
このメソッドは、パブリッシュ・サブスクライブ・モデルでトピック権限を付与します。初期設定では、キュー表の所有者のみがこのプロシージャを使用してそのトピックの権限を付与できます。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
|
|
|
|
権限受領者(ユーザー、ロールまたは |
|
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
このメソッドは、パブリッシュ・サブスクライブ・モデルでトピック権限を取り消します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
|
|
権限が取り消される権限受領者(ユーザー、ロールまたは |
例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モデルでキュー権限を付与します。初期設定では、キュー表の所有者のみがこのプロシージャを使用してそのキューの権限を付与できます。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
|
|
権限受領者(ユーザー、ロールまたは |
|
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モデルでキュー権限を取り消します。初期設定では、キュー表の所有者のみがこのプロシージャを使用してそのキューの権限を付与できます。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
|
|
権限が取り消される権限受領者(ユーザー、ロールまたは |
権限を取り消すには、取消し実行者がその権限の付与者である必要があります。また、GRANT
オプションによって伝播された権限は、伝播させた付与者の権限が取り消されたときに取り消されます。
例12-23 Point-to-Pointキュー権限の取消し
QueueSession q_sess; Queue queue; ((AQjmsDestination)queue).revokeQueuePrivilege(q_sess, "ENQUEUE", "scott");
宛先の管理
宛先の開始
public void start(javax.jms.Session session, boolean enqueue, boolean dequeue) throws JMSException
このメソッドは、宛先を開始します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
|
デキュー |
|
例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
このメソッドは、宛先を停止します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
|
デキュー |
|
|
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
このメソッドは、宛先を変更します。これには、次のプロパティがあります。
パラメータ | 説明 |
---|---|
|
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);
伝播スケジュール
この項の内容は次のとおりです。
注意:
現在、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
このメソッドは、伝播をスケジュールします。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
伝播がスケジュールされているリモート・データベースのデータベース・リンク。文字列NULLは、伝播がトピックのデータベース内のすべてのサブスクライバに対してスケジュールされていることを示します。 |
|
伝播開始時刻。 |
|
伝播継続時間。 |
|
次回の伝播開始時刻。 |
|
許容可能な待機時間(秒単位)。待機時間は、メッセージがエンキューされた時間と伝播された時間の差異です。 |
メッセージ受信者が、同一または異なるキュー内の同じ宛先に複数存在する場合、メッセージはすべての受信者に同時に伝播されます。
例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
このメソッドは、伝播スケジュールを有効化します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
宛先データベースのデータベース・リンク。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
このメソッドは、伝播スケジュールを変更します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
伝播がスケジュールされているリモート・データベースのデータベース・リンク。文字列NULLは、伝播がトピックのデータベース内のすべてのサブスクライバに対してスケジュールされていることを示します。 |
|
伝播継続時間。 |
|
次回の伝播開始時刻。 |
|
許容可能な待機時間(秒単位)。待機時間は、メッセージがエンキューされた時間と伝播された時間の差異です。 |
例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
このメソッドは、伝播スケジュールを無効化します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
宛先データベースのデータベース・リンク。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
このメソッドは、スケジュール済伝播のスケジュールを解除します。次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
JMSセッション |
|
宛先データベースのデータベース・リンク。NULL文字列は、ローカル・データベースに伝播されることを意味します。 |
例12-32 伝播スケジュールの解除
TopicSession t_sess; Topic topic; ((AQjmsDestination)topic).unschedulePropagation(t_sess, "dbs1");