JMS with IBM MQ using Spring Boot
September 1, 2026

1. Overview of IBM MQ
IBM MQ stands for International Business Machines Message Queue.
IBM MQ (formerly WebSphere MQ) is a robust message-oriented middleware (MOM) that enables applications to communicate asynchronously using messages.
- Reliable, guaranteed message delivery
- Asynchronous communication
- Supports multiple platforms (Java, .NET, etc.)
- Transactional support
- High availability and clustering
2. What is JMS?
JMS (Java Message Service) is a Java API that allows applications to create, send, receive, and read messages.
- Point-to-Point (Queue)
- One producer → one consumer
- Publish/Subscribe (Topic)
- One producer → multiple subscribers
- Producer
- Consumer
- Message
- Queue / Topic
- ConnectionFactory
3. How JMS + IBM MQ Works
IBM MQ acts as the message broker, and JMS provides the Java interface.
- Producer sends message using JMS API
- IBM MQ queue stores the message
- Consumer retrieves message via JMS listener
4. Why We Should Use IBM MQ
Angular now supports Vitest as the default testing tool.
- Guaranteed delivery (even during failures)
- Decouples systems (loose coupling)
- Handles high-volume traffic
- Supports transactions (commit/rollback)
- Enterprise-grade security
- Banking transactions
- Order processing systems
- Microservices communication
- Legacy system integration
5. How IBM MQ is Similar to Kafka
| Feature | IBM MQ | Kafka |
|---|---|---|
| Messaging Model | Queue-based | Log-based streaming |
| Persistence | Strong guaranteed | High throughput storage |
| Use Case | Enterprise systems | Event streaming |
| Ordering | Strict | Partition-based |
| Replay Messages | Limited | Strong replay capability |
6. IBM MQ with Java Spring Boot
- spring-jms (generic JMS support)
- IBM MQ specific starter
- Auto-configuration
- Annotation-based listeners
- Simplified connection handling
7. Required Dependencies
Maven Dependencies:
<dependencies>
<!– Spring Boot Web (Required for REST Controller) –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!– Spring JMS Abstraction –>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<!– Jakarta Messaging API –>
<dependency>
<groupId>jakarta.jms</groupId>
<artifactId>jakarta.jms-api</artifactId>
</dependency>
<!– IBM MQ Starter –>
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>mq-jms-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!– Optional: Lombok –>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
8. Why Spring Boot Uses IBM MQ
- Minimal configuration
- Built-in JMS abstraction
- Easy message listener setup
- Production-ready integration
9. Methodology & Structure (Setup + Design)
- Install IBM MQ locally or use Docker
- Create:
- Queue Manager
- Queue
- Channel
crtmqm QM1
strmqm QM1
runmqsc QM1
DEFINE QLOCAL(‘TEST.QUEUE’)
DEFINE CHANNEL(‘DEV.APP.SVRCONN’) CHLTYPE(SVRCONN)
Step 3: Project Structure
src/main/java
├── config
├── producer
├── consumer
├── model
└── controller
Step 4: application.properties
ibm.mq.queueManager=QM1
ibm.mq.channel=DEV.APP.SVRCONN
ibm.mq.connName=localhost(1414)
ibm.mq.user=admin
ibm.mq.password=admin
ibm.mq.queue=TEST.QUEUE
spring.jms.listener.auto-startup=true
spring.jms.listener.concurrency=1-5
10. Full Working Example (Spring Boot + IBM MQ)
10.1 Main Application
@SpringBootApplication
@EnableJms
public class MqApplication {
public static void main(String[] args) {
SpringApplication.run(MqApplication.class, args);
}
}
10.2 Message Producer
@Service
public class MessageProducer {
@Autowired
private JmsTemplate jmsTemplate;
@Value(“${ibm.mq.queue}”)
private String queue;
public void sendMessage(String message) {
jmsTemplate.convertAndSend(queue, message);
System.out.println(“Message sent: ” + message);
}
}
10.3 REST Controller
@RestController
@RequestMapping(“/mq”)
public class MessageController {
@Autowired
private MessageProducer producer;
@PostMapping(“/send”)
public String send(@RequestParam String msg) {
producer.sendMessage(msg);
return “Message sent!”;
}
}
10.4 Message Consumer
@Component
public class MessageConsumer {
@JmsListener(destination = “${ibm.mq.queue}”)
public void receiveMessage(String message) {
System.out.println(“Received Message: ” + message);
}
}
10.5 Postman Curl for test
-> Directly import below curl in postman for testing
curl -X POST “http://localhost:8080/mq/send?msg=HelloIBMmq” \
-H “Content-Type: application/json”
11. Additional Important Topics (Often Missed)
- Use Dead Letter Queue (DLQ)
- Retry mechanisms
- TextMessage
- ObjectMessage
- BytesMessage
- SSL/TLS configuration
- Authentication
- Connection pooling
- Listener concurrency
12. Best Practices
- Use connection pooling
- Handle failures using DLQ
- Avoid large message sizes
- Use asynchronous consumers
- Monitor queues regularly
13. Real-World Example Flow
Order Service → MQ Queue → Payment Service → MQ Queue → Notification Service
Conclusion
- Reliability
- Scalability
- Loose coupling
Get In Touch
"Share your ideas and get the best software service in the industry."

No comment