Bermula dengan Spring JMS

1. Gambaran keseluruhan

Spring menyediakan rangka kerja Integrasi JMS yang mempermudah penggunaan API JMS. Artikel ini memperkenalkan konsep asas integrasi tersebut.

2. Ketergantungan Maven

Untuk menggunakan Spring JMS dalam aplikasi kami, kami perlu menambahkan artifak yang diperlukan di pom.xml :

 org.springframework spring-jms 4.3.3.RELEASE  

Versi artifak terbaru boleh didapati di sini.

3. Templat Jms

Kelas JmsTemplate menangani penciptaan dan pembebasan sumber semasa menghantar atau menerima mesej secara serentak.

Oleh itu kelas yang menggunakan JmsTemplate ini hanya perlu melaksanakan antara muka panggilan balik seperti yang dinyatakan dalam definisi kaedah.

Bermula dengan Spring 4.1, JmsMessagingTemplate dibina di atas JmsTemplate yang menyediakan integrasi dengan abstraksi pesanan, iaitu, org.springframework.messaging.Message. Ini, seterusnya, membolehkan kita membuat mesej untuk dihantar secara umum.

4. Pengurusan Sambungan

Untuk berhubung dan dapat mengirim / menerima mesej, kita perlu mengkonfigurasi ConnectionFactory .

A ConnectionFactory adalah salah satu JMS ditadbir objek yang dipratatarajahkan oleh pentadbir . Pelanggan dengan bantuan konfigurasi akan membuat hubungan dengan penyedia JMS.

Spring menyediakan 2 jenis ConnectionFactory :

  • SingleConnectionFactory - adalah pelaksanaanantara muka ConnectionFactory , yang akan mengembalikan sambungan yang sama pada semuapanggilan createConnection () dan mengabaikan panggilan untuk menutup ()
  • CachingConnectionFactory - memperluas fungsi SingleConnectionFactory dan menambahkannya dengan cache Sesi , MessageProducers , dan MessageConsumers

5. Pengurusan Destinasi

Seperti yang dibincangkan di atas, bersama dengan ConnectionFactory , destinasi juga merupakan objek yang dikendalikan JMS dan boleh disimpan dan diambil dari JNDI.

Spring menyediakan penyelesai generik seperti DynamicDestinationResolver dan penyelesaian khusus seperti JndiDestinationResolver .

The JmsTemplate akan mewakilkan resolusi nama destinasi kepada salah satu daripada pelaksanaan asas mengenai pilihan kami.

Ia juga akan menyediakan harta tanah yang disebut defaultDestination - yang akan digunakan dengan operasi kirim dan terima yang tidak merujuk kepada tujuan tertentu.

6. Penukaran Mesej

Spring JMS tidak akan lengkap tanpa sokongan Penukar Mesej.

Strategi penukaran lalai yang digunakan oleh JmsTemplate untuk kedua-dua operasi ConvertAndSend () dan ReceiveAndConvert () adalah kelas SimpleMessageConverter .

SimpleMessageConverter dapat menangani TextMessages , BytesMessages , MapMessages , dan ObjectMessages . Kelas ini menerapkan antara muka MessageConverter .

Selain dari SimpleMessageConverter , Spring JMS menyediakan beberapa kelas MessageConverter lain seperti MappingJackson2MessageConverter , MarshallingMessageConverter , MessagingMessageConverter .

Lebih-lebih lagi, kita dapat membuat fungsi penukaran mesej tersuai hanya dengan menerapkan kaedah keMessage () dan FromMessage () antara muka MessageConverter .

Mari kita lihat coretan kod contoh untuk melaksanakan MessageConverter tersuai ,

public class SampleMessageConverter implements MessageConverter { public Object fromMessage(Message message) throws JMSException, MessageConversionException { //... } public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException { //... } }

7. Contoh JMS Spring Spring

Di bahagian ini, kita akan melihat cara menggunakan JmsTemplate untuk menghantar dan menerima mesej.

Kaedah lalai untuk menghantar mesej adalah JmsTemplate.send () . Ia mempunyai dua parameter utama, parameter pertama adalah tujuan JMS dan parameter kedua adalah implementasi MessageCreator. The JmsTemplate menggunakan MessageCreator 's Cara panggil balik createMessage () untuk membina mesej.

JmsTemplate.send () baik untuk menghantar mesej teks biasa tetapi untuk menghantar pesanan khusus, JmsTemplate mempunyai kaedah lain yang disebut c onvertAndSend () .

Kita dapat melihat di bawah pelaksanaan kaedah ini:

public class SampleJmsMessageSender { private JmsTemplate jmsTemplate; private Queue queue; // setters for jmsTemplate & queue public void simpleSend() { jmsTemplate.send(queue, s -> s.createTextMessage("hello queue world")); }
 public void sendMessage(Employee employee) { System.out.println("Jms Message Sender : " + employee); Map map = new HashMap(); map.put("name", employee.getName()); map.put("age", employee.getAge()); jmsTemplate.convertAndSend(map); } }

Di bawah ini adalah kelas penerima mesej, kami memanggilnya sebagai POJO yang Didorong oleh Mesej (MDP). Kita dapat melihat bahawa kelas SampleListener sedang melaksanakan antara muka MessageListener dan menyediakan pelaksanaan khusus teks untuk kaedah antara muka diMessage ().

Selain daripada kaedah onMessage () , kelas SampleListener kami juga memanggil kaedah menerimaAndConvert () untuk menerima pesanan tersuai:

public class SampleListener implements MessageListener { public JmsTemplate getJmsTemplate() { return getJmsTemplate(); } public void onMessage(Message message) { if (message instanceof TextMessage) { try { String msg = ((TextMessage) message).getText(); System.out.println("Message has been consumed : " + msg); } catch (JMSException ex) { throw new RuntimeException(ex); } } else { throw new IllegalArgumentException("Message Error"); } } public Employee receiveMessage() throws JMSException { Map map = (Map) getJmsTemplate().receiveAndConvert(); return new Employee((String) map.get("name"), (Integer) map.get("age")); } }

Kami melihat bagaimana melaksanakan MessageListener dan di bawah ini kami melihat konfigurasi dalam konteks aplikasi Spring:

DefaultMessageListenerContainer adalah bekas pendengar mesej lalai yang disediakan Spring dengan banyak bekas khas lain.

8. Konfigurasi Asas Dengan Anotasi Java

The @JmsListener adalah satu-satunya penjelasan yang diperlukan untuk menukar kaedah kacang normal menjadi JMS pendengar titik akhir. Spring JMS memberikan lebih banyak anotasi untuk memudahkan pelaksanaan JMS.

Kami dapat melihat beberapa kelas sampel yang dijelaskan di bawah:

@JmsListener(destination = "myDestination") public void SampleJmsListenerMethod(Message order) { ... }

Untuk menambahkan beberapa pendengar ke satu kaedah, kita hanya perlu menambahkan beberapa anotasi @JmsListener .

Kami perlu menambahkan anotasi @EnableJms ke salah satu kelas konfigurasi kami untuk menyokong kaedah anotasi @JmsListener :

@Configuration @EnableJms public class AppConfig { @Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory()); return factory; } }

9. Pengendali Ralat

Kami juga dapat mengkonfigurasi pengendali ralat tersuai untuk wadah pendengar mesej kami.

Mari kita laksanakan antara muka org.springframework.util.ErrorHandler :

@Service public class SampleJmsErrorHandler implements ErrorHandler { // ... logger @Override public void handleError(Throwable t) { LOG.warn("In default jms error handler..."); LOG.error("Error Message : {}", t.getMessage()); } }

Note that we have overridden the handleError() method, which simply logs the error message.

And then, we need to reference our error handler service in the DefaultJmsListenerConnectionFactory using the setErrorHandler() method:

@Bean public DefaultJmsListenerContainerFactorybjmsListenerContainerFactory() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory()); factory.setErrorHandler(sampleJmsErrorHandler); return factory; }

With this, our configured error handler will now catch any unhandled exceptions and log the message.

Optionally, we can also configure the error handler using the plain-old XML configurations by updating our appContext.xml:

10. Conclusion

In this tutorial, we discussed the configuration and basic concepts of Spring JMS. We also had a brief look at the Spring-specific JmsTemplate classes which are used for sending and receiving messages.

Anda boleh mendapatkan pelaksanaan kod dalam projek GitHub.