Panduan untuk Message Driven Beans di EJB

1. Perkenalan

Sederhananya, Enterprise JavaBean (EJB) adalah komponen JEE yang berjalan di server aplikasi.

Dalam tutorial ini, kita akan membahas Message Driven Beans (MDB), yang bertanggung jawab untuk menangani pemrosesan pesan dalam konteks asynchronous.

MDB adalah bagian dari JEE karena spesifikasi EJB 2.0; EJB 3.0 memperkenalkan penggunaan anotasi , membuatnya lebih mudah untuk membuat objek tersebut. Di sini, kami akan fokus pada anotasi.

2. Beberapa Latar Belakang

Sebelum kita menyelami detail Message Driven Beans, mari kita tinjau beberapa konsep yang terkait dengan perpesanan.

2.1. Perpesanan

Perpesanan adalah mekanisme komunikasi. Dengan menggunakan perpesanan, program dapat bertukar data meskipun ditulis dalam bahasa program yang berbeda atau berada dalam sistem operasional yang berbeda.

Ini menawarkan solusi yang digabungkan secara longgar; baik produsen maupun konsumen informasi tidak perlu mengetahui detail satu sama lain .

Oleh karena itu, mereka bahkan tidak harus terhubung ke sistem pesan pada saat yang bersamaan (komunikasi asinkron).

2.2. Komunikasi Sinkron dan Asinkron

Selama komunikasi sinkron, pemohon menunggu hingga responsnya kembali. Sementara itu, proses pemohon tetap diblokir.

Sebaliknya, dalam komunikasi asinkron, pemohon memulai operasi tetapi tidak diblokir olehnya; pemohon dapat melanjutkan ke tugas lain dan menerima tanggapan nanti.

2.3. JMS

Java Message Services ("JMS") adalah Java API yang mendukung perpesanan.

JMS menyediakan model perpesanan peer to peer dan mempublikasikan / berlangganan.

3. Kacang Berbasis Pesan

MDB adalah komponen yang dipanggil oleh penampung setiap kali pesan masuk ke sistem perpesanan. Akibatnya, acara ini memicu kode di dalam kacang ini.

Kita bisa melakukan banyak tugas di dalam metode onMessage () MDB , sejak menampilkan data yang diterima di browser atau mem-parsing dan menyimpannya ke database.

Contoh lain adalah mengirimkan data ke antrian lain setelah beberapa pemrosesan. Semuanya tergantung pada aturan bisnis kami.

3.1. Siklus Hidup Kacang Berbasis Pesan

MDB hanya memiliki dua status:

  1. Itu tidak ada di penampung
  2. dibuat dan siap menerima pesan

Dependensi, jika ada, disuntikkan tepat setelah MDB dibuat.

Untuk menjalankan instruksi sebelum menerima pesan, kita perlu membuat anotasi metode dengan @ javax.ejb. PostConstruct .

Baik injeksi ketergantungan dan @ javax.ejb. Eksekusi PostConstruct hanya terjadi sekali.

Setelah itu, MDB siap menerima pesan.

3.2. Transaksi

Pesan dapat dikirim ke MDB di dalam konteks transaksi.

Artinya semua operasi dalam metode onMessage () adalah bagian dari satu transaksi.

Oleh karena itu, jika terjadi rollback, sistem pesan akan mengirim ulang data tersebut.

4. Bekerja Dengan Kacang Berbasis Pesan

4.1. Menciptakan Konsumen

Untuk membuat Message Driven Bean, kami menggunakan anotasi @ javax.ejb.MessageDriven sebelum deklarasi nama kelas.

Untuk menangani pesan masuk, kita harus mengimplementasikan metode onMessage () dari antarmuka MessageListener :

@MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName = "destination", propertyValue = "tutorialQueue"), @ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Queue") }) public class ReadMessageMDB implements MessageListener { public void onMessage(Message message) { TextMessage textMessage = (TextMessage) message; try { System.out.println("Message received: " + textMessage.getText()); } catch (JMSException e) { System.out.println( "Error while trying to consume messages: " + e.getMessage()); } } }

Karena artikel ini berfokus pada anotasi, bukan pada deskriptor .xml, kami akan menggunakan @ActivationConfigProperty daripada .

@ActivationConfigProperty adalah properti nilai kunci yang mewakili konfigurasi itu. Kami akan menggunakan dua properti di dalam activationConfig , mengatur antrian dan jenis objek yang akan digunakan MDB.

Di dalam metode onMessage () kita bisa mentransmisikan parameter pesan ke TextMessage, BytesMessage, MapMessage StreamMessage atau ObjectMessage .

Namun, untuk artikel ini, kita hanya akan melihat konten pesan pada keluaran standar.

4.2. Menciptakan Produser

Seperti yang dibahas di bagian 2.1, layanan produsen dan konsumen sepenuhnya independen dan bahkan dapat ditulis dalam bahasa pemrograman yang berbeda !

Kami akan membuat pesan kami menggunakan Java Servlets:

@Override protected void doGet( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String text = req.getParameter("text") != null ? req.getParameter("text") : "Hello World"; try ( Context ic = new InitialContext(); ConnectionFactory cf = (ConnectionFactory) ic.lookup("/ConnectionFactory"); Queue queue = (Queue) ic.lookup("queue/tutorialQueue"); Connection connection = cf.createConnection(); ) { Session session = connection.createSession( false, Session.AUTO_ACKNOWLEDGE); MessageProducer publisher = session .createProducer(queue); connection.start(); TextMessage message = session.createTextMessage(text); publisher.send(message); } catch (NamingException | JMSException e) { res.getWriter() .println("Error while trying to send  message: " + e.getMessage()); } res.getWriter() .println("Message sent: " + text); }

Setelah mendapatkan instance ConnectionFactory dan Queue , kita harus membuat Connection dan Session .

Untuk membuat sesi, kami memanggil metode createSession .

The first parameter in createSession is a boolean which defines whether the session is part of a transaction or not.

The second parameter is only used when the first is false. It allows us to describe the acknowledgment method that applies to incoming messages and takes the values of Session.AUTO_ACKNOWLEDGE, Session.CLIENT_ACKNOWLEDGE and Session.DUPS_OK_ACKNOWLEDGE.

We can now start the connection, create a text message on the session object and send our message.

A consumer, bound to the same queue will receive a message and perform its asynchronous task.

Also, apart from looking up JNDI objects, all actions in our try-with-resources block make sure the connection is closed if JMSException encounters an error, such as trying to connect to a non-existing queue or specifying a wrong port number to connect.

5. Testing the Message Driven Bean

Send a message through the GET method on SendMessageServlet, as in:

//127.0.0.1:8080/producer/SendMessageServlet?text=Text to send

Also, the servlet sends “Hello World” to the queue if we don't send any parameters, as in //127.0.0.1:8080/producer/SendMessageServlet.

6. Conclusion

Message Driven Beans allow simple creation of a queue based application.

Oleh karena itu, MDB memungkinkan kami untuk memisahkan aplikasi kami menjadi layanan yang lebih kecil dengan tanggung jawab yang dilokalkan , memungkinkan sistem yang jauh lebih modular dan inkremental yang dapat pulih dari kegagalan sistem.

Seperti biasa, kode di GitHub berakhir.