Скала фолдинг с использованием акки - PullRequest
4 голосов
/ 19 сентября 2011

Я реализовал в Java то, что я назвал «складной очередью», то есть LinkedBlockingQueue, используемой службой ExecutorService.Идея состоит в том, что каждая задача является уникальным идентификатором, который, если он находится в очереди, в то время как другая задача отправляется через этот же идентификатор, не добавляется в очередь.Код Java выглядит следующим образом:

public final class FoldablePricingQueue extends LinkedBlockingQueue<Runnable> {
    @Override
    public boolean offer(final Runnable runnable) {
        if (contains(runnable)) {
            return true; // rejected, but true not to throw an exception
        } else {
            return super.offer(runnable);
        }
    }
}

Потоки должны быть предварительно запущены, но это незначительная деталь.У меня есть абстрактный класс, который реализует Runnable, который принимает уникальный идентификатор ... это тот, который передан в

Я хотел бы реализовать ту же логику, используя Scala и Akka (Actors).Мне нужно было бы иметь доступ к почтовому ящику, и я думаю, что мне нужно переопределить!метод и проверьте почтовый ящик для события .. кто-нибудь делал это раньше?

Ответы [ 3 ]

4 голосов
/ 20 сентября 2011

Это в точности , как работает почтовый ящик Akka.Почтовый ящик Akka может существовать только один раз в очереди задач.

Просмотр:

https://github.com/jboner/akka/blob/master/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala#L143

https://github.com/jboner/akka/blob/master/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala#L198

Очень дешево реализуется с использованиематомарное логическое значение, поэтому нет необходимости проходить через очередь.

Кроме того, кстати, ваша очередь в Java не работает, поскольку она не переопределяет put, add или offer (E, long, TimeUnit).

2 голосов
/ 19 сентября 2011

Может быть, вы могли бы сделать это с двумя актерами.A facade один и worker один.Клиенты отправляют вакансии на facade.Facade переходит затем к worker и запоминает их во внутреннем состоянии, Набор queuedJobs.Когда он получает работу, которая queued, он просто отказывается от нее.Каждый раз, когда worker начинает обрабатывать задание (или завершает его, в зависимости от того, что вам подходит), он отправляет сообщение StartingOn (задание) на фасад, который удаляет его из queuedJobs.

1 голос
/ 19 сентября 2011

Предлагаемый дизайн не имеет смысла.Самым близким к Runnable будет Actor.Конечно, вы можете хранить их в списке и не добавлять их, если они уже есть.Такие списки хранятся участниками маршрутизации , которые могут быть созданы из готовых деталей, предоставленных Akka, или из базового субъекта с использованием метода forward.

Вы не можете заглянуть в другойпочтовый ящик актера и переопределение ! не имеет смысла.Что вы делаете, вы отправляете все свои сообщения субъекту маршрутизации, и этот субъект маршрутизации перенаправляет их в правильный пункт назначения.

Естественно, поскольку получает этих сообщений, он может выполнять любую логикув этот момент.

...