Как создать синглтон, который всегда работает в отдельном потоке? - PullRequest
1 голос
/ 27 апреля 2011

Я хотел бы перефразировать мой предыдущий вопрос Как создать Singleton с помощью асинхронного метода?

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

Мне нужно внедрить класс Connection.Он должен быть одноэлементным, потому что он содержит «сокет» внутри, и этот сокет должен сохраняться в течение всего времени жизни приложения.

Тогда я хочу реализовать асинхронный метод Connection.postMessage

Поскольку postMessage может занятьзначительный период времени:

  • postMessage должен быть асинхронным
  • postMessage должен помещать сообщения в очередь, если необходимо

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

Мне совершенно необходимо создать ровно одну дополнительную тему для отправки сообщений, но я не знаю, где и как.

обн .: хороший пример http://msdn.microsoft.com/en-us/library/yy12yx1f(v=vs.80).aspx

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

Нет, почтовое сообщение (само по себе) не должно быть асинхронным.

Оно должно

  • быть потокобезопасным
  • , чтобы поток обработки работал
  • поставить сообщение в очередь (ConcurrentQueue)
  • return

И поток обработки должен

  • Ожидать в очереди
  • Процесссообщения
  • может завершаться, когда простаивает в течение хх миллисекунд

Классическая ситуация «производитель / потребитель» с 1 потребителем и несколькими производителями.

PostMessage является отправной точкой для всех производителей.

1 голос
/ 27 апреля 2011

JP

Здесь вы видите классическую проблему производителя / потребителя ... Во время инициализации Connection должен создать MessageQueue start Sender в своем собственном фоновом потоке.

Затем соединение posts просто отправляет сообщения в очередь, чтобы отправитель мог забрать и переслать, когда будет готов.

Сложный бит управляет максимальным размером очереди ... Если производитель последовательно опережает потребителя, тогда очередь может увеличиться до неуправляемого размера. Самый простой подход заключается в блокировке потока производителя до тех пор, пока очередь не перестанет заполняться. Это можно сделать с помощью back-off-ARQ. то есть: while(queue.isFull) sleep(100, "milliseconds"); queue.add(message); Если вам не требуется 100% -ная передача (например, чат-приложение), вы можете просто выдать исключение MessageQueueFullException, и бедному клиенту просто придется преодолеть это ... просто всегда позволяйте им повторить позже ... позволяя пользователю управлять повторными попытками для вас.

Вот как бы я справился с этим. Мне будет интересно посмотреть, какие другие предложения приглушены.

Надеюсь, у вас все получится. Приветствия. Кит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...