Oracle Streams AQ: Sang Penyampai Pesan


Oracle Streams AQ adalah sebuah messaging system. Uniknya, ia tersedia langsung bersama dalam Oracle Database 10g. Kita akan membutuhkan messaging sytem jika kita memiliki banyak sistem yang berjalan dalam platform berbeda-beda dan kita ingin mereka bisa saling berkomunikasi. Salah satu contoh klasik, misalnya sebuah bank memiliki mainframe yang canggih, tetapi user ber-interaksi dengan mainframe ini melalui aplikasi berbasis GUI yang lebih user-friendly dengan bantuan messaging middleware.

Aku akan mencoba membuat dua program sederhana dalam Java yang saling berkomunikasi melalui Oracle Streams AQ. Sebelum memulai coding, aku harus membuat terlebih dahulu Queue Table dan Queue untuk menampung pesan yang berupa Object (dalam Oracle). Pertama-tama, aku akan memberikan hak akses pada user scott:


  GRANT CONNECT, RESOURCE TO scott;
  GRANT EXECUTE ON DBMS_AQADM TO scott;
  GRANT EXECUTE ON DBMS_AQ TO scott;
  GRANT Aq_Administrator_role TO scott;

Lalu aku akan menjalankan PL/SQL procedure yang berfungsi untuk membuat Queue Table dan Queue dengan perintah berikut ini:


  CREATE TYPE pesan AS OBJECT (
     id        INTEGER,
     isiPesan  VARCHAR(50)
  );

  EXECUTE DBMS_AQADM.CREATE_QUEUE_TABLE (
     queue_table => 'latihanQueueTable',
     queue_payload_type => 'pesan'
  );

  EXECUTE DBMS_AQADM.CREATE_QUEUE (
     queue_name => 'latihanQueue',
     queue_table => 'latihanQueueTable'
  );

  EXECUTE DBMS_AQADM.START_QUEUE (
     queue_name => 'latihanQueue'
  );

Sekarang aku akan membuat program Java-nya. Sebelumnya aku harus menyiapkan referensi ke JAR yang dipakai, yaitu JDBC Driver (secara default terletak di “%ORACLE_HOME%\jdbc\lib”) dan Oracle Streams AQ API (secara default terletak di “%ORACLE_HOME%\rdbms\jlib”).

Aku akan mulai dengan membuat class Java yang mewakili object “Pesan” yang aku buat sebelumnya. Berikut ini adalah kode programnya:


import java.sql.*;

public class Pesan implements SQLData {

  private String sqlType;
  public int ID;
  public String pesan;

  public Pesan () {}

  public Pesan (String sqlType, int ID, String pesan) {
    this.sqlType = sqlType;
    this.ID = ID;
    this.pesan = pesan;
  }

  public String getSQLTypeName() throws SQLException {
    return sqlType;
  }

  public void readSQL(SQLInput stream, String typeName) throws SQLException {
    sqlType = typeName;
    ID = stream.readInt();
    pesan = stream.readString();
  }

  public void writeSQL(SQLOutput stream) throws SQLException {
    stream.writeInt(ID);
    stream.writeString(pesan);
  }

  public String toString() {
    return "Pesan: ID = " + ID + "; pesan = " + pesan;
  }
}

Kemudian, aku akan membuat program yang melakukan enqueue (mengirim pesan melalui queue), yang potongan kode programnya sebagai berikut:

try {
 Class.forName("oracle.jdbc.driver.OracleDriver");
 Connection cn = DriverManager.getConnection("jdbc:oracle:oci:@latihan",
	"scott", "tiger");
 System.out.println("Koneksi database sukses...");

 Class.forName("oracle.AQ.AQOracleDriver");
 AQSession session = AQDriverManager.createAQSession(cn);
 System.out.println("AQSession berhasil dibuat...");

 Hashtable map = (Hashtable)((OracleConnection) cn).getTypeMap();
 map.put("PESAN", Class.forName("Pesan"));

 AQQueue queue = session.getQueue("scott", "latihanQueue");
 AQMessage message = queue.createMessage();
 AQEnqueueOption enqueueOption = new AQEnqueueOption();

 for (int i=0; i<10; i++) {
   Pesan pesan = new Pesan("PESAN", i, "Ini Pesan Latihan..");
   AQObjectPayload payload = message.getObjectPayload();
   payload.setPayloadData(pesan);

   queue.enqueue(enqueueOption, message);
   cn.commit();
 }

} catch (Exception ex) {
 System.out.println("Terjadi kesalahan...");
 ex.printStackTrace();
}

Program di atas akan mendaftarkan class ‘Pesan’ untuk tipe data object ‘SCOTT.PESAN’. Selain itu, ia juga akan menyisipkan 10 ‘Pesan’ di queue, masing-masing dengan ID mulai dari 0 hingga 9.

Sekarang, aku akan mencoba membuat program yang membaca nilai di queue, yang potongan kode programnya sebagai berikut:


try {
  Class.forName("oracle.jdbc.driver.OracleDriver");
  Connection cn = DriverManager.getConnection("jdbc:oracle:oci:@latihan",
      "scott", "tiger");
  System.out.println("Koneksi database sukses...");

  Class.forName("oracle.AQ.AQOracleDriver");
  AQSession session = AQDriverManager.createAQSession(cn);
  System.out.println("AQSession berhasil dibuat...");

  Hashtable map = (Hashtable)((OracleConnection) cn).getTypeMap();
  map.put("PESAN", Class.forName("Pesan"));

  AQQueue queue = session.getQueue("scott", "latihanQueue");

  AQDequeueOption dequeueOption = new AQDequeueOption();
  AQMessage message = queue.dequeue(dequeueOption, Class.forName("Pesan"));
  AQObjectPayload payload = message.getObjectPayload();
  Pesan pesan = (Pesan) payload.getPayloadData();

  System.out.println("Data berhasil dibaca...");
  System.out.println(pesan.toString());
} catch (Exception ex) {
  System.out.println("Terjadi kesalahan...");
  ex.printStackTrace();
}

Program di atas hampir mirip dengan yang sebelumnya, hanya saja kali ini ia melakukan operasi dequeue. Saat pertama kali dijalankan, aku akan memperoleh ‘Pesan’ dengan ID bernilai 0. Jika aku menjalankannya lagi, aku akan memperoleh ‘Pesan’ dengan ID bernilai 1. Begitu seterusnya hingga tidak ada nilai di queue lagi dan program akan terus menunggu.

Setelah selesai ber-eksperimen dengan queue, aku tidak lupa menghapus semua yang sudah aku buat tadi:


  EXECUTE DBMS_AQADM.STOP_QUEUE (
     queue_name => 'latihanQueue'
  );

  EXECUTE DBMS_AQADM.DROP_QUEUE (
     queue_name => 'latihanQueue'
  );

  EXECUTE DBMS_AQADM.DROP_QUEUE_TABLE (
     queue_table => 'latihanQueueTable'
  );

  DROP TYPE Pesan;  

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: