본문으로 건너뛰기

12.7 DLQ와 ExpiryQueue

DLQ와 ExpiryQueue라는 특수한 큐가 있다. DLQ는 Dead Letter Queue의 약어이며 메시지 전송시 오류가 발생하여 전달되지 못한 메시지가 저장되는 큐이다. ExpiryQueue는 메시지에 설정한 메시지 유효기간이 지난 경우에 해당 메시지가 저장되는 큐이다. 기본적으로 메시지에 대해 DLQ와 ExpiryQueue로 전송하도록 설정되어 있긴 하지만, 애플리케이션에서 사용하기 위한 큐는 정의되어 있지 않다. DLQ와 ExpiryQueue를 이용하려면 먼저 사용하려는 큐를 생성해야 한다. 기본적으로 DLQ 와 ExpiryQueue의 JNDI 이름을 아래와 같이 설정하면 된다.

큐 이름항목설정값
DLQjms-queueDLQ
entriesjava:jboss/exported/DLQ
ExpiryQueuejms-queueExpiryQueue
entriesjava:jboss/exported/ExpiryQueue

DLQ 와 ExpiryQueue 를 생성하는 CLI는 다음과 같다.

항목방법
DLQ/ ExpiryQueue 생성
[standalone@localhost:9999 /] jms-queue add --queue-address=DLQ --entries=jboss/exported/DLQ

[standalone@localhost:9999 /] jms-queue add --queue-address=ExpiryQueue --entries=jboss/exported/ExpiryQueue

| DLQ/ ExpiryQueue 조회 | |

[standalone@localhost:9999 /] *cd subsystem=messaging/hornetq-server=default*

[standalone@localhost:9999 hornetq-server=default] *:read-children-resources(child-type=jms-queue)*
{
"outcome" => "success",
"result" => {
"DLQ" => {
"durable" => true,
"entries" => ["jboss/exported/DLQ"],
"selector" => undefined
},
"ExpiryQueue" => {
"durable" => true,
"entries" => ["jboss/exported/ExpiryQueue"],
"selector" => undefined
},
}
}

메시지 유효기간은 JMS의 API에서 설정할 수 있다. 메시지 제공자에서 메시지의 유효기간을 설정할 수 있다. 시간 단위는 밀리 초 단위로 설정한다.

javax.jms.MessageProducer.setTimeToLive(long timeToLive)

또, 메시지를 전송할 때 메시지마다 유효기간을 다르게 설정할 수도 있다.

java.jms.MessageProducer.send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive)

지정한 timeToLive 시간 내에 전달되지 못한 메시지들이 ExpiryQueue에 보관된다.