Присоединяйтесь к PortSet's в CCR - PullRequest
       24

Присоединяйтесь к PortSet's в CCR

0 голосов
/ 15 сентября 2010

У меня есть 4 службы, у каждой есть метод с такой подписью:

PortSet<Response1, Exception> GetData1(Request1 request);
PortSet<Response2, Exception> GetData2(Request2 request);
PortSet<Response3, Exception> GetData3(Request3 request);
PortSet<Response4, Exception> GetData4(Request4 request);

Мне нужно запустить их одновременно и объединить конечный результат, результат обработки и исключение, которые поступают из каждого порта отдельно.Не могли бы вы подсказать, как мне это сделать?

Мне удалось найти только возможность присоединиться к результатам из порта, а не из PortSet.

Спасибо

1 Ответ

0 голосов
/ 20 сентября 2010

Ваше решение несколько ограничено количеством участвующих классов.Я бы предложил активировать Choice приемники на каждом PortSet и в каждом обработчике до Post до порта завершения.На порте завершения вы можете использовать Join, когда все они завершены. Так, вне моей головы, и предполагая, что вы выводите из CcrServiceBase (в противном случае вам нужно будет использовать Arbiter.Activate вместо более краткогоActivate):

var cPort=new Port<EmptyValue>();
Activate(GetData1(myRequest1)
    .Choice(r1=>{
        Process(r1);
        cPort.Post(EmptyValue.SharedInstance);
    },ex=>{
        Process(ex);
        cPort.Post(EmptyValue.SharedInstance);
    }); //etc 4 times

Activate(cPort.Join(4,e=>{
    //all completed. Proceed here...
}));

Если бы вместо этого у вас был общий тип Response, вы могли бы вместо этого структурировать свои вызовы следующим образом:

var PortSet<Response,Exception> ps=new PortSet<Response,Exception>();
GetData1(request1,ps);
GetData2(request2,ps);
GetData3(request3,ps);
GetData4(request4,ps);

вместо GetDataвызывая создание нового PortSet, вы предоставляете общий PortSet и предоставляете его для методов GetData.

Теперь вы можете выполнить получение нескольких элементов:

ps.MultipleItemReceive(4,
    responses=> {
        foreach(var response in responses)
        {
            //process response
        }
    },
    exceptions=> {
        foreach(var exception in exceptions)
        {
            //process exception
        }
    })
...