Я закодирован именно этот вид службы Windows, и я думаю, что вы на правильном пути.Я использую таблицу базы данных для своей очереди, которая дает мне постоянную очередь в случае сбоя системы, позволяет легко использовать несколько авторов из локальной сети и позволяет управлять контенциями через транзакции.
Я создаю отдельные потоки для каждого процесса и отслеживаю количество активных потоков, что позволяет мне регулировать «на лету». Поскольку каждый поток вызывает вызов веб-службы, было незначительное преимущество от использования threadpool, и это также позволило мне начать много потоков, поскольку они заблокировали ожидание на внешнем сервере.
Легко управлять, если вы разрешаете только один считыватель, что позволяет вам отслеживать записи в очереди, которые вы прочитали, просто используя столбец идентификаторов и выбрав следующий, более высокий, чем последний. По завершении потока он может удалить запись, над которой он работал. Если ваш сервис выйдет из строя, он просто заберет первую непрочитанную запись. Вы можете получить привлекательность, включив столбец, который указывает, когда была затронута запись, и если обработка завершилась неудачно (возможно, из-за сетевого таймаута), вы можете отключить ее и позволить ей попасть в следующее чтение. Если вам нужно иметь несколько считывателей, используйте поле отметки времени, которое указывает, когда оно было затронуто; один читатель может восстановить для другого разбитого читателя, проверяя, когда была затронута запись.
Вы также должны захватить событие закрытия службы, чтобы вы могли закончить обработку чисто и включить свое собственное ведение журнала, чтобы вы могли отслеживать, что происходит, когда вы получаете несколько одновременных авторов.
Также рассмотрите тестовую версию, которая позволяет вам забивать ваш читатель очереди и измерять, как он переносится под нагрузкой. Это поможет вам избавиться от не столь очевидных ошибок, которые скрываются в многопоточном приложении.
Но у меня был взрыв, создающий это, и я надеюсь, что и вы это сделаете.
Если вы используете очередь сообщений, а не таблицу базы данных, рассмотрите ли вы сообщение о очереди как «новую запись» или это конкретное значение, которое может содержать сообщение, которое вы ищете? –
Сообщение о очереди будет новой записью. Кроме того, новая запись будет удалена из очереди сообщений, если она успешно обработана. – Emon