Panduan untuk Mesejkan Kacang Didorong di EJB

1. Pengenalan

Ringkasnya, Enterprise JavaBean (EJB) adalah komponen JEE yang berjalan pada pelayan aplikasi.

Dalam tutorial ini, kita akan membincangkan Message Driven Beans (MDB), yang bertanggungjawab menangani pemprosesan mesej dalam konteks tidak segerak.

MDB adalah sebahagian daripada JEE sejak spesifikasi EJB 2.0; EJB 3.0 memperkenalkan penggunaan anotasi , menjadikannya lebih mudah untuk membuat objek tersebut. Di sini, kita akan memberi tumpuan kepada penjelasan.

2. Beberapa Latar Belakang

Sebelum kita melihat butiran Message Driven Beans, mari kita tinjau beberapa konsep yang berkaitan dengan pesanan.

2.1. Pemesejan

Pemesejan adalah mekanisme komunikasi. Dengan menggunakan pesanan, program dapat bertukar data walaupun ditulis dalam bahasa program yang berlainan atau berada di sistem operasi yang berbeza.

Ia menawarkan penyelesaian yang digabungkan secara longgar; baik pengeluar atau pengguna maklumat perlu mengetahui perincian antara satu sama lain .

Oleh itu, mereka tidak perlu disambungkan ke sistem pesanan pada masa yang sama (komunikasi tak segerak).

2.2. Komunikasi segerak dan tidak segerak

Semasa komunikasi segerak, pemohon menunggu sehingga respons kembali. Sementara itu, proses pemohon tetap disekat.

Sebaliknya, dalam komunikasi tidak segerak, pemohon memulakan operasi tetapi tidak dihalang olehnya; pemohon boleh beralih ke tugas lain dan mendapat tindak balas kemudian.

2.3. JMS

Perkhidmatan Mesej Java ("JMS") adalah API Java yang menyokong pemesejan.

JMS menyediakan peer to peer dan menerbitkan / melanggan model pesanan.

3. Kacang Didorong Mesej

MDB adalah komponen yang dipanggil oleh wadah setiap kali mesej tiba di sistem pesanan. Hasilnya, peristiwa ini mencetuskan kod di dalam kacang ini.

Kami dapat melakukan banyak tugas dalam metode MDB onMessage () , sejak menunjukkan data yang diterima pada penyemak imbas atau menghurai dan menyimpannya ke pangkalan data.

Contoh lain ialah menyerahkan data ke barisan lain setelah beberapa proses. Itu semua bergantung kepada peraturan perniagaan kita.

3.1. Kitaran Hidup Kacang Didorong Mesej

MDB hanya mempunyai dua negeri:

  1. Ia tidak ada di dalam bekas
  2. dibuat dan bersedia untuk menerima mesej

Ketergantungan, jika ada, disuntikkan tepat setelah MDB dibuat.

Untuk melaksanakan arahan sebelum menerima mesej, kita perlu memberi penjelasan kaedah dengan @ javax.ejb. PostConstruct .

Kedua-dua suntikan kebergantungan dan @ javax.ejb. Pelaksanaan PostConstruct berlaku hanya sekali.

Selepas itu, MDB bersedia menerima mesej.

3.2. Transaksi

Mesej dapat disampaikan ke MDB dalam konteks transaksi.

Bermakna bahawa semua operasi dalam kaedah onMessage () adalah sebahagian daripada satu transaksi.

Oleh itu, jika rollback berlaku, sistem mesej menghantar semula data.

4. Bekerja Dengan Kacang yang Didorong oleh Mesej

4.1. Mencipta Pengguna

Untuk membuat Bean yang Didorong oleh Mesej, kami menggunakan anotasi @ javax.ejb.MessageDriven sebelum pengisytiharan nama kelas.

Untuk mengendalikan mesej yang masuk, kita mesti melaksanakan onMessage () kaedah yang MessageListener muka:

@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()); } } }

Oleh kerana artikel ini memfokuskan pada anotasi dan bukannya deskripsi .xml, kami akan menggunakan @ActivationConfigProperty dan bukannya .

@ActivationConfigProperty adalah harta nilai utama yang mewakili konfigurasi tersebut. Kami akan menggunakan dua sifat di dalam activationConfig , menetapkan barisan dan jenis objek yang akan dimakan oleh MDB.

Dalam kaedah onMessage () kita dapat menghantar parameter pesan ke TextMessage, BytesMessage, MapMessage StreamMessage atau ObjectMessage .

Walau bagaimanapun, untuk artikel ini, kami hanya akan melihat kandungan mesej pada output standard.

4.2. Mencipta Pengeluar

Seperti yang tercakup dalam bahagian 2.1, perkhidmatan pengeluar dan pengguna benar-benar bebas dan bahkan boleh ditulis dalam bahasa pengaturcaraan yang berbeza !

Kami akan menghasilkan mesej 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 mendapat contoh ConnectionFactory dan Queue , kita mesti membuat Connection and Session .

Untuk membuat sesi, kami memanggil kaedah 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 itu, MDB membolehkan kami mencabut aplikasi kami ke perkhidmatan yang lebih kecil dengan tanggungjawab yang dilokalkan , yang membolehkan sistem yang lebih modular dan tambahan yang dapat pulih dari kegagalan sistem.

Seperti biasa kodnya sudah habis di GitHub.