Как найти диспетчер сообщений

 

Igor

Новичок

Сообщений: 2
Баллов: 1
Rating:

0

Authority:

0

Регистрация: 10.08.2015

Поставил себе Win 10 (не спрашивайте зачем =)), ну и соответственно пришлось ставить другую Мышь.  И с удивлением обнаружил, что пункт Диспетчер Писем, похоже, вообще исчез. Пробовал разные версии после 4-ки.  Его действительно нет или я не могу найти?

 

The Provizor

Мастер

Сообщений: 372
Баллов: 340
Rating:

10

Authority:

10

Регистрация: 10.07.2014

Смысл есть хотя бы такой – поддержка 10-ки переживёт почти на 8 лет восьмёрочную. А 8 лет каникул до покупки/апгрейда следующего опуса магнума Редмонда это экономия денег.
А вот почему соответственно пришлось ставить другую Мышь мне было бы любопытно узнать. Ну не определит макрос 6-ой Мыши правильно версию Win10, ну и что?
У меня выньдос ещё не обновился до 10-ки, хотя как погляжу в процессе апгрейда.
А Мышь у меня v 6.7.7. Как-то не горю желанием ни покупать более продление, ни бесплатно апгрейдить до капа.

 

Igor

Новичок

Сообщений: 2
Баллов: 1
Rating:

0

Authority:

0

Регистрация: 10.08.2015

Другую мышь потому что четверка просто не запускалась. Поискал следующую по старшинству.

Но вопрос-то был другой: где Диспетчер Писем, но есть или его нет?

 

The Provizor

Мастер

Сообщений: 372
Баллов: 340
Rating:

10

Authority:

10

Регистрация: 10.07.2014

Заждался я пока Win10 сама установится и насильно

обновил

. Грохнул пару папок с новыми Apps’ами:

и установил старый добрый калькулятор. .
Бат v 6.7.7.7 (про v4 на Win10 ничего не могу сказать) нормально запустился (не сомневался) etc. и MS Office 2010 (чего опасался), но дефрагментёр Raxco не пережил, надо ещё сотен восемь заплатить за апгрейд до v14.
Кстати, я погрешил против истины прям по Лысенковски сравнив дату окончания основной поддержки Windows 8 с датой окончания расширенной поддержки Windows 10. Не такая уж и большая разница.

Сведения о жизненном цикле Windows

.

 

Алексей Мыслин

Пользователь

Сообщений: 1
Rating:

0

Authority:

0

Регистрация: 20.08.2015

Доброго времени суток!

Поддерживаю вопрос о “диспетчере писем”! Стоит Бат 7.0.0.56 32-bit, но в меню “Ящик” нет пункта “Диспетчер писем” и это на старой-доброй ХР.

Что ответят разработчики..

 

Victoria Kachko

Пользователь

Сообщений: 1
Rating:

0

Authority:

0

Регистрация: 04.07.2019


1.998
 

31.08.2019 14:15:33

Тоже не могу найти Диспетчер писем в Бате 8. Где его найти?

 

George

Администратор

Сообщений: 1583
Баллов: 2864
Rating:

111

Authority:

110

Регистрация: 21.11.2013

 

Тома Степанов

Новичок

Сообщений: 3
Баллов: 1
Rating:

0

Authority:

0

Регистрация: 23.03.2016

То же самое. Специально клиент купил Bat ради диспетчера писем, а его нет. Версия 8.8.9 64 бит. Разработчики или кто знает в чем дело?

 

Тома Степанов

Новичок

Сообщений: 3
Баллов: 1
Rating:

0

Authority:

0

Регистрация: 23.03.2016

CTRL+F2 не предлагать т.к нет диспетчера писем то и команда не работает.

 

Тома Степанов

Новичок

Сообщений: 3
Баллов: 1
Rating:

0

Authority:

0

Регистрация: 23.03.2016

При создании нового ящика POP3 там все есть. Видимо что то связано или с переносом данных или с созданием первого ящика или с режимом IMAP.  

 

Anton Zailinger

Мастер

Сообщений: 44
Баллов: 78
Rating:

10

Authority:

10

Регистрация: 15.10.2015

#11


8.6859
 

30.09.2019 21:02:57

Цитата
Тома Степанов написал:
При создании нового ящика POP3 там все есть. Видимо что то связано или с переносом данных или с созданием первого ящика или с режимом IMAP.  

Именно так. Диспетчер писем работает только на ящиках, настроенных на протоколе POP3. На IMAP  ящиках он не работает.  

Изменено: Anton Zailinger30.09.2019 21:03:31

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

как отключить уведомления на Андроиде

Содержание:
1. Что такое уведомления на Андроиде
2. Жизнь с уведомлениями

3. Как отключить уведомления на Андроиде?
4. Не приходят уведомления на Андроид из-за настроек интернета
5. Как запретить уведомления для отдельных приложений без Wi-Fi

6. Как убрать ограничения фоновых данных для приложения
7. Как запретить уведомления для всех приложений без Wi-Fi
8. Как убрать препятствия для получения уведомлений

На любом смартфоне можно подключить почту на один или сразу на несколько почтовых ящиков. Также на смартфон можно установить различные приложения для того, чтобы быть всегда онлайн, на связи и не пропустить чего-то важного. Это могут быть, например, приложения Фейсбука, ВКонтакте, Инстаграма, мессенджера WhatsApp и другие.

Что такое уведомления и как они выглядят

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

  • есть входящий звонок, либо он был пропущен,
  • пришло новое письмо на почту,
  • в Инстаграме кто-то поставил лайк,
  • на Фейсбуке некто прокомментировал ваше сообщение,
  • на Вотсап (WhatsApp) пришел ответ, например, о месте и времени встречи
  • и так далее.

Уведомления на телефоне Андроид – это краткое сообщение в одну строку на Главной странице телефона о том, что появилось что-то новенькое: есть звонок, получено письмо, сообщение из мессенджера, лайк, комент и т.п.

Уведомления на Главной странице телефона могут выглядеть таким образом:

Уведомления на телефоне

Рис. 1. Уведомления на телефоне

Чтобы удалить одно уведомление, нужно провести пальчиком по нему влево или вправо. Тогда оно исчезнет с Главной страницы смартфона.

Хороша ли жизнь с уведомлениями

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

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

На телефоне можно (и даже весьма желательно) установить режим «Не беспокоить», например, с 22:00 до 7:00. Однако в остальное время, днем неплохо бы поработать и успеть сделать много разных дел. Известно, что если постоянно отвлекаться на различные уведомления, то практически нереально что-либо сделать до конца, причем сделать хорошо.

В таком случае можно, конечно, кардинально решить вопрос и просто удалить те приложения с телефона, которые постоянно отвлекают. Но не всегда это помогает. Например, Фейсбук продолжит упорно слать уведомления из браузера на телефоне (хотя их можно отключить).

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

Как отключить уведомления на Андроиде?

Уведомления можно отключить, а при необходимости потом снова включить. Если кратко, то для этого надо:

  1. Открыть «Приложения» на Андроиде.
  2. Найти там «Диспетчер приложений».
  3. Далее предстоит отыскать и открыть приложение, для которого надо отключить (либо включить) уведомления.
  4. Чтобы отключить уведомления для того приложения, которое открыто в «Диспетчере приложений», надо кликнуть на клеточку с зеленой галочкой напротив «Выводить уведомления». После этого клеточка станет пустой, а уведомления больше не будут приходить.
  5. Чтобы включить уведомления, надо щелкнуть по пустой клеточке напротив «Выводить уведомления» таким образом, чтобы появилась зеленая галочка. Тогда уведомления для открытого приложения будут выводиться на телефон.

При отключении или включении уведомлений надо также смотреть настройки доступа смартфона к интернету, о которых речь пойдет ДАЛЕЕ.

Рассмотрим перечисленные выше пять пунктов детально. Приведенные скриншоты сделаны на Андроиде версии 5.0.2.

  1. Открываем «Приложения» на Андроиде (рис. 2):

Приложения Андроид

Рис. 2. Приложения

  1. В «Приложениях» находим «Настройки» (рис. 3):

Настройки на Андроиде

Рис. 3. Настройки

В «Настройках» имеется вкладка «Устройство», в которой находится «Диспетчер приложений» (рис. 4):

Диспетчер приложений Андроид

Рис. 4. Диспетчер приложений

  1. В «Диспетчере приложений» надо найти и открыть то приложение, для которого требуется отключить уведомления. Для примера на рис. 5 открыто приложение для почты «Gmail»:

выводить уведомления на Андроиде

Рис. 5. Зеленая галочка дает добро, чтобы выводить уведомления на Андроиде

Зеленая галочка рядом со строкой «Выводить уведомления» (рис. 5) означает, что на телефон в режиме онлайн, «здесь и сейчас» будут приходить оповещения о каждом новом письме, которое пришло на почту. Причем, если письмо явно является спамом, но оно по каким-то причинам не попало в папку «Спам», то уведомление о таком спамном письме тоже будет выслано и получено на телефон.

  1. Чтобы отключить уведомления, прикасаемся пальчиком к зеленой галочке напротив «Выводить уведомления» (рис. 5). Сразу выскакивает окно «Отключить уведомления?» (рис. 6):

Отключить уведомления на Андроиде

Рис. 6. Отключить уведомления

Есть поговорка: «Главное – прокукарекать, а дальше хоть не рассветай». Так принято говорить в подтверждение своей непричастности к чему-либо и нежелания брать насебя ответственность за дальнейший ход событий.

Похоже, как раз в соответствии с этой народной мудростью поступает и операционная система Андроид на телефоне, которая честно пытается прокукарекать, то есть предупредить пользователя: «Если отключить уведомления для этого приложения, можно пропустить важные оповещения или обновления» (рис. 6).

Находясь в твердом уме и здравой памяти, нажимаем «Да» (рис. 6). После этого клеточка напротив «Выводить уведомления» станет пустой (рис. 7):

Уведомления не будут выводиться

Рис. 7. Уведомления не будут выводиться

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

  1. Чтобы включить уведомления для какого-то приложения, надо поставить галочку, чтобы она стала зеленой в поле «Выводить уведомления» (рис. 8).

Например, для приложения WhatsApp можно оставить оповещения о том, что там появилось новенькое сообщение:

Для WhatsApp уведомления выводятся

Рис. 8. Для WhatsApp уведомления выводятся

Таким образом, для каждого приложения по отдельности можно настроить уведомления: выводить их или же не выводить.

Не приходят уведомления на Андроид из-за доступа к интернету

Также причина того, что приходят, либо не приходят уведомления на Андроид зависит от того, как происходит доступ смартфона к интернету:

  • по Wi-Fi,
  • либо от сим-карты.

Работа приложений Андроида может быть настроена в зависимости от того, подключен ли телефон к сети Wi-Fi или он работает только от СИМ-карты, то есть получает доступ к интернету через услуги сотового оператора.

Если на смартфоне настроено получение уведомлений тех или иных приложений, то эти приложения могут напрасно расходовать мобильный трафик, получаемый от оператора услуг сотовой связи с помощью СИМ-карты. Данный трафик может быть сильно платным, поэтому в Андроиде предусмотрена возможность отключать уведомления для приложений при работе телефона вне сети Wi-Fi.

Сеть Wi-Fi,  по логике разработчиков Андроида, является бесплатной и безлимитной, поэтому в сети Wi-Fi ограничения на получение уведомлений от приложений Андроида не устанавливаются.

Как запретить уведомления для отдельных приложений, если нет Wi-Fi

Как отключаются уведомления от приложений при работе телефона вне сети Wi-Fi? Для этого опять же заходим в «Приложения» (рис. 2), затем в «Настройки» (рис. 3). Но теперь выбираем в настройках опцию «Использование данных» (рис. 9).

Использование данных

Рис. 9. Использование данных

Затем переходим на вкладку, где показано, как используются данные, получаемые с помощью СИМ-карты  телефона (желтая цифра 1 на рис. 10 – это СИМ-карта с именем НАДЕЖДА, если две симки).

использование данных при работе через СИМ карту

Рис. 10. Вкладка статистики использования данных при работе через СИМ-карту

На рис. 10 с цифрами:

  • 1 – это вкладка СИМ-карты НАДЕЖДА и
  • 2 – это приложение Gmail, для которого мы настраиваем запрет получения уведомлений при работе вне сети Wi-Fi.

После чего листаем вкладку «Использование данных» вниз, чтобы выбрать те приложения, по которым мы хотим ограничить получение уведомлений при работе телефона вне сети Wi-Fi.

Покажем это на примере приложения Gmail (2 на рис. 10). Кликаем (тапаем пальцем) по этому приложению. Откроется окно статистики «Использования данных приложениями» для Gmail и настроек ограничения использования фоновых данных (рис. 11).

использование фоновых данных для Gmail

Рис. 11. Настройки использования фоновых данных для приложения Gmail

В открывшемся окне настроек находим надпись «Ограничить фоновые данные». И тапаем по квадратику возле этой надписи, чтобы в квадрате появилась зеленая галочка, указывающая на ограничение использования данных из Интернета, если смартфон не будет подключен к сети передачи данных Wi-Fi.

После клика по квадратику ограничения фоновых данных появится дополнительное окно, где нас переспросят, действительно ли мы хотим ограничить получение уведомлений для данного приложения при работе смартфона вне сети Wi-Fi (рис. 12).

ограничение фоновых данных для Gmail

Рис. 12. Подтверждение ограничения фоновых данных для приложения Gmail

Отвечаем утвердительно «ОК», после чего появится зеленая галочка в квадратике возле надписи «Ограничить фоновые данные» (рис. 13).

включено ограничение фоновых данных для Gmail

Рис. 13. Ограничение фоновых данных для приложения Gmail включено

Теперь на телефон не будут приходить уведомления приложения Gmail, если телефон не будет подключен к сети передачи данных по Wi-Fi, даже если для этого приложения установлено разрешение на прием уведомлений. Если же телефон будет находиться в зоне действия Wi-Fi, то уведомления будут приходить.

Как убрать ограничения фоновых данных для приложения

Отключение данного режима, отмена запрета фоновых данных для приложения Gmail делается таким же кликом по квадратику возле надписи «Ограничение фоновых данных», только теперь мы не ставим зеленую галочку, а убираем ее (рис. 13).

Снятие галочки происходит одним тапом (кликом) без получения предупредительной надписи, как это было при постановке зеленой галочки. Тапаем, и галочка исчезает – это означает теперь, что прием уведомлений для приложения Gmail будет происходить как при подключении телефона к сети Wi-Fi, так и при работе только от СИМ-карты.

Аналогичным образом можно устанавливать ограничения на использование фоновых данных для любых других приложений Андроида. Точно так же, как это было показано для приложения Gmail.

Как запретить уведомления для всех приложений, когда нет Wi-Fi

Может быть так, что пользователю Андроида, владельцу телефона, неудобно для каждого приложения в отдельности устанавливать запрет на использование фоновых данных, и тем самым устанавливать запрет на получение уведомлений, если телефон находится вне сети Wi-Fi. Андроид позволяет это сделать сразу для всех приложений. То есть можно установить практически одним кликом запрет на получение всех уведомлений от всех приложений Андроида для такой ситуации, когда смартфон находится вне зоны действия Wi-Fi.

Для отключения всех уведомлений:

  • заходим в Приложения (рис. 2) и
  • Настройки (рис. 3).
  • И затем снова тапаем по «Использование данных» (рис. 9) и
  • открываем вкладку настроек при работе с СИМ-картой – на рис. 14 это симка с именем НАДЕЖДА.

ограничение фоновых данных для всех приложений Андроида

Рис. 14. Подготовка к ограничению фоновых данных сразу для всех приложений Андроида

На этой вкладке кликаем (тапаем) по символу многоточия в правом верхнем углу (цифра 1 на рис. 14). Появится выпадающее меню, в котором выбираем опцию «Ограничить фоновые данные» (1 на рис. 15).

Включено ограничение фоновых данных для всех приложений Андроида

Рис. 15. Включение ограничения фоновых данных сразу для всех приложений Андроида

После этого будет предложено подтвердить наше намерение отключить фоновые данные для всех приложений. Отвечаем «ОК» в ответ на уточняющий запрос (рис. 16).

Подтверждение ограничения фоновых данных для всех приложений Андроида

Рис. 16. Подтверждение включения ограничения фоновых данных сразу для всех приложений Андроида

На короткое время на экране появится надпись «Загрузка» (рис. 17).

Рис. 17. Окно «Загрузка», возникающее на короткое время при включении или отключении ограничения фоновых данных на Андроиде

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

С этого момента уведомления для всех приложений смартфона будут приходить только тогда, когда телефон подключен к сети Wi-Fi. Если же вай-фая не будет, тогда телефон работает только от СИМ-карты. В этой ситуации не будут приходить уведомления на Андроид, даже если для приложений установлен режим, разрешающий прием уведомлений.

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

Как убрать препятствия для получения уведомлений

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

  • заходим в «Приложения» (рис. 2),
  • «Настройки» (рис. 3),
  • «Использование данных» (рис. 9),
  • заходим на вкладку настроек работы от СИМ-карты (рис. 14) и
  • тапаем по многоточию в правом верхнем углу окна.

В открывшемся меню теперь выбираем опцию «Использовать фоновые данные» (рис. 18).

Отключение ограничения фоновых данных для всех приложений Андроида

Рис. 18. Отключение ограничения фоновых данных сразу для всех приложений Андроида

На короткое время на экране появится надпись «Загрузка» (рис. 17), после чего для всех приложений Андроида будет отключено ограничение фоновых данных. Теперь все приложения Андроида, для которых настроено разрешение приема уведомлений, будут получать уведомления, даже если телефон не будет подключен к сети передачи данных по Wi-Fi.

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

Полезная ссылка

Google является разработчиком Андроида, поэтому справка с его официального сайта – самая точная и актуальная.

Справка Гугла «Как настроить уведомления на устройстве Android»:

https://support.google.com/android/answer/9079661?hl=ru

Загрузка ... Загрузка …

Дополнительные материалы:

1. 9 советов по энергосбережению Андроид

2. Куда «уплывает» трафик интернета в Android и как его экономить

3. Раздача Интернета через Wi-Fi с телефона Андроид

4. Откуда берется Wi-Fi и почему смартфоны и ноутбуки любят вай-фай

Получайте новые статьи по компьютерной грамотности на ваш почтовый ящик:

Необходимо подтвердить подписку в своей почте. Спасибо!

(Эта статья первоначально производится в 2006.03.14, первая редакция составляет 2006.06.06, а после коррекции применяется к ESFRAMEWORK V0.3 +)

ПервоначальноTcp/udpКомпоненты являются единственным импортным и экспортом системы и внешних обменных сообщений, а такжеTcpКомпонент илиUdpУникальное соединение между компонентом проходит через сообщений дистрибьютор IMESSAGEDISPATHER, который эквивалентенESFrameworkДиспетчер сообщений является импорт и экспорт наших приложений и внешних сообщений обмена. IMESSAGEDISPATCHER не связан с соглашением, независимым компонентом компонента, то есть его можно использовать в протоколе UDP в протоколе TCP, и если общение с использованием удаления также может использовать IMESSAGEDISPatcher для назначения сообщений; его можно использовать в Сервер его можно использовать для клиента, такая высокая повторное использование делает верхнее приложение, построенное на основе разных базовых слоев (таких как TCP / UDP, Server / Client), что делает всю архитектуру Esframework Creler, сглаживание кривой.

IMESSAGEDISPATCER гарантирует, что каждое получено каждое сообщение, и каждое отправлено каждое сообщение, может быть все

HookсSpyМгновенныйПерехватить. Кроме того, диспетчер сообщений может потребоваться проверить, что полученный формат сообщения является правильным, является ли сообщение законно, соответствует ли сообщение конкретной спецификации. Ниже приведена композиция компонента распределителя сообщений:
Диспетчер сообщенияIMessageDispatcherОпределяется следующим образом:

publicinterfaceIMessageDispatcher
{
IEsbLoggerEsbLogger{
set;}
INetMessageHookNetMessageHook{
set;}//Может быть esbnetmessageHook.
IGatewayMessageSpyGatewayMessageSpy{set;}
IInnerMessageSpyInnerMessageSpy{
set;}

IContractHelperContractHelper{

set;}//Должен установить
INakeDispatcherNakeDispatcher{set;}//Должен установить

NetMessageDispatchMessage(NetMessagereqMsg);
///<summary>
///Если все Singlemessage необходимо передать цепочку крючков IMessagedispatcher, прежде чем отправить его, шпион
///</summary>
NetMessageBeforeSendMessage(NetMessagemsg);eventCbNetMessageMessageReceived;
}

ИзКомпоненты Imessediscatcher иОпределение интерфейса можно увидеть, чтоIMESSAGEDISPATCER гарантирует, что полученное сообщение подвергается каждому шпиону, крючкому, процессору сообщений и других компонентов в указанном порядке. Нет новостей не является исключением. Даже сообщения, созданные в системе (например, уведомление, отправленные клиенту), также должны пройтиПрежде чем IMESSAGEDISPatcher’s BeforesendMessage может быть благополучно отправлен.
Реализация IMESSAGEDISPATCER заключается в следующем:

publicclassMessageDispatcher:IMessageDispatcher
{
#regionproperty
#regionLogger
privateIEsbLoggeresbLogger=newEmptyEsbLogger();
publicIEsbLoggerEsbLogger
{
set
{
if(value!=null)
{
this.esbLogger=value;
}
}
}
#endregion#regionNakeDispatcher
privateINakeDispatchernakeDispatcher;
publicINakeDispatcherNakeDispatcher
{
set
{
this.nakeDispatcher=value;
}
}
#endregion#regionNetMessageHook
privateINetMessageHooknetMessageHook=newEmptyNetMessageHook();
publicINetMessageHookNetMessageHook
{
set
{
this.netMessageHook=value;
}
}
#endregion#regionInnerMessageSpy
privateIInnerMessageSpyinnerMessageSpy=newEmptyInnerMessageSpy();
publicIInnerMessageSpyInnerMessageSpy
{
set
{
if(value!=null)
{
this.innerMessageSpy=value;
}

}
}

#endregion#regionGatewayMessageSpy
privateIGatewayMessageSpygatewayMessageSpy=newEmptyGatewayNetMessageSpy();
publicIGatewayMessageSpyGatewayMessageSpy
{
set
{
if(value!=null)
{
this.gatewayMessageSpy=value;
}
}
}
#endregion#regionContractHelper
privateIContractHelpercontractHelper=null;
publicIContractHelperContractHelper
{
set
{
this.contractHelper=value;
}
}
#endregionpubliceventCbNetMessageMessageReceived;
#endregion#regionУчастник ImessagedispatcherpublicNetMessageDispatchMessage(NetMessagereqMsg)
{
try
{
if(this.MessageReceived!=null)
{
this.MessageReceived(reqMsg);
}
this.gatewayMessageSpy.SpyReceivedMsg(reqMsg);

NetMessagemsgHooked

=this.netMessageHook.CaptureReceivedMsg(reqMsg);this.innerMessageSpy.SpyReceivedMsg(msgHooked);
NetMessageresMsg
=this.nakeDispatcher.DispatchMessage(msgHooked);
if(reqMsg==null)
{
returnnull;
}
returnthis.BeforeSendMessage(resMsg);
}
catch(Exceptionee)
{
this.esbLogger.Log(ee.GetType().ToString(),ee.Message,ESFramework.Network.MessageDispatcher.DispatchMessage,ErrorLevel.High);
returnthis.contractHelper.GetResponseByServiceResultType(reqMsg,ServiceResultType.HandleFailure);
}
}
publicNetMessageBeforeSendMessage(NetMessagemsg)
{
this.innerMessageSpy.SpyToBeSendedMsg(msg);
NetMessagemsgHooked
=this.netMessageHook.CaptureBeforeSendMsg(msg);
this.gatewayMessageSpy.SpyToBeSendedMsg(msgHooked);returnmsgHooked;
}
#endregion
}

Мы видели,IMESSAGEDISPATCHER использует компоненты INAKACEDISPATHER, обязанности INAKEDISPATHER просты, и для соответствующего процессора позвонит IDatArecaactory для сообщения, который необходимо отправлять, а затем оплатить сообщение для обработки процессора, вернуть результат. Интерфейс определяется следующим образом:

publicinterfaceINakeDispatcher
{
NetMessageDispatchMessage(NetMessagemsg);
}

Реализация индиудаспатчика также очень проста:

publicclassNakeDispatcher:INakeDispatcher
{
#regionDataDealerFactory
privateIDataDealerFactorydataDealerFactory=null;
publicIDataDealerFactoryDataDealerFactory
{
set
{
this.dataDealerFactory=value;
}
}
#endregion#regionContractHelper
privateIContractHelpercontractHelper=null;
publicIContractHelperContractHelper
{
set
{
this.contractHelper=value;
}
}
#endregion#regionУчастник интуикливаштераpublicNetMessageDispatchMessage(NetMessagemsg)
{
IDataDealerdealer
=this.dataDealerFactory.CreateDealer(msg.Header.ServiceKey,msg.Header.TypeKey);
if(dealer==null)
{
returnthis.contractHelper.GetResponseByServiceResultType(msg,ServiceResultType.ServiceIsNotExist);
}
returndealer.DealRequestMessage(msg);
}
#endregion
}

Как правило, когда клиент использует компоненты ImessedIscatcher, нам не нужно использовать ворота-ворота, если это так, то мы не будем Messagedispatcher.Свойство GatewayMessage можно вводить в объект.

Предыдущий:ESFRAMEWORK Введение (4) – Интернет-передача сообщений inetmessageHook

Перейти к:Esframework может быть мультиплексированной связи связи (порядок)

Время на прочтение
6 мин

Количество просмотров 19K

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

Краткое описание библиотеки protobuf

Итак, сначала вкратце рассмотрим библиотеку google::protobuf, она поставляется в виде двух компонент:
собственно, сама библиотека + заголовочные файлы
компилятор файлов *.proto — генерирует из описания сообщения C++ класс (также есть возможность генерации для других языков программирования: Java, Python и т.д.)
В отдельном файле создается описание сообщения, из которого будет сгенерирован класс, синтаксис очень простой:

package sample.proto;

message ServerStatusAnswer {
    optional int32 threadCount = 1;
    repeated string listeners = 2;
}

Здесь мы описываем сообщение ServerStatusAnswer, которое имеет два необязательных поля:

  • threadCount — необязательный целочисленный параметр
  • listeners — необязательная строка, которая может несколько раз повторяться

Данному описанию удовлетворяет, например, следующее сообщение:

ServerStatusAnswer {
    threadCount = 3
    listeners = {
        "one",
        "two"
    }
}

На самом деле формат protobuf — бинарный, здесь я привел сообщение в читаемом формате только для удобства восприятия

Компилятор автоматически генерирует C++ код для сериализации и десериализации подобных сообщений. Библиотека protobuf также предоставляет дополнительные возможности: сериализация в файл, в поток, в буфер.

Я использую CMake в качестве системы сборки, и в нем уже есть поддержка protobuf:

cmake_minimum_required(VERSION 2.8)

project(ProtobufTests)

find_package(Protobuf REQUIRED)
include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
#...
set (ProtobufTestsProtoSources
    Message.proto
    ServerStatus.proto
    Echo.proto
)
#...
PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${ProtobufTestsProtoSources})
add_executable(ProtobufTests ${ProtobufTestsSources} ${PROTO_SRCS} ${PROTO_HDRS})

target_link_libraries(ProtobufTests
    #...
    ${PROTOBUF_LIBRARY}
)

PROTOBUF_GENERATE_CPP — данный макрос вызывает компилятор protoc для каждого *.proto файла, и генерирует соответствующие cpp и h файлы, которые добавляются к сборке.
Все делается автоматически, и никаких дополнительных приседаний делать не надо (Под *nix может понадобиться дополнительный пакет Threads и соответствующий флаг линковщику).

Описание диспетчера

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

Для того чтобы обрабатывать произвольные сообщения, у нас должен быть класс, который обрабатывает абстрактное сообщение. Очевидно, если у нас будут описания сообщений в *.proto файле, то компилятор нам сгенерирует соответствующие классы, но к сожалению все они будут наследованы от google::protobuf::Message. У данного класса проблематично вытащить все данные из сообщения (сделать это в принципе можно, но тогда мы будем делать кучу лишней работы), к тому же мы не будем знать, как нам сформировать ответ.
На помощь приходит высказывание: «Любую проблему можно решить путём введения дополнительного уровня абстракции, кроме проблемы слишком большого количества уровней абстракции».
Нам надо отделить определение типа сообщения от самого сообщения, мы это можем сделать следующим способом:

package sample.proto;

message Message {
    required string id = 1;
    optional bytes data = 2;
}

Мы запакуем наше сообщение внутрь еще одного сообщения:

  • обязательное поле id содержит уникальный идентификатор сообщения
  • необязательное поле data содержит наше сообщение

Таким образом, наш диспетчер будет по полю id искать соответствующий обработчик сообщения:

#ifndef MESSAGEDISPATCHER_H
#define MESSAGEDISPATCHER_H

#include <map>
#include <stdexcept>

#include <boost/noncopyable.hpp>
#include <boost/smart_ptr/shared_ptr.hpp>

#include "message.pb.h"

class MessageProcessingError: public std::runtime_error
{
public:
    MessageProcessingError(const std::string & e): std::runtime_error(e)
    {
    }
};

class MessageProcessorBase: private boost::noncopyable
{
public:

    virtual ~MessageProcessorBase()
    {
    }

    virtual std::string id() const = 0;

    virtual sample::proto::Message process(const sample::proto::Message & query) = 0;
};

typedef boost::shared_ptr<MessageProcessorBase> MessageProcessorBasePtr;

class MessageDispatcher
{
public:
    MessageDispatcher();

    void addProcessor(MessageProcessorBasePtr processor);

    sample::proto::Message dispatch(const sample::proto::Message & query);

    typedef std::map<std::string, MessageProcessorBasePtr> DispatcherImplType;

    const DispatcherImplType & impl() const;

private:
    DispatcherImplType mImpl;
};

#endif // MESSAGEDISPATCHER_H

Но теперь мы получаем, что каждый обработчик должен проводить распаковку сообщения sample::proto::Message в свое собственное сообщение. А этот процесс будет дублироваться для каждого такого обработчика. Мы хотим избежать дублирования кода, поэтому возьмем паттерн Type Erasure. Данный паттерн позволяет скрыть тип обрабатываемой сущности за общим интерфейсом, однако каждый обработчик будет работать с конкретным типом, известным только ему.

Итак, реализация очень проста:

template <typename ProtoQueryT, typename ProtoAnswerT>
class ProtoMessageProcessor: public MessageProcessorBase
{
public:
    virtual sample::proto::Message process(const sample::proto::Message & query)
    {
        ProtoQueryT underlyingQuery;
        if (!underlyingQuery.ParseFromString(query.data()))
        {
            throw MessageProcessingError("Failed to parse query: " +
                query.ShortDebugString());
        }

        ProtoAnswerT underlyingAnswer = doProcessing(underlyingQuery);

        sample::proto::Message a;
        a.set_id(query.id());

        if (!underlyingAnswer.SerializeToString(a.mutable_data()))
        {
            throw MessageProcessingError("Failed to prepare answer: " +
                underlyingAnswer.ShortDebugString());
        }
        return a;
    }

private:
    virtual ProtoAnswerT doProcessing(const ProtoQueryT & query) = 0;
};

Мы определяем виртуальную функцию process, но также добавляем виртуальную функцию doProcess, которая уже работает с нашими конкретными сообщениями! Данный прием основан на механизме инстанцирования шаблонов: типы подставляются в момент реального использования шаблона, а не в момент декларации. А так как данный класс наследуется от MessageProcessorBase, то мы смело можем передавать наследников данного класса в наш диспетчер. Также необходимо заметить, что данный класс осуществляет сериализацию и десериализацию наших конкретных сообщений и кидает исключения в случае возникновения ошибок.

Ну и напоследок приведу пример использования данного диспетчера, допустим у нас есть два вида сообщений:

package sample.proto;

message ServerStatusQuery {
}

message ServerStatusAnswer {
    optional int32 threadCount = 1;
    repeated string listeners = 2;
}

package sample.proto;

message EchoQuery {
    required string msg = 1;
}

message EchoAnswer {
    required string echo = 1;
}

Как видно из описания — данные сообщения запрашивают у сервера его внутреннее состояние (ServerStatus), и просто возвращает полученный запрос (Echo). Реализация самих обработчиков тривиальна, я приведу реализацию только ServerStatus:

#ifndef SERVERSTATUSMESSAGEPROCESSOR_H
#define SERVERSTATUSMESSAGEPROCESSOR_H

#include "MessageDispatcher.h"

#include "ServerStatus.pb.h"

class ServerStatusMessageProcessor:
        public ProtoMessageProcessor<sample::proto::ServerStatusQuery, sample::proto::ServerStatusAnswer>
{
public:

    typedef sample::proto::ServerStatusQuery query_type;
    typedef sample::proto::ServerStatusAnswer answer_type;

    ServerStatusMessageProcessor(MessageDispatcher * dispatcher);

    virtual std::string id() const;

private:
    MessageDispatcher * mDispatcher;

    virtual answer_type doProcessing(const query_type & query);
};

#endif // SERVERSTATUSMESSAGEPROCESSOR_H

Сама реализация:

#include "ServerStatusMessageProcessor.h"

using namespace sample::proto;

ServerStatusMessageProcessor::ServerStatusMessageProcessor(MessageDispatcher * dispatcher)
    : mDispatcher(dispatcher)
{
}

std::string ServerStatusMessageProcessor::id() const
{
    return "ServerStatus";
}

ServerStatusAnswer ServerStatusMessageProcessor::doProcessing(const ServerStatusQuery & query)
{
    ServerStatusAnswer s;

    s.set_threadcount(10);

    typedef MessageDispatcher::DispatcherImplType::const_iterator md_iterator;

    const MessageDispatcher::DispatcherImplType & mdImpl = mDispatcher->impl();

    for (md_iterator it = mdImpl.begin(); it != mdImpl.end(); ++it)
    {
        s.add_listeners(it->first);
    }

    return s;
}

Вот как это работает:

#include "MessageDispatcher.h"

#include "ServerStatusMessageProcessor.h"
#include "EchoMessageProcessor.h"

#include <iostream>
#include <boost/smart_ptr/make_shared.hpp>

using namespace sample::proto;

int main()
{
    try
    {
        MessageDispatcher md;

        md.addProcessor(boost::make_shared<ServerStatusMessageProcessor>(&md));
        md.addProcessor(boost::make_shared<EchoMessageProcessor>());

        Message q;
        q.set_id("ServerStatus");
        Message ans = md.dispatch(q);

        std::cout << "query:  " << q.DebugString() << std::endl;
        std::cout << "answer: " << ans.DebugString() << std::endl;
    }
    catch (const std::exception & e)
    {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

P.S. Для написания данной статьи использовались:

  • gcc-4.4.5-linux
  • cmake-2.8.2
  • boost-1.42
  • protobuf-2.3.0

Пример выложен на github

  • Download source – 57.11 KB
  • Download Windows Service Installer – 386.91 KB

Message Dispatcher

Introduction

While programming various WEB applications, I have many times come across the need to send a message to interested users. For example, when a customer purchases a good from my e-shop, I want to send him an e-mail with the order details.

The piece of code that I am publishing here helps me out with this task as follows:

  • It is a DLL that offers me an API to send an e-mail.

  • Delivery is asynchronous. Hence, the application returns immediately and the actual delivery of the e-mail takes place later on. This has serious advantages over a synchronous delivery. Such as:

    • E-mail delivery may take some time, since it requires connection to SMTP server. With asynchronous delivery, the user does not perceive this delay.

    • SMTP server might be down and not responding to e-mail delivery. With asynchronous communication, I can build a nice retry mechanism.

Using the Code

In order to use it in your programs, you need to take care of the following:

  • Prepare your database. You need a Microsoft SQL Database. This is used to hold the messages that are queued for delivery. Note that in the folder database of MessageDispatcherDAL project, you will find the script named create_and_initialize_tables.sql that you can use to create and initialize the tables. IMPORTANT: The script DOES NOT create the database neither the login to access it. You have to do that. This is done, because it assumes that the whole set of the necessary tables would be most probably live inside a bigger database, designed to serve the needs of the application that would host the Message Dispatcher. What does the script do?

    • Creates the table Messages. It holds the messages that you want to be delivered.

    • Creates the table MessageTypes. Currently only email is really supported. But in the future, I may introduce the features to support sms too. You may find the value sms in the table, but this is not supported yet.

    • Creates the table MessageStatuses. It contains the values of the statuses of the messages. The supported statuses are:

      • NEW: Non-final Status. This is the status of a message that has just been put in the queue.

      • SENT: Final Status. This is the status of a message that has been successfully sent out.

      • FAILED: Non-Final Status. This is the status of a message that has not been sent out, due to some error. However, this is not a final status. MessageDispatcher will retry the delivery.

      • ERROR: Final Status. This is a final status that indicates that the message has failed to be delivered, even if MessageDispatcher has tried more than once.

    • Creates the table MessageBodyTypes. This is a lookup table that contains two values:

      • plain

      • html

      If you are delivering an e-mail that contains HTML content, then you need to use html. If not, but just plain text, you need to use plain. Note that if you choose html then both plain text and HTML versions are combined in the same message.

    • Schema: The schema in which all objects are created is dbo. If you want to change the default schema name, you need to:

      • Edit MessageDispatcherDAL.edmx file in project MessageDispatcherDAL and change the Schema entries to have the value you want, when now they have the value dbo.

      • Also, in the same file, change the value of DefaultDatabaseSchema from dbo to whatever you want.

      • Save and rebuild project MessageDispatcherDAL.

  • Install the Message Dispatcher Windows Service. Messages are being processed asynchronously with the help of a Windows Service. So, you need to install it. These are the instructions:

    • Project MessageDispatcherWindowsServiceSetup creates the setup.exe that you can use to install the service.

      OR

    • You can run the setup.exe that exists inside the zip MessageDispatcherWindowsServiceInstaller.zip that you can download from the top of the article.

    Note that the installer installs the windows service and sets its Startup Type to be Manual. After the installation on your production server, change this to Automatic, so that whenever your server starts up, this service is started up automatically too.

  • Configure Message Dispatcher Windows Service. Message Dispatcher windows service needs to know:

    • How to connect to the database to find out the messages that need to be processed.

    • How to connect to the SMTP Server in order to send the e-mails.

    Configuration of the Message Dispatcher Windows Service is done by setting appropriately the values in the configuration file with name MessageDispatcherWindowsService.exe.config that resides in the folder where the service has been installed.

    • Configure database connection: Set the appropriate connection string with name MessageDispatcherDALContainer. An example is given below:

      <connectionStrings>
          <add name="MessageDispatcherDALContainer" 
      	connectionString="metadata=res://*/MessageDispatcherDAL.csdl|
      	res://*/MessageDispatcherDAL.ssdl|res://*/MessageDispatcherDAL.msl;
      	provider=System.Data.SqlClient;
      	provider connection string="Data Source=MYSQLSERVER,50708SQLEXPRESS;
      	Initial Catalog=my_db;Persist Security Info=True;User ID=my_db;
      	Password=my_db;MultipleActiveResultSets=True"" 
      	providerName="System.Data.EntityClient"/>
      </connectionStrings>
    • SMTP Connection settings: In the same file, MessageDispatcherWindowsService.exe.config sets the following values appropriately, as in the example:

      <appSettings>
          <add key="MessageDispatcherWindowsService.Smtp.Server" 
      	value="mail.foo.com"/>
          <add key="MessageDispatcherWindowsService.Smtp.Username" 
      	value="user@foo.com"/>
          <add key="MessageDispatcherWindowsService.Smtp.Password" value="password"/>
      </appSettings>

      If your SMTP server does not require authentication, then set an empty string as value for both MessageDispatcherWindowsService.Smtp.Username and MessageDispatcherWindowsService.Smtp.Password.

    • Other minor service configuration settings:

      • Sleep Between Processing: The seconds between processing messages. Windows service sleeps this number of seconds before checking again for new messages.
        <appSettings>
            <add key="MessageDispatcherWindowsService.MainThreadSleepSeconds" 
        	value="3"/>
        </appSettings>  
      • Maximum number of failures before error: For each message that fails to be delivered, the service will retry that maximum number of times. If it fails all the times, the status of the message becomes ERROR.
        <appSettings>
            <add key="MessageDispatcherWindowsService.
        	MaximumNumberOfFailuresBeforeError" value="3"/>
        </appSettings>
      • Timeout Between Retries In Minutes: For each message that fails delivery, the next retry will be later than this amount of minutes.
        <appSettings>
            <add key="MessageDispatcherWindowsService.
        	TimeoutBetweenRetriesInMinutes" value="3"/>
        </appSettings>
  • Integrate in your Code. You need to use the MessageDispatcher API in your project in order to be able to send messages from your project. Follow the next instructions alongside the MessageDispatcherWindowsConsoleDemo project:

    • Reference MessageDispatcherDAL.dll in your project.

    • Create a database connection configuration string. This is necessary so that MessageDispatcherDAL knows where is the persistence storage of the message queues.

      For example, you can configure that in your app.config file (<configuration> section), if you have a Windows Console Application, as follows:

      <connectionStrings>
         <add name="MessageDispatcherDALContainer" 
      	connectionString="metadata=res://*/MessageDispatcherDAL.csdl|
      	res://*/MessageDispatcherDAL.ssdl|res://*/MessageDispatcherDAL.msl;
      	provider=System.Data.SqlClient;
      	provider connection string="Data Source=MYSQLSERVER,50708SQLEXPRESS;
      	Initial Catalog=my_db;Persist Security Info=True;User ID=my_db;
      	Password=my_db;MultipleActiveResultSets=True"" 
      	providerName="System.Data.EntityClient"/>
      </connectionStrings>         

      Make sure you set correctly the server host name, the server port, the initial catalog, the user id and the password.

    • Create a message using the Message.CreateEmailMessage(...) method, as in the following example:

      
      
      
      
      Message.CreateEmailMessage(no_reply@foo.com, 
      	"customer1@gmail.com;customer2@yahoo.gr", null, null,
             	"Your Order Details", "Order ID: 5, 
      	Date of Purchase: 25-Nov-2011, Amount: 29.00 Euro", false);

      This will create a new entry in the table Messages and on status NEW. Message Dispatcher Windows Service will take care from there.

    • Catch exception. Don’t forget to wrap Message.CreateEmailMessage(....) in a try { ... } catch (...) {...} block. Otherwise, make sure you catch any exception that this method might throw. You do not want your application to crash just because a message cannot be saved. Here is another example of using this method to send HTML message, wrapped to catch exceptions:

      try
      {
          Message.CreateEmailMessage(no_reply@foo.com, 
      	"customer1@gmail.com;customer2@yahoo.gr", null, null,
             	"Your Order Details", 
      	"<html><head></head><body><b>Order ID:</b> 5<br />
      	<b>Date of Purchase:</b> 25-Nov-2011<br /><b>Amount:</b> 
      	29.00 Euro<body></body></html>", true);
      }
      catch (EntityException ex)
      {
          System.Console.WriteLine("Cannot create message: " + ex.Message);
      }  

Summary

I believe it is quite easy for you to send your e-mails asynchronously, using this DLL and Windows Service.

  • Install the Windows Service
  • Configure Windows Service
  • Integrate in your code

Your comments are welcome and thanks for reading this far.

History

  • 27th November, 2011: Initial post

This member has not yet provided a Biography. Assume it’s interesting and varied, and probably something to do with programming.

Добавить комментарий