Add reference documentation for JmsClient next to JmsTemplate

See gh-32501
This commit is contained in:
Juergen Hoeller 2025-07-10 17:13:58 +02:00
parent a3e9f0c16d
commit 200934c673
3 changed files with 63 additions and 18 deletions

View File

@ -7,8 +7,8 @@ This describes how to receive messages with JMS in Spring.
[[jms-receiving-sync]] [[jms-receiving-sync]]
== Synchronous Receipt == Synchronous Receipt
While JMS is typically associated with asynchronous processing, you can While JMS is typically associated with asynchronous processing, you can consume messages
consume messages synchronously. The overloaded `receive(..)` methods provide this synchronously. The `receive(..)` methods on `JmsTemplate` and `JmsClient` provide this
functionality. During a synchronous receive, the calling thread blocks until a message functionality. During a synchronous receive, the calling thread blocks until a message
becomes available. This can be a dangerous operation, since the calling thread can becomes available. This can be a dangerous operation, since the calling thread can
potentially be blocked indefinitely. The `receiveTimeout` property specifies how long potentially be blocked indefinitely. The `receiveTimeout` property specifies how long

View File

@ -59,8 +59,8 @@ If you created the `JmsTemplate` and specified a default destination, the
`send(MessageCreator c)` sends a message to that destination. `send(MessageCreator c)` sends a message to that destination.
[[jms-msg-conversion]] [[jms-sending-conversion]]
== Using Message Converters == Using JMS Message Converters
To facilitate the sending of domain model objects, the `JmsTemplate` has To facilitate the sending of domain model objects, the `JmsTemplate` has
various send methods that take a Java object as an argument for a message's data various send methods that take a Java object as an argument for a message's data
@ -87,7 +87,7 @@ following example shows how to modify a message header and a property after a
[source,java,indent=0,subs="verbatim,quotes"] [source,java,indent=0,subs="verbatim,quotes"]
---- ----
public void sendWithConversion() { public void sendWithConversion() {
Map map = new HashMap(); Map<String, String> map = new HashMap<>();
map.put("Name", "Mark"); map.put("Name", "Mark");
map.put("Age", new Integer(47)); map.put("Age", new Integer(47));
jmsTemplate.convertAndSend("testQueue", map, new MessagePostProcessor() { jmsTemplate.convertAndSend("testQueue", map, new MessagePostProcessor() {
@ -120,15 +120,43 @@ MapMessage={
} }
---- ----
NOTE: This JMS-specific `org.springframework.jms.support.converter.MessageConverter`
arrangement operates on JMS message types and is responsible for immediate conversion
to `jakarta.jms.TextMessage`, `jakarta.jms.BytesMessage`, etc. For a contract supporting
generic message payloads, use `org.springframework.messaging.converter.MessageConverter`
with `JmsMessagingTemplate` or preferably `JmsClient` as your central delegate instead.
[[jms-callbacks]]
== Using `SessionCallback` and `ProducerCallback` [[jms-sending-jmsclient]]
== Sending a Message with `JmsClient`
[source,java,indent=0,subs="verbatim,quotes"]
----
// Reusable handle, typically created through JmsClient.create(ConnectionFactory)
// For custom conversion, use JmsClient.create(ConnectionFactory, MessageConverter)
private JmsClient jmsClient;
public void sendWithConversion() {
this.jmsClient.destination("myQueue")
.withTimeToLive(1000)
.send("myPayload"); // optionally with a headers Map next to the payload
}
public void sendCustomMessage() {
Message<?> message =
MessageBuilder.withPayload("myPayload").build(); // optionally with headers
this.jmsClient.destination("myQueue")
.withTimeToLive(1000)
.send(message);
}
----
[[jms-sending-callbacks]]
== Using `SessionCallback` and `ProducerCallback` on `JmsTemplate`
While the send operations cover many common usage scenarios, you might sometimes While the send operations cover many common usage scenarios, you might sometimes
want to perform multiple operations on a JMS `Session` or `MessageProducer`. The want to perform multiple operations on a JMS `Session` or `MessageProducer`. The
`SessionCallback` and `ProducerCallback` expose the JMS `Session` and `Session` / `SessionCallback` and `ProducerCallback` expose the JMS `Session` and `Session` /
`MessageProducer` pair, respectively. The `execute()` methods on `JmsTemplate` run `MessageProducer` pair, respectively. The `execute()` methods on `JmsTemplate` run
these callback methods. these callback methods.

View File

@ -4,13 +4,20 @@
This section describes how to use Spring's JMS components. This section describes how to use Spring's JMS components.
[[jms-jmstemplate]] [[jms-jmstemplate-jmsclient]]
== Using `JmsTemplate` == `JmsTemplate` and `JmsClient`
The `JmsTemplate` class is the central class in the JMS core package. It simplifies the The `JmsTemplate` class is the central class in the JMS core package. It simplifies the
use of JMS, since it handles the creation and release of resources when sending or use of JMS, since it handles the creation and release of resources when sending or
synchronously receiving messages. synchronously receiving messages.
`JmsClient` is a new API variant in Spring Framework 7.0, following the design of
`JdbcClient` and co. `JmsClient` builds on `JmsTemplate` for straightforward send
and receive operations with customization options per operation.
[[jms-jmstemplate]]
=== Using `JmsTemplate`
Code that uses the `JmsTemplate` needs only to implement callback interfaces that give them Code that uses the `JmsTemplate` needs only to implement callback interfaces that give them
a clearly defined high-level contract. The `MessageCreator` callback interface creates a a clearly defined high-level contract. The `MessageCreator` callback interface creates a
message when given a `Session` provided by the calling code in `JmsTemplate`. To message when given a `Session` provided by the calling code in `JmsTemplate`. To
@ -43,10 +50,23 @@ and then safely inject this shared reference into multiple collaborators. To be
clear, the `JmsTemplate` is stateful, in that it maintains a reference to a clear, the `JmsTemplate` is stateful, in that it maintains a reference to a
`ConnectionFactory`, but this state is not conversational state. `ConnectionFactory`, but this state is not conversational state.
[[jms-jmsclient]]
=== Using `JmsClient`
As of Spring Framework 4.1, `JmsMessagingTemplate` is built on top of `JmsTemplate` As of Spring Framework 4.1, `JmsMessagingTemplate` is built on top of `JmsTemplate`
and provides an integration with the messaging abstraction -- that is, and provides an integration with the Spring's common messaging abstraction -- that is,
`org.springframework.messaging.Message`. This lets you create the message to handling `org.springframework.messaging.Message` for sending and receiving,
send in a generic manner. throwing `org.springframework.messaging.MessagingException` and with payload conversion
going through `org.springframework.messaging.converter.MessageConverter` (with many
common converter implementations available).
As of Spring Framework 7.0, a fluent API called `JmsClient` is available. This provides
customizable operations around `org.springframework.messaging.Message` and throwing
`org.springframework.messaging.MessagingException`, similar to `JmsMessagingTemplate`,
as well as integration with `org.springframework.messaging.converter.MessageConverter`.
A `JmsClient can either be created for a given `ConnectionFactory` or for a given
`JmsTemplate`, in the latter case reusing its settings by default. See
{spring-framework-api}/jms/core/JmsClient.html[`JmsClient`] for usage examples.
[[jms-connections]] [[jms-connections]]
@ -293,6 +313,3 @@ in an unmanaged environment, you can specify these values through the use of the
properties `sessionTransacted` and `sessionAcknowledgeMode`. When you use a properties `sessionTransacted` and `sessionAcknowledgeMode`. When you use a
`PlatformTransactionManager` with `JmsTemplate`, the template is always given a `PlatformTransactionManager` with `JmsTemplate`, the template is always given a
transactional JMS `Session`. transactional JMS `Session`.