menu

Laravel - RabbitMQ (send message)


Pada tutorial sebelumnya kita sudah menginstall rabbitmq, tutorial kali ini kita akan membuat engine send message to rabbitmq dari framework laravel.

Engine yang akan kita buat ini akan kita ditempel pada project laravel yang sudah kita buat sebelumnya (silahkan ikuti tutorial laravel secara terurut, bisa lihat di books), atau download projectnya disini.

Pertama, install library rabbitmq pada laravel, dalam hal ini kita akan menggunakan library php-amqplib/php-amqplib, install library dengan cara, ketikan pada terminal code berikut,
php composer require php-amqplib/php-amqplib

Selanjutnya, tambahkan route baru untuk controller rabbitmq yang akan kita buat, terletak pada path protected/app/routes file web.php
///////////
// QUEUE //
///////////
Route::group(array('prefix' => 'queue'), function(){
 Route::get('sendRabbit', 'Controller\QueueController@sendRabbit');
});

Setelah itu, buat controller baru dengan nama QueueController.php pada path protected/app/controllers/ dan masukkan code berikut,
<?php namespace Controller;

use Model\User;
use \Input;
use \View;
use \Validator;
use \Redirect;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

class QueueController extends \BaseController 
{
 function sentQueueRabbitMQ($message = [])
 {
    $connection = new AMQPStreamConnection(RABBITMQ_HOST, RABBITMQ_PORT, RABBITMQ_LOGIN, RABBITMQ_PASSWORD);

    $channel = $connection->channel();

    if (!empty($message)) {
      $message = new AMQPMessage(json_encode($message));
      $channel->basic_publish($message, '', RABBITMQ_QUEUE);
    }

    $channel->close();
    $connection->close();
 }

 public function sendRabbit()
 {
  $id = str_random(4);
  $message = [
   'id' => $id,
   'message' => 'halo '.$id
  ];
  $this->sentQueueRabbitMQ($message);
  return Redirect::to('/');
 }
}

Terakhir buat tampilannya untuk test saja berupa satu button untuk mengirim message yang berupa json ke rabbitmq dengan cara,
edit file header.blade.php pada path protected/app/views/layouts/web/ menjadi seperti ini,
<div class="header">
 <div class="banner">
  <div class="welcome">Welcome</div>
  {{-- code dibawah ini menggunakan constant variabel --}}
  <div class="gambar"><a href="#"><img src="{{ IMAGE_HEADER }}" style="width:"100px" height="129px";"></a></div>
 </div>
 <hr>
 <div class="menu">
  <div class="kiri">
   <li>
    <div class="dropdown">
      <button class="btn btn-default">Menu(css)</button>
      <div class="dropdown-content">
        <a href="{{ URL::to('crud/users')}}">User</a>
        <a href="{{ URL::to('book')}}">Index Book</a>
        <a href="{{ URL::to('javaScript/js1')}}">Belajar Script</a>
        <a href="{{ URL::to('javaScript/js2')}}">Belajar Script2</a>
        <a href="{{ URL::to('javaScript/js3')}}">Belajar Script3</a>
        <a href="{{ URL::to('javaScript/js4')}}">Belajar Script4</a>
        <a href="{{ URL::to('javaScript/js5')}}">Belajar Script5</a>
        <a href="{{ URL::to('javaScript/js6')}}">Belajar Script6</a>
        <a href="{{ URL::to('javaScript/js7')}}">Belajar Script7</a>
      </div>
    </div>
   </li>
   <li>
     <div class="dropdown-script">
      <button onclick="myFunction()" class="dropbtn btn btn-default">Translate</button>
      <div id="myDropdown" class="dropdown-content-script">
        <a href="{{ URL::to('lang/en') }}">English</a>
        <a href="{{ URL::to('lang/ina') }}">Indonesia</a>
      </div>
     </div>
   </li>
  </div>
  <div class="kanan">
   @if(Auth::user())
    <li onclick="if(confirm('Are you sure to logout?')) location.href='{{ URL::to('logout') }}';">Logout</li>
   @else
    <li onclick="location.href='{{ URL::to('login') }}';">Login</li>
   @endif
   <li onclick="location.href='{{ URL::to('register') }}';">Register</li>

   <!-- Send queue rabbit -->
   <li onclick="location.href='{{ URL::to('queue/sendRabbit') }}';">Send Rabbit</li>
  </div>
 </div>
</div>

Sehingga tampilannya akan tampak seperti ini,


Saat di klik button Send Rabbit maka pada rabbitmq (http://localhost:15672/#/) akan muncul tampilan seperti ini,



Tutorial berikutnya kita akan membuat engine untuk consume message rabbitmq,

===DONE!===

Laravel - RabbitMQ (Setup)


Back to code, lebih dari sebulan vakum akhirnya bisa eksperimen lagi,
pada eksperimen kali ini kita akan bereksperimen membuat sebuah engine rabbitmq yang akan disematkan pada project laravel, rabbitmq adalah salah satu perangkat lunak manajemen antrian yang digunakan untuk pengiriman pesan. Eksperiment ini akan dibagi menjadi 3 tutorial,
  1. Setup rabbitmq
  2. Send message
  3. Consume message
Pada tutorial yang pertama kita akan menginstall rabbitmq pada komputer,
Oke langsung saja kita mulai tutorialnya, pertama install rabbitmq terlebih dahulu dengan cara ikuti saja langkah ini https://www.rabbitmq.com/download.html karena saya menggunakan macOS maka saya akan menggunakan homebrew https://www.rabbitmq.com/install-homebrew.html
brew update
brew install rabbitmq

Jika muncul error ini,



Ini berarti anda tidak memiliki akses pada folder man5, ketikan saja code berikut pada terminal,
sudo chown -R nama_user_mac:admin /usr/local/share
jika sudah ketikan code berikut pada terminal,
brew link rabbitmq

Jika tidak muncul error diatas, langsung lanjut saja ke bawah,
Setelah selesai install rabbitmq pada komputer maka nyalakan servernya pada localhost dengan cara,
ketikan pada terminal
/usr/local/sbin/rabbitmq-server

Sehingga akan muncul seperti pada gambar dibawah,


Untuk mematikan server rabbitmq ketikan syntax berikut pada terminal
/usr/local/sbin/rabbitmqctl stop

Sekarang buka browser dan buka link ini http://localhost:15672/#/ (user:guest password:guest) sehingga akan muncul tampilan seperti ini,


Selanjutnya tambahkan queue pada rabbitmq, caranya

  • Masuk ke menu Queues
  • Isi name
  • Klik Add queue


Tutorial selanjutnya send message,

===DONE!===