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.
    }
}

メッセージをエンキューおよびデキューする

メッセージをエンキューおよびデキューするには:

  1. 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();
            }
        }
    }
}