3.7.1 Koordinator
Koordinator berfungsi untuk mengelola daftar antrean dan menerima berkas XML yang dikirimkan oleh masing-masing pengumpul. Koordinator tidak melakukan
pengunduhan metadata secara langsung dari repositori. Di dalam sistem pengumpul metadata terdistribusi, koordinator hanya berhubungan dengan masing-masing
pengumpul. Pada
program utama
koordinator menjalankan
perintah untuk
mendeklarasikan alamat yang berisi fungsi untuk digunakan oleh pengumpul agar dapat mengenali fungsi-fungsi yang dapat gunakan seperti mengambil daftar antrean
dan mengirim berkas XML. Perintah tersebut adalah:
RequestURLBufferInterf urlBuffer = new RequestURLBufferImpl; Naming.rebindrmi:localhost:1099URLBufferServer,
urlBuffer; ServerInterf server = new ServerImpl;
Naming.rebindrmi:localhost:1099FileServer, server;
Untuk melakukan komunikasi menggunakan RMI, dibutuhkan satu
port
tertentu yang tidak digunakan oleh aplikasi lainnya. Secara umum
port
yang digunakan adalah 1099. Nama URLBufferServer dan FileServer akan
digunakan oleh pengumpul untuk mengenali koordinator.
3.7.2 Pengumpul
Pengunduhan metadata dari berbagai repositori dilakukan oleh masing-masing pengumpul. Agar dapat berkomunikasi dengan koordinator, pengumpul terlebih
Universitas Sumatera Utara
dahulu menginisialisasi alamat yang telah dideklarasikan oleh koordinator. Inisialisasinya adalah sebagai berikut:
buffer = RequestURLBufferInterfNaming.lookup rmi:alamat_server:1099URLBufferServer;
server = ServerInterfNaming.lookup rmi:alamat_server:1099FileServer;
Untuk mulai berkomunikasi dengan koordinator, pengumpul harus
menginisialisasi sebuah objek yang menjadi penghubung antara pengumpul dan koordinator. Kata kunci alamat_server merupakan alamat yang dituju oleh
pengumpul untuk mengirimkan berkas XML.
3.7.3 Daftar Antrean
Daftar antrean digunakan untuk menyimpan seluruh alamat repositori. Untuk mengimplementasikan daftar antrean, dibutuhkan satu buah tabel khusus dengan
spesifikasi yang tertera pada Tabel 3.2. Tabel dibuat dengan menggunakan
database
MySQL. Tabel terdiri dari beberapa kolom yaitu id, request_url, status,
user, start, finish, amount, log, attempt dan ordering. Kolom request_url digunakan untuk menyimpan alamat repositori. Alamat
pengunduhan metadata yang digunakan telah ditentukan pada awal pengumpulan metadata. Selain itu juga diperoleh melalui resumptionToken yang terdapat
pada masing-masing metadata yang belum lengkap.
Universitas Sumatera Utara
Tabel 3.2 Spesifikasi Tabel Daftar Antrean
Nama Kolom Tipe Data
Keterangan
id
Integer
Primary key request_url
Varchar255 Alamat
repositori
status
Tinyint3 Status
pengunduhan alamat repositori
user
Char5 Nama
pengumpul
start
Datetime Waktu mulai
pengunduhan
finish
Datetime Waktu selesai
pengunduhan
amount
Integer Jumlah metadata
yang diunduh
log
Text Catatan
kesalahan pada saat
pengunduhan
attempt
Tinyint3 Jumlah
percobaan
ordering
Integer Urutan
pengunduhan yang dilakukan
Sebuah repositori memiliki beberapa keadaan yang ditampilkan pada kolom
status. Nilai status telah ditentukan sesuai dengan Tabel 3.3. Status digunakan sebagai salah satu mekanisme untuk mencegah duplikasi dalam pengumpulan
metadata. Dari nilai status juga diketahui bahwa alamat repositori berhasil diunduh atau tidak. Apabila alamat repositori yang diunduh mengalami kegagalan, maka
informasi mengenai kesalahan yang menyebabkan kegagalan pengunduhan metadata
Universitas Sumatera Utara
akan dicatat di dalam kolom log. Sebaliknya, pencatatan tidak dilakukan apabila tidak terdapat masalah pada pengunduhan metadata.
Tabel 3.3 Status Pengunduhan Repositori
Status Keterangan
Repositori menunggu untuk diunduh 1
Repositori sedang diunduh oleh salah satu pengumpul 2
Repositori berhasil diunduh 3
Repositori gagal diunduh
Pada saat pengumpulan metadata diperlukan informasi mengenai nama pengumpul yang mengunduh metadata dari masing-masing alamat repositori. Nama
pengumpul tersebut disimpan di kolom user. Catatan waktu pengumpul memulai dan mengakhiri pengunduhan metadata
disimpan di kolom start dan stop. Repositori yang telah selesai diunduh akan dihitung jumlah metadatanya dan kemudian dimasukkan ke dalam kolom amount.
Jumlah percobaan pengunduhan metadata dicatat di dalam kolom attempt. Kolom ordering digunakan untuk menentukan urutan pengunduhan metadata pada
repositori. Daftar antrean merupakan
class
yang harus terdapat di sisi koordinator maupun pengumpul. Daftar antrean diimplementasikan dengan menerapkan beberapa
fungsi yaitu
getRequestUrl, setRequestUrl
dan setRequestUrlStatus.
Universitas Sumatera Utara
Fungsi getRequestUrl digunakan untuk mengambil alamat repositori dari daftar antrean. Masalah yang muncul di dalam pengambilan daftar antrean adalah
kemungkinan bahwa alamat repositori yang sama diambil oleh dua pengumpul yang berbeda. Duplikasi pengambilan alamat repositori diatasi dengan pemberian status
pada masing-masing alamat repositori. Algoritma pengambilan alamat repositori adalah apabila nilai status = 0 atau nilai status = 3 dan nilai attempt jumlah
percobaan pengunduhan repositori 10. Algoritma tersebut diimplementasikan dengan bahasa SQL berikut ini:
SELECT id, request_url, status FROM oai_buffer WHERE status = 0 OR status = 3 AND attempt 10 ORDER BY ordering ASC LIMIT 1
Setelah pengambilan alamat repositori dari daftar antrean, status alamat tersebut harus diubah menjadi 1, yaitu telah diambil dan kolom user diisi dengan
nama pengumpul dan waktu mulai pengumpulan dicatat di kolom start. Penerapan status pada alamat repositori membantu mencegah duplikasi
pengambilan dari sisi algoritma pengambilan daftar antrean. Pada kenyataannya, masih terdapat kemungkinan masing-masing pengumpul mengakses tabel MySQL
pada saat yang sama. Oleh karena itu, perlu diterapkan metode penguncian tabel pada saat mengeksekusi
query
MySQL. Implementasi pengambilan alamat repositori dari daftar antrean adalah sebagai berikut:
Universitas Sumatera Utara
try { conn = new MySQLConnection.connect;
String query = SELECT id, request_url, status FROM oai_buffer WHERE status = 0 OR status = 3 AND attempt 10
ORDER BY ordering ASC LIMIT 1; st = conn.createStatement;
st.executeLOCK TABLES oai_buffer WRITE; ResultSet rs = st.executeQueryquery;
while rs.next { result[0] = rs.getString1;
id result[1] = rs.getString2;
request_url query = UPDATE oai_buffer SET status = 1, attempt
= attempt + 1, start = now, user = ? WHERE id = ?; ps = conn.prepareStatementquery;
ps.setString1, user; ps.setString2, result[0];
ps.executeUpdate; }
} catch Exception e { penanganan kesalahan
} finally { try {
if st = null{ st.executeUNLOCK TABLES;
st.close; }
kode untuk menutup koneksi } catch Exception e {}
}
Universitas Sumatera Utara
Pada penggunaan proses paralel juga terdapat kemungkinan satu fungsi dipanggil secara bersamaan. Untuk memastikan bahwa dalam satu waktu hanya
dipanggil satu fungsi, maka fungsi getRequestUrl harus menerapkan sinkronisasi.
Bila metadata yang diunduh dari repositori masih belum lengkap, maka akan terdapat resumptionToken yang berisi nilai untuk membentuk alamat
url
metadata berikutnya. Alamat
url
tersebut harus disimpan di daftar antrean dan diletakkan pada posisi terakhir. Implementasi penyimpanan alamat repositori baru ke
daftar antrean adalah sebagai berikut:
try { conn = new MySQLConnection.connect;
String query = INSERT INTO oai_buffer request_url, status, user, amount, ordering VALUES ?, ?, ?, 0,
maxordering+1; ps = conn.prepareStatementquery;
ps.setString1, requestUrl; ps.setInt2, 0;
ps.setInt3, 0; ps.executeUpdate;
res = 1; } catch Exception e {
e.printStackTrace; } finally {
menutup koneksi }
Universitas Sumatera Utara
Setelah pengunduhan metadata, terdapat dua kemungkinan yaitu berhasil atau gagal. Alamat repositori di dalam daftar antrean diubah statusnya menggunakan
fungsi setRequestUrlStatus. Fungsi tersebut diimplementasikan sebagai berikut:
try { conn = new MySQLConnection.connect;
String fin = ; if status == 2 {
fin = , finish = now, amount = + amount; } else if status == 3 {
fin = , finish = now, ordering = maxordering + 1, amount = + amount;
} String query = UPDATE oai_buffer SET status = ? + fin +
, log = ? WHERE id = ?; ps = conn.prepareStatementquery;
ps.setInt1, status; ps.setString2, log;
ps.setInt3, id; ps.executeUpdate;
res = 1; } catch Exception e {
penanganan kesalahan } finally {
menutup koneksi }
Universitas Sumatera Utara
3.7.4 Pengunduhan Metadata