AMQP는 메시지를 2가지 모드로 수신할 수 있게 해줘요.
- 클라이언트 요청: GetMessage 메서드를 사용해요. 큐에 메시지가 없으면 OnAMQPBasicGetEmpty 이벤트가 호출돼요.
- 서버 푸시: Consume 메서드를 사용해요.
Consume
컨슈머는 큐에서 메시지를 소비해요. 메시지를 소비하려면 큐가 있어야 해요. 새 컨슈머가 추가될 때 큐에 이미 메시지가 준비되어 있다고 가정하면 전달이 즉시 시작돼요.
컨슈머 등록 시점에 대상 큐가 비어 있을 수도 있어요. 그 경우 새 메시지가 큐에 들어올 때 첫 전달이 시작돼요.
메시지를 소비하는 것은 비동기 작업이에요. 즉, 새 메시지가 컨슈머 큐로 전달될 수 있을 때마다 서버가 자동으로 클라이언트로 푸시해요. 메시지 동기 수신이라는 대체 방법도 있어요.
Consume 메서드는 큐에 새 컨슈머를 만들고, 새 메시지가 있을 때마다 자동으로 컨슈머 클라이언트에 전달돼요.
메서드는 다음 인자를 가져요.
- ChannelName: 채널 이름(이 메서드를 호출하기 전에 열려 있어야 해요).
- QueueName: 큐 이름. 255자를 초과할 수 없고 "amq."로 시작할 수 없어요(passive 매개변수가 true인 경우 제외).
- ConsumerTag: 컨슈머 이름이며 고유해야 해요. 설정하지 않으면 서버가 새로 만들어요.
- NoLocal: true이면 컨슈머는 같은 채널에서 발행된 메시지를 소비하지 않아요.
- NoAck: true이면 서버는 전달되는 모든 메시지에 대한 확인을 기대하지 않아요.
- Exclusive: true이면 다른 컨슈머가 이 큐에서 메시지를 소비하지 못해요.
- NoWait: true이면 서버가 클라이언트에 확인을 보내지 않아요.
메시지는 OnAMQPBasigGetOk 이벤트로 전달돼요.
AMQP.Consume('channel_name', 'exchange_name', 'consumer_tag');
procedure OnAMQPBasicGetOk(Sender: TObject; const aChannel: string; const aGetOk: TsgcAMQPFramePayload_Method_BasicGetOk; const aContent: TsgcAMQPMessageContent);
begin
DoLog('#AMQP_basic_GetOk: ' + aChannel + ' ' + IntToStr(aGetOk.MessageCount) + ' ' + aContent.Body.AsString);
end;
메시지 가져오기
메시지 가져오기는 동기 작업으로, 클라이언트가 서버에 큐에 메시지가 있는지 묻는 방식이에요. 메시지 비동기 수신이라는 대체 방법도 있어요.
GetMessage 메서드는 AMQP 서버에 큐에 사용 가능한 메시지가 있는지 묻는 요청을 보내요. 메시지가 있으면 OnAMQPBasicGetOk 이벤트로 디스패치되고, 큐가 비어 있으면 OnAMQPBasicGetEmpty 이벤트가 호출돼요.
메서드는 다음 인자를 가져요.
- ChannelName: 채널 이름(이 메서드를 호출하기 전에 열려 있어야 해요).
- QueueName: 큐 이름. 255자를 초과할 수 없고 "amq."로 시작할 수 없어요(passive 매개변수가 true인 경우 제외).
- NoWait: true이면 서버가 클라이언트에 확인을 보내지 않아요.
AMQP.GetMessage('channel_name', 'exchange_name');
procedure OnAMQPBasicGetOk(Sender: TObject; const aChannel: string; const aGetOk: TsgcAMQPFramePayload_Method_BasicGetOk; const aContent: TsgcAMQPMessageContent);
begin
DoLog('#AMQP_basic_GetOk: ' + aChannel + ' ' + IntToStr(aGetOk.MessageCount) + ' ' + aContent.Body.AsString);
end;
procedure OnAMQPBasicGetEmpty(Sender: TObject; const aChannel: string);
begin
DoLog('#AMQP_basic_GetEmpty: ' + aChannel);
end;
