Reactive Extension을 배우고 있으며 이와 같은 작업에 적합한 지 알아 내려고 노력했습니다.Reactive Extension으로 요청 묶음 처리
요청 단위를 작업 단위로 처리하고 모든 요청이 완료되면 콜백을 호출하는 Process() 메소드가 있습니다.
여기서 중요한 점은 구현에 따라 각 요청이 동기식 또는 비동기식으로 콜백을 호출하므로 배치 프로세서가이 두 가지를 모두 처리 할 수 있어야한다는 것입니다.
그러나 배치 프로세서에서 시작된 스레드가 없으면 필요한 경우 새 스레드 (또는 다른 비동기 실행)가 요청 핸들러 내부에서 시작됩니다. 이것이 rx의 사용 사례와 일치하는지 나는 모른다. 이 같은
내 현재 작업 코드 모양 (거의) :
가 이public void Process(ICollection<IRequest> requests, Action<List<IResponse>> onCompleted)
{
IUnitOfWork uow = null;
try
{
uow = unitOfWorkFactory.Create();
var responses = new List<IResponse>();
var outstandingRequests = requests.Count;
foreach (var request in requests)
{
var correlationId = request.CorrelationId;
Action<IResponse> requestCallback = response =>
{
response.CorrelationId = correlationId;
responses.Add(response);
outstandingRequests--;
if (outstandingRequests != 0)
return;
uow.Commit();
onCompleted(responses);
};
requestProcessor.Process(request, requestCallback);
}
}
catch(Exception)
{
if (uow != null)
uow.Rollback();
}
if (uow != null)
uow.Commit();
}
방법이 사용 RX를 구현하는 것이? 그것은 합리적입니까?
아직 리턴되지 않은 비동기 요청이 있어도 작업 단위 (UOW)가 동 기적으로 확약되어야한다는 점에 유의하십시오. 당신도 동기 또는 비동기 결과를 반환 할 자유예요으로
이것은 실제로 매우 도움이됩니다! 매우 정교한 대답을 주셔서 감사합니다.내가 여기서 진정으로 머리를 맞출 수없는 유일한 방법은 모든 요청에 응답 할 때 어떻게해야합니까? 우편 후에 어떻게 말을해야합니까? 그리고 지금 모든 요청이 응답됨에 따라 이러한 요청/응답 쌍으로이 메소드를 호출하십시오 ... "rqrps"관측 가능에 가입하고 목록에서 응답을 수집하고 방법은 완료되었지만 성공하지 못했습니다 (그리고이 모든 경우에도 목록에서 응답을 수집하는 것은 약간 이상한 것 같습니다). 나는 그것에 관해 약간의 힌트를 정말로 바르게 평가할 것이다 :) – asgerhallas
doh! ... 잘못된 오버로드를 호출했습니다. – asgerhallas
@asgerhallas - 모든 쌍이 돌아 오기를 기다릴 필요는 없습니다. 다시 돌아올 때 처리하기 만하면됩니다. 그렇지 않으면'.ToArray()'observable 연산자를 보자. 그것은'IObservable'을'IObservable '으로 바꾼다. n 개의 값을 관측 할 수있는 하나의 배열을 n 개의 원소로 구성하고 성공할 때에 만 만든다. 귀하의 필요에 맞는 완벽한 운영자처럼 들립니다. –
Enigmativity