Параллельная обработка сообщений в строгом порядке.

В моем веб-приложении JavaEE мне необходимо обрабатывать входящие сообщения строго в порядке поступления. Я предполагаю, что мой контейнер веб-приложений (Tomcat 6) сохраняет порядок сообщений по мере их поступления на порт http.

Что вызывает у меня головную боль, так это то, как я внутренне обрабатываю эти сообщения. Для улучшения рабочей нагрузки я добавляю обработку каждого сообщения в ThreadPool, так как здесь нужно сделать много вещей, например. Парсинг XML, иногда обогащение данных с помощью внешних веб-сервисов. После завершения обработки я помещаю java-представление сообщения в механизм обработки сложных потоков esper.codehaus.org, который является потокобезопасным. Здесь проверяются различные шаблоны, где порядок входа является наивысшим требованием, например превышение порога явления.

У меня была идея вставить каждое обработанное сообщение в PriorityQueue с идентификатором приоритета, который они получили во время прибытия (в моем сервлете, где он увеличивается для каждого сообщения). Проблема в следующем:

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

enter image description here

Для шагов (1) - (4) все работает так, как задумано.Но на шаге (5) QueuePoller извлекает элемент 6, а не элемент 4 (который позже вставляется на шаге (6)). Это приводит к порядку сообщений: 2; 3; 6; 4.

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

Кто-нибудь сталкивался с похожей проблемой в прошлом и может мне что-нибудь подсказать?

10
задан skaffman 20 March 2012 в 09:42
поделиться