Koordinator Pengumpul Daftar Antrean

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