Using advanced queueing¶
EDB Postgres Advanced Serverアドバンスドキューは、 EDB Postgres Advanced Serverデータベースのメッセージキューとメッセージ処理を提供します。ユーザー定義のメッセージはキューに保存され、キューのコレクションはキューテーブルに保存されます。依存するキューを作成する前に、まずキュー表を作成する必要があります。
サーバサイドでは、 DBMS_AQADM
パッケージのプロシージャがメッセージキューとキューテーブルを作成および管理します。
DBMS_AQ
パッケージを使用して、キューにメッセージを追加または削除したり、PL /
SQLコールバック・プロシージャを登録または登録解除します。 DBMS_AQ
および DBMS_AQADM
の詳細については、 EDB Postgres Advanced Server documentation を参照してください。
クライアントサイドでは、アプリケーションはEDB- JDBCドライバーのJMS APIを使用してメッセージをエンキューおよびデキューします。
メッセージのエンキューまたはデキュー¶
EDB Postgres Advanced Serverの高度なキュー機能の使用の詳細については、 Database Compatibility for Oracle Developers Built-in Package Guide を参照してください。
サーバー側のセットアップ¶
JMSベースのJavaアプリケーションで高度なキュー機能を使用するには、まずユーザー定義型、キューテーブル、およびキューを作成します。次に、データベースサーバでキューをスタートします。 Javaアプリケーションでは、 EDB-PSQLまたはEDB- JDBC JMS APIのいずれかを使用できます。
EDB-PSQLを使用する¶
EDB-PSQLを呼び出し、 EDB Postgres Advanced Serverホストデータベースに接続します。コマンドラインで次のSPLコマンドを使用します。
ユーザー定義型の作成
RAWデータタイプを指定するには、ユーザー定義型を作成します。この例では、
mytype 名前付けのユーザー定義型を作成します。
CREATE TYPE mytype AS (code int, project TEXT);
キューテーブルを作成
キューテーブルは、同じペイロードタイプのマルチプルのキューを保持できます。この例では、
MSG_QUEUE_TABLE 名前付けのテーブルを作成します。
EXEC DBMS_AQADM.CREATE_QUEUE_TABLE
(queue_table => MSG_QUEUE_TABLE,
queue_payload_type => mytype,
comment => Message queue table);
END;
キューを作成
この例では、 MSG_QUEUE_TABLE というテーブルに MSG_QUEUE
名前付けのキューを作成します。
EXEC DBMS_AQADM.CREATE_QUEUE ( queue_name => MSG_QUEUE, queue_table => MSG_QUEUE_TABLE, comment => This queue contains pending messages.);
キューを開始
キューが作成されたら、コマンドラインで次のSPLコードを呼び出して、 EDBデータベースでキューをスタートします。
EXEC DBMS_AQADM.START_QUEUE(queue_name => MSG_QUEUE);
commit;
``` ### EDBの使用JDBC JMS API
次のJMS API呼び出しは、 EDB-PSQLを使用して実行される同じステップを実行します:-EDB EDB Postgres Advanced Serverデータベースに接続します-ユーザー定義タイプを作成します-キューテーブルとキューを作成します-キューを開始します
```Text
edbJmsFact = new EDBJmsConnectionFactory("localhost", 5444, "edb", "edb", "edb");
conn = (EDBJmsQueueConnection) edbJmsFact.createQueueConnection();
session = (EDBJmsQueueSession) conn.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
String sql = "CREATE TYPE mytype AS (code int, project TEXT);";
UDTType udtType = new UDTType(conn.getConn(), sql, "mytype");
Operation operation = new UDTTypeOperation(udtType);
operation.execute();
queueTable = session.createQueueTable(conn.getConn(), "MSG_QUEUE_TABLE", "mytype", "Message queue table");
Queue queue1 = new Queue(conn.getConn(), "MSG_QUEUE", "MSG_QUEUE_TABLE", "Message Queue");
operation = new QueueOperation(queue1);
operation.execute();
queue = (EDBJmsQueue) session.createQueue("MSG_QUEUE");
queue.setEdbQueueTbl(queueTable);
queue.start();
クライアント側の例¶
ユーザー定義タイプを作成し、その後にキュー表とキューを作成した後、キューをスタートします。次に、 EDB- JDBCドライバーのJMS APIを使用して、メッセージをキューに登録またはデキューできます。
Javaプロジェクトを作成し、 edb-jdbc
インストレーションディレクトリから edb-jdbc18.jar
をライブラリに追加します。
作成したタイプに対応するJava Beanを作成します。
package mypackage;
import java.util.ArrayList;
import com.edb.aq.UDTType;
public class MyType extends UDTType {
private int code;
private String project;
public MyType() {}
/**
* @return the code
*/
public int getCode() {
return code;
}
/**
* @param code the code to set
*/
public void setCode(int code) {
this.code = code;
}
/**
* @return the project
*/
public String getProject() {
return project;
}
/**
* @param project the project to set
*/
public void setProject(String project) {
this.project = project;
}
/**
* Override this method and call getter methods in the same order as in CREATE TYPE statement.
* CREATE TYPE mytype AS (code int, project TEXT);
* @return
*/
@Override
public Object[] getParamValues() {
ArrayList<Object> params = new ArrayList<Object>();
params.add(getCode());
params.add(getProject());
return params.toArray(); //To change body of generated methods, choose Tools | Templates.
}
}
メッセージをエンキューおよびデキューする¶
メッセージをエンキューおよびデキューするには:
JMS接続ファクトリーを作成し、キュー接続を作成します。キューセッションを作成します。
edbJmsFact = new EDBJmsConnectionFactory("localhost", 5445, "edb", "edb", "edb");
conn = (EDBJmsQueueConnection) edbJmsFact.createQueueConnection();
session = (EDBJmsQueueSession) conn.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
queue = new EDBJmsQueue("MSG_QUEUE");
メッセージをキューに入れる¶
メッセージをキューに入れるには:
1.セッションから EDBJmsMessageProducer
を作成します。エンキューメッセージ.3を作成します。
EDBJmsMessageProducer.send メソッドを呼び出します。
messageProducer = (EDBJmsMessageProducer) session.createProducer(queue);
MyType udtType1 = new MyType();
udtType1.setProject("Test Omega");
udtType1.setCode(321);
udtType1.setName("mytype");
messageProducer.send(udtType1);
メッセージをデキューする¶
メッセージをデキューするには:
1.セッションから EDBJmsMessageConsumer を作成します。
EDBJmsMessageConsumer.Receive メソッドを呼び出します。
messageConsumer = (EDBJmsMessageConsumer) session.createConsumer(queue);
queue.setDequeue_mode(DequeueMode.BROWSE);
queue.setTypeName("mytype");
Message message = messageConsumer.receive();
完全なエンキューおよびデキュープログラム¶
この例は、エンキューとデキューを示しています。ユーザー定義タイプ、キューテーブル、およびキューはEDB-PSQLを使用して作成され、キューが開始されます。
package mypackage;
import com.edb.aq.DequeueMode;
import com.edb.aq.operations.*;
import com.edb.jms.client.EDBJmsQueueConnection;
import com.edb.jms.client.EDBJmsConnectionFactory;
import com.edb.jms.client.EDBJmsMessageConsumer;
import com.edb.jms.client.EDBJmsMessageProducer;
import com.edb.jms.client.EDBJmsQueue;
import com.edb.jms.client.EDBJmsQueueSession;
import com.edb.jms.client.EDBQueueTable;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
public class JMSClient {
public static void main(String args[]) throws JMSException {
EDBJmsConnectionFactory edbJmsFact = null;
EDBJmsQueueConnection conn = null;
EDBJmsQueueSession session = null;
EDBQueueTable queueTable = null;
EDBJmsQueue queue = null;
EDBJmsMessageProducer messageProducer = null;
EDBJmsMessageConsumer messageConsumer = null;
try {
edbJmsFact = new EDBJmsConnectionFactory("localhost", 5444, "edb", "edb", "edb");
conn = (EDBJmsQueueConnection) edbJmsFact.createQueueConnection();
session = (EDBJmsQueueSession) conn.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
queue = (EDBJmsQueue) session.createQueue("MSG_QUEUE");
messageProducer = (EDBJmsMessageProducer) session.createProducer(queue);
MyType udtType1 = new MyType();
udtType1.setProject("Test Omega");
udtType1.setCode(321);
udtType1.setName("mytype");
messageProducer.send(udtType1);
messageConsumer = (EDBJmsMessageConsumer) session.createConsumer(queue);
queue.setDequeue_mode(DequeueMode.BROWSE);
queue.setTypeName("mytype");
Message message = messageConsumer.receive();
System.out.println("Received: " + message);
message = messageConsumer.receive();
System.out.println("Received: " + message);
} catch (JMSException jmsEx) {
System.out.println(jmsEx.getMessage());
} finally {
if(conn != null) {
conn.close();
}
}
}
}
この例は、ユーザー定義タイプ、キュー表、およびキューのエンキュー、デキュー、および作成を示しています。また、キューを開始します。
package mypackage;
import com.edb.aq.DequeueMode;
import com.edb.aq.operations.*;
import com.edb.jms.client.EDBJmsQueueConnection;
import com.edb.jms.client.EDBJmsConnectionFactory;
import com.edb.jms.client.EDBJmsMessageConsumer;
import com.edb.jms.client.EDBJmsMessageProducer;
import com.edb.jms.client.EDBJmsQueue;
import com.edb.jms.client.EDBJmsQueueSession;
import com.edb.jms.client.EDBQueueTable;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
public class JMSClient {
public static void main(String args[]) throws JMSException {
EDBJmsConnectionFactory edbJmsFact = null;
EDBJmsQueueConnection conn = null;
EDBJmsQueueSession session = null;
EDBQueueTable queueTable = null;
EDBJmsQueue queue = null;
EDBJmsMessageProducer messageProducer = null;
EDBJmsMessageConsumer messageConsumer = null;
try {
edbJmsFact = new EDBJmsConnectionFactory("localhost", 5444, "edb", "edb", "edb");
conn = (EDBJmsQueueConnection) edbJmsFact.createQueueConnection();
session = (EDBJmsQueueSession) conn.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
String sql = "CREATE TYPE mytype AS (code int, project TEXT);";
UDTType udtType = new UDTType(conn.getConn(), sql, "mytype");
Operation operation = new UDTTypeOperation(udtType);
operation.execute();
queueTable = session.createQueueTable(conn.getConn(), "MSG_QUEUE_TABLE", "mytype", "Message queue table");
Queue queue1 = new Queue(conn.getConn(), "MSG_QUEUE", "MSG_QUEUE_TABLE", "Message Queue");
operation = new QueueOperation(queue1);
operation.execute();
queue = (EDBJmsQueue) session.createQueue("MSG_QUEUE");
queue.setEdbQueueTbl(queueTable);
queue.start();
messageProducer = (EDBJmsMessageProducer) session.createProducer(queue);
MyType udtType1 = new MyType();
udtType1.setProject("Test Omega");
udtType1.setCode(321);
udtType1.setName("mytype");
messageProducer.send(udtType1);
messageConsumer = (EDBJmsMessageConsumer) session.createConsumer(queue);
queue.setDequeue_mode(DequeueMode.BROWSE);
queue.setTypeName("mytype");
Message message = messageConsumer.receive();
System.out.println("Received: " + message);
message = messageConsumer.receive();
System.out.println("Received: " + message);
} catch (JMSException jmsEx) {
System.out.println(jmsEx.getMessage());
} finally {
if(conn != null) {
conn.close();
}
}
}
}