2013-03-07 2 views
2

У меня есть приложение, которое будет постоянно получать цены на акции из внешней системы.Потребители очереди и состояние гонки

Цены будут определяться запасом.

По мере поступления цен они будут отправлены в очередь блокировки.

Будет пул потоков, который будет потреблять и обрабатывать из этой очереди и помещать цены в кеш (хэш карты id и цены).

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

Есть ли способ обойти этот сценарий?

Как я могу убедиться, что последнее обработано последним?

+0

У вас есть контроль над объектом «StockPrices»? Значение - это объект, который вы можете манипулировать полями и методами? – Jeremy

+0

Поскольку это происходит из внешней системы, я не контролирую ее. – user1736924

+0

Как насчет обертывания объекта для добавления полей или методов? – dgregory

ответ

1

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

В качестве альтернативы вы можете разделить свой фондовый юниверс по потокам, что означает, что обновления для данного запаса всегда обрабатываются одним и тем же потоком.

+0

aah, мне нравится подход к разбиению. Любой пример кода, который показывает, как это сделать? – user1736924

+0

@ user1736924: Одна очередь на рабочий поток (где каждому потоку будет присвоен набор запасов для обработки). Код, который принимает входящее сообщение, помещает каждое сообщение в правильную очередь. Если вы решите воспользоваться этим подходом, вам нужно подумать о балансировке нагрузки. – NPE

+1

Page 92 JCiP, LinkedBlockingDeque (подход кражи работы) –

Смежные вопросы