복붙노트

[REDIS] 내 도메인에서 발생한 이벤트에서 RedMQ에서 핸들러를 설정하는 방법

REDIS

내 도메인에서 발생한 이벤트에서 RedMQ에서 핸들러를 설정하는 방법

그냥 메시지 큐와 레디 스 MQ, 우수한 프레임 워크 주위에 내 머리로 받아 냄으로써.

난 당신이 메시지 큐에있는 메시지의 종류 / 이벤트를 처리 할 핸들러 결정 .RegisterHandler (...)를 사용해야하는 것으로 알고 있습니다.

내가 EventB 등 EventA이 있다면 그래서 내가 좋아하는 그 이벤트, 각각을 처리 한 서비스가 있어야합니다

public class DomainService : Service {

    public object Any(EventA eventA) {...}
    public object Any(EventB eventA) {...}
}

다음은 큐해야한다 그래서 / 목록을 생성 레디 스?

또한, 나는 형 EventA의 메시지는 이전 체인에서 핸들러를 성공적으로 제공하는 이메일을 전송하는 핸들러가 그래서 예를 들어, 일련의 사건이 일어날 것을 원한다면?

해결법

  1. ==============================

    1.ServiceStack는 MQ의, REST 위해 만든 서비스 사이에 차이가 없습니다, HTML 또는 SOAP 서비스, 그들은 같은 일입니다. 그들은 각각 요청 DTO에 동의하고 선택적으로 엔드 포인트 또는 형식, 예 : HTML, REST, SOAP 또는 MQ에서 전화를 처리 할 수있는 응답 DTO와 동일한 서비스를 반환 즉.

    ServiceStack는 MQ의, REST 위해 만든 서비스 사이에 차이가 없습니다, HTML 또는 SOAP 서비스, 그들은 같은 일입니다. 그들은 각각 요청 DTO에 동의하고 선택적으로 엔드 포인트 또는 형식, 예 : HTML, REST, SOAP 또는 MQ에서 전화를 처리 할 수있는 응답 DTO와 동일한 서비스를 반환 즉.

    MQ가에 맞는 방식을 볼 수 ServiceStack의 아키텍처 다이어그램을 참조하십시오.

    염두에 두어야 할 유일한 사항은 다음과 같습니다

    당신은 일반적으로 등록 된 처리기, 예컨대 내부에서 수행되는 ServiceStack 자신으로 메시지를 전달할 때까지 MQ 호스트 자체가 완전히 MQ를 모르는 ServiceStack 프레임 워크의 나머지 부분과 분리되어 존재한다 :

    var redisFactory = new PooledRedisClientManager("localhost:6379");
    var mqHost = new RedisMqServer(redisFactory, retryCount:2);
    
    mqHost.RegisterHandler<Hello>(m => {
        return this.ServiceController.ExecuteMessage(m);
    });
    
    //shorter version:
    //mqHost.RegisterHandler<Hello>(ServiceController.ExecuteMessage);
    
    
    mqHost.Start(); //Starts listening for messages
    

    당신의 RegisterHandler 에서 당신은 당신이 수신 할 요청의 유형을 지정합니다.

    기본적으로 당신은 단지 요청이이 방법 서명 첫번째 매칭을 찾고 있어요 MQ의 경우, 알려진 서비스 구현에 연결되어 각 메시지와 ServiceStack에서 하나의 핸들러를 등록 할 수 있습니다 : 포스트 (안녕하세요)와 그 않는 경우 존재하지 그것은 대체 어떤 (안녕하세요)을 찾습니다.

    여러 처리기를 호출 할 경우, 당신은 당신의 자신의 목록 <핸들러>를 유지할 것 그냥 통과하고 요청이 들어 오면 그들 모두를 실행합니다.

    다른 서비스를 호출 할 경우, 단지 다른 요청 DTO로 번역 대신 ServiceController에 그것을 전달합니다.

    MQ 요청이 누군가에 의해 전송되면, 예컨대 :

    mqClient.Publish(new Hello { Name = "Client" });
    

    귀하의 핸들러는 요청 DTO는 본문 속성에 포함되는 형태의 iMessage를의 인스턴스로 호출됩니다. 그 시점에서 당신은 메시지를 폐기 선택을 확인하거나 변경할 수 있습니다.

    대부분의 경우는 일반적으로 단지 과정에 ServiceController에 메시지를에 전달할 것, 구현은이다 :

    public object ExecuteMessage<T>(IMessage<T> mqMsg)
    {
        return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
    }
    

    구현은 단지 정상적인 서비스의 존재와 같은 메시지가 MQ IHttpRequest, IHttpResponse 스텁을 포함하는 MqRequestContext으로, 그 시점에서 C #을 요청 DTO를 통과하는 요청 mqMsg.Body에서 DTO와 프로세스를 추출합니다.

  2. from https://stackoverflow.com/questions/13839971/how-to-set-up-handlers-in-redmq-from-events-raised-in-my-domain by cc-by-sa and MIT license