시장에는 다양한 JMS provider가 있다(ex. RabbitMQ, ActiveMQ, etc..) 자바에서 이런 메세지 서버와 메세지를 주고받는 기능을 표준화 한 것이 JMS이다. 즉 JMS란 비동기식 메시징을 위한 표준 API이다. JMS와, JMS을 Spring framework에서 한 단계 더 추상화 한 ?에 대해서도 알아보자.
JMS endpoint type에는 Queue, Topic 등이 있다. 다른 타입은 제쳐두고 이 두 녀석을 알아보자.
Queue에서 메세지를 가져가면 사라진다. 따라서 1명의 consumer만 데이터에 접근할 수 있다. enqueue되는 시점에 consumer가 없어도 된다. 시간적인 여유가 있다. 하지만 Topic은 topic을 sub 하고 있는 모든 consumer가 message를 받게 되고, publish 순간에 sub하고 있지 않은 consumer는 데이터를 받을 수 없다.
Topic을 사용하기 위해서는 JMSTemplate의 pubSubDomain property를 true로 설정해 주어야 한다. 그렇게 하면 session안에서 Topic을 생성할 수 있다.
JmsTemplate.send("createTopicRuntime", new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
session.createTopic("dynamicTopic");
Object objectMessage = session.createObjectMessage();
objectMessage.setObject(someObject);
return objectMessage; }
}
});
JMS로 메세지를 보내기 위해서는 보내고자 하는 객체 또는 문자열을 Message형식으로 변환해야 한다. JMS은 이런 serialize / deserialize method를 제공한다.
JmsTemplate.receive는 blocking method이다.
JMS 메세지를 비동기적으로 받기 위해서는
MessageListener interface
public class FixedDepositMessageListener implements MessageListener {
...
@Override
public void onMessage(Message message) {
ObjectMessage objectMessage = (ObjectMessage) message;
...
}
}
@JmsListener annotaion
@Component
public class MyAnnotatedJmsListener {
...
@JmsListener(destination = "emailQueueDestination")
public void processEmailMessage(Message message) { ... }
...
}