728x90
반응형
목차
1. mandatory란?
RabbitMQ에 Message를 발행할 때 특정 Exchange의 Routing Key가 없어도 메시지가 발행된다. 이때 mandatory 옵션을 적용하게 되면 Message가 발행 됐을 때 오류를 캐치할 수 있다. 즉, Message 라우팅 실패를 알리는 데 사용할 수 있는 가장 간단한 옵션이다.
만약 Message 라우팅에 성공하면 발행자에게는 별도의 결과를 알려주진 않는다.
2. Setting
mandatory 옵션을 테스트하려면 RabbitMQ에 Exchange만 생성해 두자. Routing Key는 선택사항이다.
3. Rabbitpy로 mandatory 사용하기
Rabbitpy에서 mandatory 옵션은 Message 객체의 publish 메서드를 사용할 때 지정할 수 있다.
rabbitpy.Message(
channel
body,
{
"content_type": "text/plain",
"timestamp": datetime.datetime.now(),
"message_type": "message"
},
)
message.publish(exchange, routing_key, mandatory=True)
전체 코드는 다음과 같다.
import datetime
import rabbitpy
exchange = "sample-exchange"
routing_key = "MY.ROUTING"
with rabbitpy.Connection() as connection:
with connection.channel() as channel:
body = "This is Body"
message = rabbitpy.Message(
channel,
body,
{
"content_type": "text/plain",
"timestamp": datetime.datetime.now(),
"message_type": "message"
},
)
message.publish(exchange, routing_key, mandatory=True)
이제 코드를 실행시키면 다음과 같은 결과를 얻는다.
rabbitpy.exceptions.MessageReturnedException:
Message was returned by RabbitMQ: (312) for exchange NO_ROUTE
메시지를 라우팅 할 수 없다는 결과를 알려주고 있다. Exception이기 때문에 다음과 같이 처리할 수도 있다.
import datetime
import rabbitpy
exchange = "sample-exchange"
routing_key = "MY.ROUTING"
with rabbitpy.Connection() as connection:
with connection.channel() as channel:
try:
...
message.publish(exchange, routing_key, mandatory=True)
except rabbitpy.exceptions.MessageReturnedException as e:
print("Publish Failed")
RabbitMQ는 내부적으로 RPC를 이용한 통신을 하는데 Message 라우팅에 실패하게 되면 이를 비동기로 동작하게끔 작성되었다는 점이다. 즉 message.publish()를 호출한 이후에는 작성된 코드는 그대로 실행이 가능하다. 예를 들어 다음과 같이 message.publish를 하고 0.5초 동안 기다린 다음 "[대기]"라는 문자열을 출력하는 코드를 넣어보자. 실행할 때마다 문자가 출력되는 위치와 Exception이 출력되는 위치가 바뀔 것이다.
import datetime
import rabbitpy
exchange = "sample-exchange"
routing_key = "MY.ROUTING"
with rabbitpy.Connection() as connection:
with connection.channel() as channel:
try:
...
message.publish(exchange, routing_key, mandatory=True)
import time
time.sleep(0.5)
print("[대기]")
except rabbitpy.exceptions.MessageReturnedException as e:
print("Publish Failed")
728x90
반응형
'Server > RabbitMQ' 카테고리의 다른 글
2. Rabbitpy를 이용해 RabbitMQ 다루기 (0) | 2023.09.20 |
---|---|
1. RabbitMQ (0) | 2023.09.19 |