В моем веб-приложении JavaEE мне нужно обрабатывать входящие сообщения строго в порядке прибытия. Я предполагаю, что мой контейнер webapp (Tomcat 6) сохраняет порядок сообщений по мере их поступления в порт http.
Что вызывает у меня головные боли, так это то, как я внутренне обрабатываю эти сообщения. Для улучшения рабочей нагрузки я добавляю обработку каждого сообщения в ThreadPool, так как многое нужно сделать здесь, например. Разбор XML, иногда обогащение данных с использованием внешних веб-сервисов. По завершении обработки я выдвигаю java-представление сообщения в сложный механизм обработки потока esper.codehaus.org, который является потокобезопасным. Здесь проверяются разные шаблоны, где порядок входа является самым высоким требованием, например, порог явления превышает.
У меня возникла идея вставить каждое обработанное сообщение в PriorityQueue с идентификатором приоритета, который они получили во время прибытия (в моем сервлете, где он увеличивается для каждого сообщения). Проблема заключается в следующем:
Поток, который проверяет элементы из очереди (самый низкий идентификатор - это глава очереди), чтобы вставить его в esper, можно пропустить идентификатор, поскольку он не проверяет отсутствующие элементы. Я предполагаю, что иллюстрация работает лучше:
Для шагов (1) - (4) все работает по назначению. Но на этапе (5) QueuePoller извлекает элемент 6, а не элемент 4 (который позже вставлен на этапе (6)). Это приводит к порядку сообщения: 2; 3; 6; 4.
То, что я пытался сделать, это изменить реализацию опроса головы очереди, чтобы выполнить строгий порядок идентификаторов. Смысл, если следующий идентификационный элемент еще не вставлен в очередь, подождите до барьера до его появления. Казалось, что это работает в течение первых 10 минут, но затем повешено, возможно, из-за элемента, который никогда не вставлен в очередь.
У кого-то есть аналогичная проблема в прошлом и есть какой-то намек на меня?