Коды ошибок doms

Как сбросить настройки декодера эфирного домашнего телевидения? Это делается через меню, путем включения и выключения или полного сброса. В последнем

Перезапуск ТВ-приставки

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

Содержание

  1. Как перезагрузить приставку Дом ру
  2. Через меню
  3. С помощью отключения / включения
  4. Как сбросить настройки до заводских
  5. Humax 7000i
  6. Humax 9000i
  7. KAON KA

Как перезагрузить приставку Дом ру

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

  • Замерзание или медленная работа;
  • Проблемы с переключением телеканалов или некоторые телеканалы не работают должным образом;
  • Отказ кнопок, пульт дистанционного управления не работает;
  • Ненормальное поведение приемника, сбои в работе или аварии;
  • Ошибки и т.д.

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

Перезапустите STB Dom ru TV и устраните неисправность.

Через меню

Самый простой способ — перезагрузить маршрутизатор Dom через меню. Названия разделов / пунктов меню могут отличаться в зависимости от модели, но общий подход одинаков. Алгоритм следующий:

  1. Войдите в меню.
  2. Найдите раздел «Перезагрузка».
  3. Подтвердите действие и дождитесь перезагрузки.

Перезагрузите STB Dom ru TV и устраните неисправность.

С помощью отключения / включения

Другой способ перезапустить декодер Dom ru TV — это сделать это путем включения и выключения оборудования. Для этого можно использовать следующие параметры:

  • вытащить вилку из розетки на 15-20 секунд;
  • Нажатие кнопки включения/выключения с короткой паузой.

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

Перезагрузите приставку Дом Ру ТВ и устраните неисправность

Как сбросить настройки до заводских

В сложных случаях можно перезагрузить декодер «Дом Ру», но это не всегда срабатывает. Более радикальным способом является восстановление заводских настроек. Здесь процедура зависит от используемого тюнера.

Сброс может быть полезен в следующих случаях:

  • Невозможность восстановления работоспособности устройства путем обычного перезапуска;
  • Проблемы с обновлением, включением/выключением;
  • Серьезные ошибки, при которых простого сброса декодера «Дом Ру» недостаточно.

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

Перезагрузите приставку Дом Ру ТВ и устраните неисправность

Humax 7000i

Выполните следующие действия, чтобы сбросить настройки:

  1. Нажмите кнопку Меню и перейдите к разделу Настройки.
  2. Перейдите к заводским настройкам.
  3. В появившемся меню нажмите Да.
  4. При появлении запроса введите PIN-код.  По умолчанию установлено значение 0000. Если вы его изменили, обратитесь в службу поддержки.

Humax 9000i

Данная модель может быть сброшена следующим образом:

  1. Нажмите кнопки включения/выключения и регулировки громкости.
  2. Подождите, пока индикатор не мигнет дважды.
  3. Наберите 980.

Перегрузка приставки Дом Ру ТВ и отладка неисправности

KAON KA

Для этого тюнера процесс восстановления заводских настроек выглядит следующим образом:

  • Нажмите кнопку Меню.
  • Перейдите в раздел Настройки, затем в раздел Настройка.

Приставка Дом Ру ТВ перегружена и неисправность устранена

  • Нажмите кнопку OK.
  • Введите 0000 в поле PIN-код.
  • Выберите строку Заводские настройки и нажмите кнопку OK.
  • Дождитесь перезапуска устройства и отображения информации о часовом поясе.
  • С помощью кнопок Влево и Вправо выберите часовой пояс и нажмите OK.

Перегрузка приставки Дом Ру ТВ и устранение неполадок

Как видите, сбросить настройки домашнего маршрутизатора и вернуть его к заводским настройкам очень просто. Старайтесь всегда начинать с первого шага, и только в случае неудачи делайте полный сброс.

  1. Простейший DOM
  2. Пример посложнее
  3. Пример с атрибутами и DOCTYPE
  4. Нормализация в различных браузерах
  5. Возможности, которые дает DOM
  6. Доступ к элементам

    1. document.documentElement
    2. document.body
    3. Типы DOM-элементов

      1. Пример
    4. Дочерние элементы
  7. Свойства элементов

    1. tagName
    2. style
    3. innerHTML
    4. className
    5. onclick, onkeypress, onfocus

Основным инструментом работы и динамических изменений на странице является DOM (Document Object Model) — объектная модель, используемая для XML/HTML-документов.

Согласно DOM-модели, документ является иерархией.
Каждый HTML-тег образует отдельный элемент-узел, каждый фрагмент текста — текстовый элемент, и т.п.

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

Простейший DOM

Построим, для начала, дерево DOM для следующего документа.

<html>
  <head>
    <title>Заголовок</title>
  </head>
  <body>
     Прекрасный документ
   </body>
</html>

Самый внешний тег — <html>, поэтому дерево начинает расти от него.

Внутри <html> находятся два узла: <head> и <body> — они становятся дочерними узлами для <html>.

простой DOM

Теги образуют узлы-элементы (element node). Текст представлен текстовыми узлами (text node). И то и другое — равноправные узлы дерева DOM.

Пример посложнее

Рассмотрим теперь более жизненную страничку:

<html>
    <head>
        <title>
            О лосях
        </title>
    </head>
    <body>
        Правда о лосях.
        <ol>
            <li>
                Лось - животное хитрое
            </li>
            <li>
                .. И коварное
            </li>
        </ol>
    </body>
</html>

Корневым элементом иерархии является html. У него есть два потомка. Первый — head, второй — body. И так далее, каждый вложенный тег является потомком тега выше:

На этом рисунке синим цветом обозначены элементы-узлы, черным — текстовые элементы.

Дерево образовано за счет синих элементов-узлов — тегов HTML.

А вот так выглядит дерево, если изобразить его прямо на HTML-страничке:

Кстати, дерево на этом рисунке не учитывает текст, состоящий из одних пробельных символов. Например, такой текстовый узел должен идти сразу после <ol>. DOM, не содержащий таких «пустых» узлов, называют «нормализованным».

Пример с атрибутами и DOCTYPE

Рассмотрим чуть более сложный документ.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>Документ</title>
    </head>
    <body>
        <div id="dataKeeper">Data</div>
        <ul>
            <li style="background-color:red">Осторожно</li>
            <li class="info">Информация</li>
        </ul>
        <div id="footer">Made in Russia &copy;</div>
    </body>
</html>

Верхний тег — html, у него дети head и body, и так далее. Получается дерево тегов:

Атрибуты

В этом примере у узлов есть атрибуты: style, class, id. Вообще говоря, атрибуты тоже считаются узлами в DOM-модели, родителем которых является элемент DOM, у которого они указаны.

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

DOCTYPE

Вообще-то это секрет, но DOCTYPE тоже является DOM-узлом, и находится в дереве DOM слева от HTML (на рисунке этот факт скрыт).

P.S. Насчет секрета — конечно, шутка, но об этом и правда далеко не все знают. Сложно придумать, где такое знание может пригодиться…

Нормализация в различных браузерах

При разборе HTML Internet Explorer сразу создает нормализованный DOM, в котором не создаются узлы из пустого текста.

Firefox — другого мнения, он создает DOM-элемент из каждого текстового фрагмента.
Поэтому в Firefox дерево этого документа выглядит так:

DOM дерево

На рисунке для краткости текстовые узлы обозначены просто решеткой. У body вместо 3 появилось 7 детей.

Opera тоже имеет чем похвастаться. Она может добавить лишний пустой элемент «просто от себя».

Чтобы это увидеть — откройте документ по этой ссылке. Он выдает число дочерних узлов document.body, включая текстовые узлы.

У меня получается 3 для IE, 7 для Firefox и 8 (!?) для Opera.

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

Возможности, которые дает DOM

Зачем, кроме красивых рисунков, нужна иерархическая модель DOM?

Очень просто:

Каждый DOM-элемент является объектом и предоставляет свойства для манипуляции своим содержимым, для доступа к родителям и потомкам.

Для манипуляций с DOM используется объект document.
Используя document, можно получать нужный элемент дерева и менять его содержание.

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

var ol = document.getElementsByTagName('ol')[0]
var hiter = ol.removeChild(ol.firstChild)
var kovaren = ol.removeChild(ol.firstChild)
ol.appendChild(kovaren)
ol.appendChild(hiter)

Для примера работы такого скрипта — кликните на тексте на лосиной cтраничке

document.write

В старых руководствах и скриптах можно встретить модификацию HTML-кода страницы напрямую вызовом document.write.

В современных скриптах этот метод почти не используется, случаи его правильного применения можно пересчитать по пальцам.

Избегайте document.write.. Кроме случаев, когда вы действительно знаете, что делаете (а зачем тогда читаете самоучитель — вы и так гуру)

Разберем подробнее способы доступа и свойства элементов DOM.

Доступ к элементам

Любой доступ и изменения DOM берут свое начало от объекта document.

Начнем с вершины дерева.

document.documentElement

Самый верхний тег. В случае корректной HTML-страницы, это будет <html>.

document.body

Тег <body>, если есть в документе (обязан быть).

Это свойство работает немного по-другому, если установлен DOCTYPE Strict. Обычно проще поставить loose DOCTYPE.

Следующий пример при нажатии на кнопку выдаст текстовое представление объектов document.documentElement и document.body. Сама строка зависит от браузера, хотя объекты везде одни и те же.

<html>
  <body>
     <script>
       function go() {
         alert(document.documentElement)
         alert(document.body)
      }
     </script>
     <input type="button" onclick="go()" value="Go"/>
  </body>
</html>

Типы DOM-элементов

У каждого элемента в DOM-модели есть тип. Его номер хранится в атрибуте elem.nodeType

Всего в DOM различают 12 типов элементов.

Обычно используется только один: Node.ELEMENT_NODE, номер которого равен 1. Элементам этого типа соответствуют HTML-теги.

Иногда полезен еще тип Node.TEXT_NODE, который равен 3. Это текстовые элементы.

Остальные типы в javascript программировании не используются.

Следующий пример при нажатии на кнопку выведет типы document.documentElement, а затем тип последнего потомка узла document.body. Им является текстовый узел.

<html>
  <body>
     <script>
       function go() {
         alert(document.documentElement.nodeType)
         alert(document.body.lastChild.nodeType)         
      }
     </script>
     <input type="button" onclick="go()" value="Go"/>
     Текст
  </body>
</html>

Пример

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head><title>...</title></head>
    <body>
        <div id="dataKeeper">Data</div>
        <ul>
            <li style="background-color:red">Осторожно</li>
            <li class="info">Информация</li>
        </ul>
        <div id="footer">Made in Russia &copy;</div>
    </body>
</html>

DOM

Здесь показаны только элементы внутри body, т.к только они отображаются на странице. Для элементов типа 1 (теги) в скобочках указан соответствующий тег, для текстовых элементов (тип 3) — стоит просто цифра.

Дочерние элементы

С вершины дерева можно пойти дальше вниз. Для этого каждый DOM-узел содержит массив всех детей, отдельно — ссылки на первого и последнего ребенка и еще ряд полезных свойств.

  1. Все дочерние элементы, включая текстовые находятся в массиве childNodes.

    В следующем примере цикл перебирает всех детей document.body.

    for(var i=0; i<document.body.childNodes.length; i++) {
        var child = document.body.childNodes[i]
        alert(child.tagName) 
    }
    
  2. Свойства firstChild и lastChild показывают на первый и последний дочерние элементы и равны null, если детей нет.
  3. Свойство parentNode указывает на родителя. Например, для <body> таким элементом является <html>:

    alert(document.body.parentNode == document.documentElement) // true
    
  4. Свойства previousSibling и nextSibling указывают на левого и правого братьев узла.

В общем. если взять отдельно <body> с детьми из нормализованного DOM — такая картинка получается ОТ <body>:

И такая — для ссылок наверх и между узлами:

  • Синяя линия — массив childNodes
  • Зеленые линии — свойства firstChild, lastChild.
  • Красная линия — свойство parentNode
  • Бордовая и лавандовая линии внизу — previousSibling, nextSibling

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

Свойства элементов

У DOM-элементов есть масса свойств. Обычно используется максимум треть из них. Некоторые из них можно читать и устанавливать, другие — только читать.

Есть еще и третий вариант, встречающийся в IE — когда устанавливать свойство можно только во время создания элемента.

Рассмотрим здесь еще некоторые (не все) свойства элементов, полезные при работе с DOM.

tagName

Атрибут есть у элементов-тегов и содержит имя тега в верхнем регистре, только для чтения.

Например,

alert(document.body.tagName) // => BODY

style

Это свойство управляет стилем. Оно аналогично установке стиля в CSS.

Например, можно установить element.style.width:

Исходный код этой кнопки:

<input
  type="button" 
  style="width: 300px" 
  onclick="this.style.width = parseInt(this.style.width)-10+'px'" 
  value="Укоротить на 10px"
/>

Обработчик события onclick обращается в этом примере к свойству this.style.width, т.к значением this в обработчике события является текущий элемент (т.е сама кнопка). Подробнее об этом — во введении в события.

Есть общее правило замены — если CSS-атрибут имеет дефисы, то для установки style нужно заменить их на верхний регистр букв.

Например, для установки свойства z-index в 1000, нужно поставить:

element.style.zIndex = 1000

innerHTML

Когда-то это свойство поддерживалось только в IE. Теперь его поддерживают все современные браузеры.

Оно содержит весь HTML-код внутри узла, и его можно менять.

Свойство innerHTML применяется, в основном, для динамического изменения содержания страницы, например:

document.getElementById('footer').innerHTML = '<h1>Bye!</h1> <p>See ya</p>'

Пожалуй, innerHTML — одно из наиболее часто используемых свойств DOM-элемента.

className

Это свойство задает класс элемента. Оно полностью аналогично html-атрибуту «class».

elem.className = 'newclass'

onclick, onkeypress, onfocus

.. И другие свойства, начинающиеся на «on…», хранят функции-обработчики соответствующих событий. Например, можно присвоить обработчик события onclick.

Подробнее об этих свойствах и обработчиках событий — см. введение в события.

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

Рассмотрим распространенные коды проблем Дом ру, с которыми пользователь может справится самостоятельно:

Ошибка 201/301/348/349/401

  1. Проверьте, подключен ли кабель к ТВ-приставке. Переподключите его.
  2. Перезапустите приставку.
  3. Включите автоматический поиск каналов.

Ошибка 651/678/815

  1. Проверьте подключение по локальной сети.
  2. Если система выдает статус «Подключено», отключите и подключите сеть повторно с помощью правой кнопки мыши. После этого запустите высокоскоростное соединение.
  3. Если Вы обнаружили, что сеть отключена, проверьте целостность кабеля. В случае отсутствия видимых повреждений попробуйте выключить кабель из разъема на ПК и вставить обратно.

Ошибка 629/691

  1. Дом ру ошибка с одним из кодов, указанных выше, связана с несоответствием введенного логина или пароля установленному. Внимательно перепроверьте корректность ввода данных в окне подключения интернета. Повторите ввод.
  2. Если не обнаружено несоответствий, попробуйте создать высокоскоростное соединение еще раз.
  3. Если Вы меняли логин и пароль для подключения к сети через «Личный кабинет», новые данные также необходимо ввести в окне подключения на самом компьютере.

Ошибка 221/222/321/322/421/422

  1. В том случае, когда канал, который не работает, был подключен недавно – подождите 15 минут.
  2. Перезапустите приставку.

Ошибка 1/2/101

Указанные сбои могут быть вызваны как разными причинами, так и аналогичными. Рассмотрим несколько вариантов решения, доступных среднестатистическому пользователю ПК:

  1. Запустите антивирус.
  2. Очистите систему от временных папок и файлов с помощью очистки диска.
  3. Обновите драйвера.
  4. Проведите «Восстановление системы».
  5. Установите все доступные обновления операционной системы.
  6. Переустановите браузер.
  7. Запустите проверку системных файлов Windows.
  8. Переустановите Windows, предварительно создайте копии всех важных документов и загрузите на съемный носитель или в виртуальное облако.

Если описанные выше способы решения не помогли или Вы не нашли информацию об интересующей Вас ошибке, свяжитесь с техподдержкой компании:

  1. Позвоните по бесплатному номеру 8-800-333-7000.
  2. Свяжитесь со специалистом с помощью мессенджера на сайте Дом ру. Чтобы открыть программу, нажмите на зеленую кнопку со значком сообщения, расположенную в правом нижнем углу страницы.

Ошибки Дом ру: что делать?

3. Напишите в техподдержку через раздел «Помощь». Для этого найдите соответствующий пункт в меню, расположенном слева, и перейдите на страницу «Оставить обращение».

Не работает Дом ру: ошибка

Кстати, ознакомиться с информацией о распространенных ошибках, связанных с использованием услуг Дом ру, можно на сайте компании — на странице «Статьи и инструкции». Она также находится в разделе «Помощь».


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

Исполнимые файлы с расширением файла EXE, также известны в качестве формата Windows Executable File. Если вам нужно заменить файл doms.exe, вы можете найти версию %%os%% в нашей базе данных, перечисленной в таблице ниже. К сожалению, в настоящее время в нашей базе могут отсутствовать некоторые версии файлов doms.exe, но их можно запросить, нажав на кнопку Request (Запрос). Если вы не нашли необходимую вам версию файла в нашей базе, представленной ниже, мы рекомендуем обратиться непосредственно к Dark Bay Ltd..

Размещение вновь загруженного файла doms.exe в правильном каталоге (в месте расположения исходного файла), скорее всего, решит проблему, однако, чтобы однозначно в этом убедиться, следует выполнить проверку. Попробуйте повторно запустить Hacks AND Cracks, чтобы проверить, появляется ли сообщение об ошибке.

doms.exe Описание файла
Расширение файла: EXE
Функция: Hacker Tool
Application: Hacks AND Cracks
Версия программного обеспечения: 1.0.0.0
Компания: Dark Bay Ltd.
 
Имя файла: doms.exe  

Размер (в байтах): 37759
SHA-1: 7034D583B3C28AC9F05EC2B5FB1FF09E5697DF2C
MD5: 19B726CB36803FE380EAF37701A37BD8
CRC32:

Продукт Solvusoft

Загрузка
WinThruster 2023 — Сканировать ваш компьютер на наличие ошибок реестра в doms.exe

Windows
11/10/8/7/Vista/XP

Установить необязательные продукты — WinThruster (Solvusoft) | Лицензия | Политика защиты личных сведений | Условия | Удаление

EXE
doms.exe

Идентификатор статьи:   1138223

Doms.exe

1

2

Выберите программное обеспечение

File ID Размер (в байтах) Загрузить
+ doms.exe 19B726CB36803FE380EAF37701A37BD8 36.87 KB
Софт Hacks AND Cracks 1.0.0.0
Программист Dark Bay Ltd.
Операционная система Windows 10
Тип 64-разрядная (x64)
KB 37759
Контрольная сумма MD5 19B726CB36803FE380EAF37701A37BD8
ША1 7034D583B3C28AC9F05EC2B5FB1FF09E5697DF2C
CRC32:
Расположение каталога файлов C:WindowsSystem32

Классические проблемы Doms.exe

Наиболее распространенные ошибки doms.exe, которые могут возникнуть на компьютере под управлением Windows, перечислены ниже:

  • «Ошибка Doms.exe. «
  • «Ошибка программного обеспечения Win32: doms.exe»
  • «Извините, doms.exe столкнулся с проблемой. «
  • «Файл doms.exe не найден.»
  • «Отсутствует файл Doms.exe.»
  • «Ошибка запуска в приложении: doms.exe. «
  • «Doms.exe не выполняется. «
  • «Doms.exe остановлен. «
  • «Неверный путь к приложению: doms.exe.»

Эти сообщения об ошибках EXE могут появляться во время установки программы, в то время как программа, связанная с doms.exe (например, Hacks AND Cracks) работает, во время запуска или завершения работы Windows, или даже во время установки операционной системы Windows. Важно отметить, когда возникают проблемы doms.exe, так как это помогает устранять проблемы Hacks AND Cracks (и сообщать в Dark Bay Ltd.).

Источник ошибок Doms.exe

Проблемы Hacks AND Cracks и Doms.exe возникают из отсутствующих или поврежденных файлов, недействительных записей реестра Windows и вредоносных инфекций.

Особенно ошибки doms.exe проистекают из:

  • Недопустимый doms.exe или поврежденный раздел реестра.
  • Файл Doms.exe поврежден от вирусной инфекции.
  • Doms.exe злонамеренно или ошибочно удален другим программным обеспечением (кроме Hacks AND Cracks).
  • Другое программное приложение, конфликтующее с doms.exe.
  • Hacks AND Cracks/doms.exe поврежден от неполной загрузки или установки.

  • Главная»
  • Уроки»

  • HTML и DHTML»

  • Структура DOM в случае ошибок в разметке HTML
  • Метки урока:
  • разное
  • html
  • кодинг

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

Вот какой код будем проверять:

<div>
	<p><span><b>Некий текст</span></b></p>
</div>

Указанный код вставлен в правильную структуру тега <body>.

Внутри элемента параграфа имеется ошибка закрытия тегов: открывается тег <span>, затем открывается тег <b>, но тег <span> закрывается первым.

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

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

demo

Chrome 9

Структура DOM в Chrome

Firefox 3.6

Структура DOM в FireFox

Internet Explorer 9

Структура DOM в IE9

Opera 11

Структура DOM в Opera

Safari 5

Структура DOM в Safari

Построенная структура DOM имеет различия.

Удвоенный элемент. Ну и что?

Казалось бы, что такого? Но неправильная структура DOM может влиять на CSS и JavaScript, которые используют указание элементов в коде. Можно подумать, что такая ситуация никогда не случится, потому что код всегда проходит проверку. Но если страница генерируется динамически или на ней имеется пользовательское содержание, то вероятность появления подобной ошибки весьма высока. Конечно, проблема не имеет глобального значения, но относится к разряду «никто не знает, что может случиться».

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

Firefox 3.6, IE9, и Safari 5 выводят дополнительный элемент. Достаточно свежие версии браузеров показывают различный результат (особенно странной является ситуация с Safari и Chrome, которые построены на одном движке WebKit). Если разработчики браузеров руководствовались спецификацией в случае обработки ошибок в разметке, почему мы имеем разный результат?


5 последних уроков рубрики «HTML и DHTML»

  • Лайфхак: наиполезнейшая функция var_export()

    При написании или отладки PHP скриптов мы частенько пользуемся функциями var_dump() и print_r() для вывода предварительных данных массив и объектов. В этом посте я бы хотел рассказать вам о функции var_export(), которая может преобразовать массив в формат, пригодный для PHP кода.

  • 17 бесплатных шаблонов админок

    Парочка бесплатных шаблонов панелей администрирования.

  • 30 сайтов для скачки бесплатных шаблонов почтовых писем

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

  • Как осуществить задержку при нажатии клавиши с помощью jQuery?

    К примеру у вас есть поле поиска, которое обрабатывается при каждом нажатии клавиши клавиатуры. Если кто-то захочет написать слово Windows, AJAX запрос будет отправлен по следующим фрагментам: W, Wi, Win, Wind, Windo, Window, Windows. Проблема?.

  • 15 новых сайтов для скачивания бесплатных фото

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

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

Когда ошибка появляется на телевизоре, происходит это с надписью «No signal!» или «Отсутствует сигнал проверьте пожалуйста кабель». В данной статье мы разберем что делать, откуда берется ошибка и как предотвратить появление последней.

Причины возникновения ошибки

Дом ру ошибка 301 на телевизоре

Как сказано выше, одной из причин возникновения ошибки может является нарушение соединения кабеля с устройством. Касается это не только непосредственно соединения штекера с телевизором, но и самого провода, который может быть перебит в определенном месте, в связи с чем сигнал не доходит. Ошибки случаются не только в связи с нарушением в работе «железа» но и в связи с системными ошибками. Так, нарушение в системных файлах телевизора также может приводить к ошибке 301. Соответственно при возникновении сбоев в системе решать данную проблему нужно совершенно иным способом нежели заменой или проверкой кабеля и соединения.

Дом ру ошибка 301 на телевизоре

В первую очередь следует все же проверить кабель и только потом приступать к остальным способам.

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

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

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

Если ничего не помогло

Если ни один из вышеуказанных способов не помог остается только звонить в техническую поддержку и тщательно объяснять о нарушении в работе. Конечно, лучше всего в таком случае будет вызвать мастера по телевизорам. Ошибка 301 не является серьезной проблемой и скорее всего за устранение мастер много денег не возьмет.

В этой статье мы изучим: как создаётся веб-страница в браузере, что такое DOM и зачем он нужен, как строится DOM-дерево, типы узлов и отношения между ними.

Как создаётся веб-страница?

Когда браузер загружает HTML-код страницы, он строит на основании него объектную модель документа (на английском Document Object Model или сокращённо DOM).

Перед тем как перейти к изучению DOM, рассмотрим сначала все основные этапы работ, которые выполняет браузер для преобразования исходного кода HTML-документа в отображение стилизованной и интерактивной картинки на экране. Кстати, этот процесс называется Critical Rendering Path (CRP).

Шаги CRP:

Critical Rendering Path или как создается веб-страница в браузере

Хотя этот процесс состоит из большого количества шагов, их грубо можно представить в виде двух:

  1. Анализирует HTML-документ, чтобы определить то, что в конечном итоге нужно отобразить на странице;
  2. Выполняет отрисовку того что нужно отобразить.

Результатом первого этапа является формирование дерева рендеринга (render tree). Данное дерево содержит видимые элементы и текст, которые нужно отобразить на странице, и также связанные с ними стили. Это дерево дублирует структуру DOM, но включает как мы отметили выше только видимые элементы. В render tree каждый элемент содержит соответствующий ему объект DOM и рассчитанные для него стили. Таким образом, render tree описывает визуальное представление DOM.

Чтобы построить дерево рендеринга, браузеру нужны две вещи:

  • DOM, который он формирует из полученного HTML-кода;
  • CSSOM (CSS Object Model), который он строит из загруженных и распознанных стилей.

На втором этапе браузер выполняет отрисовку render tree. Для этого он:

  • рассчитывает положение и размеры каждого элемента в render tree, этот шаг называется Layout;
  • выполняет рисование, этот шаг называется Paint.

После Paint все нарисованные элементы находятся на одном слое. Для повышения производительности страницы браузер выполняет ещё один шаг, который называется Composite. В нем он группирует элементы по композиционным слоям. Именно благодаря этому этапу мы можем создать на странице плавную анимацию элементов при использовании таких свойств как transform, opacity. Так как изменение этих свойств вызовет только одну задачу Composite.

Для работы со слоями в Chrome есть отличный инструмент Layers.

Инструмент Layers для работы со слоями в Chrome

Например, изменения свойства color вызовет сначала задачу Paint, а затем вероятнее всего последует Composite всех затронутых элементов.

Изменение width вызовет следующие задачи: Layout -> Paint -> Composite.

Layout и Paint – это ресурсоемкие процессы, поэтому для хорошей отзывчивости вашей страницы или веб-приложения, необходимо свести к минимуму операции которые их вызывают.

Список свойств, изменение которых вызывают Paint:

  • color;
  • background;
  • visibility;
  • border-style и другие.

Список свойств, изменение которых вызывает Layout:

  • width и height;
  • padding и margin;
  • display;
  • border;
  • top, left, right и bottom;
  • position;
  • font-size и другие.

Кроме этого, Layout срабатывает не только при изменении CSS-свойств, но также, например когда мы хотим получить смещение элемента (el.offsetLeft, el.offsetTop и так далее) или его положение (el.clientLeft, el.clientTop и так далее), а также во многих других случаях. Более подробно ознакомиться с этими операциями можно здесь.

Чтобы понимать какую стоимость имеет то или иное свойство, можно установить расширение css-triggers для редактора кода VS Code:

Расширение css-triggers для Visual Studio Code

DOM – это объектное представление исходного HTML-кода документа. Процесс формирования DOM происходит так: браузер получает HTML-код, парсит его и строит DOM.

Затем, как мы уже отмечали выше браузер использует DOM (а не исходный HTML) для строительства дерева рендеринга, потом выполняет layout и так далее.

Почему не использовать в этом случае просто HTML? Потому что HTML – это текст, и с ним невозможно работать так как есть. Для этого нужно его разобрать и создать на его основе объект, что и делает браузер. И этим объектом является DOM.

Итак, DOM – это объектная модель документа, которую браузер создаёт в памяти компьютера на основании HTML-кода.

По-простому, HTML-код – это текст страницы, а DOM – это объект, созданный браузером при парсинге этого текста.

Но, браузер использует DOM не только для выполнения процесса CRP, но также предоставляет нам программный доступ к нему. Следовательно, с помощью JavaScript мы можем изменять DOM.

DOM – это технология не только для браузеров и JavaScript. Существуют и другие инструменты, позволяющие работать с DOM. Например, работа с DOM может осуществляться серверными скриптами, после загрузки и парсинга ими HTML-страницы. Но это немного другая тема и мы не будем рассматривать её здесь.

Все объекты и методы, которые предоставляет браузер описаны в спецификации HTML DOM API, поддерживаемой W3C. С помощью них мы можем читать и изменять документ в памяти браузера.

Например, с помощью JavaScript мы можем:

  • добавлять, изменять и удалять любые HTML-элементы на странице, в том числе их атрибуты и стили;
  • получать доступ к данным формы и управлять ими;
  • реагировать на все существующие HTML-события на странице и создавать новые;
  • рисовать графику на HTML-элементе <canvas> и многое другое.

При изменении DOM браузер проходит по шагам CRP и почти мгновенно обновляет изображение страницы. В результате у нас всегда отрисовка страницы соответствует DOM.

Благодаря тому, что JavaScript позволяет изменять DOM, мы можем создавать динамические и интерактивные веб-приложения и сайты. С помощью JavaScript мы можем менять всё что есть на странице. Сейчас в вебе практически нет сайтов, в которых не используется работа с DOM.

В браузере Chrome исходный HTML-код страницы, можно посмотреть во вкладке «Source» на панели «Инструменты веб-разработчика»:

Исходный код веб-страницы, который получает браузер Chrome, доступен во вкладке Source на панели Инструменты веб-разработчика

На вкладке Elements мы видим что-то очень похожее на DOM:

Представление DOM-дерева в виде HTML-кода в браузере Chrome

Однако DevTools включает сюда дополнительную информацию, которой нет в DOM. Отличным примером этого являются псевдоэлементы в CSS. Псевдоэлементы, созданные с помощью селекторов ::before и ::after, являются частью CSSOM и дерева рендеринга, и технически не являются частью DOM. Мы с ними не может взаимодействовать посредством JavaScript.

По факту DOM создается только из исходного HTML-документа и не включает псевдоэлементы. Но в инспекторе элементов DevTools они имеются.

Как строится DOM?

Перед тем, как перейти к DOM, сначала вспомним, что собой представляет исходный HTML-код документа. В качестве примера рассмотрим следующий:

<!doctype html>
<html lang="ru">
<head>
  <title>Моя страница</title>
</head>
<body>
  <h1>Мобильные ОС</h1>
  <ul>
    <li>Android</li>
    <li>iOS</li>
  </ul>
</body>
</html>

Как вы уже знаете, HTML-документ – это обычный текстовый документ. Его код состоит из тегов, атрибутов, текста, комментариев и так далее. Очень важной сущностью в нём является HTML-элемент. На них всё строится. HTML-элемент в большинстве случаев состоит из открывающего и закрывающего тегов, между которыми располагается его содержимое. Например, HTML-элемент h1 имеет открывающий тег <h1>, закрывающий </h1> и содержимое «Моя страница». Кроме этого, тег может содержать дополнительную информацию посредством атрибутов. В этом коде атрибут имеется только у HTML-элемента <html>.

Также очень важно понимать, что в HTML-коде одни элементы вкладываются в другие. Например, <h1> вложен в <body>, а <body> в <html>. Это очень важная концепция, которая нам и позволяет нам создавать определённую разметку в HTML.

Теперь рассмотрим, как браузер на основании HTML-кода строит DOM. Объектная структура DOM представляет собой дерево узлов (узел на английском называется node). При этом DOM-узлы образуются из всего, что есть в HTML: тегов, текстового контента, комментариев и т.д.

DOM-дерево

Корневым узлом DOM-дерева является объект document, он представляет сам этот документ. Далее в нём расположен узел <html>. Получить этот элемент в коде можно так:

const elHTML = document.documentElement;

В <html> находятся 2 узла-элемента: <head> и <body>. Получить их в коде можно так:

const elHead = document.head;
const elBody = document.body;

В <head> находится DOM-узел <title>:

// получим <title> и присвоим его переменной elTitle
const elTitle = document.title;

В <title> находится текстовый узел. Теперь перейдём к <body>. В нём находятся 2 элемента <h1> и <ul>, и так далее.

При этом, как вы уже поняли, узлы в зависимости от того, чем они образованы делятся на разные типы. В DOM выделяют:

  • узел, представляющий собой весь документ; этим узлом является объект document; он выступает входной точкой в DOM;
  • узлы, образованные тегами, их называют узлами-элементами или просто элементами;
  • текстовые узлы, они образуются текстом внутри элементов;
  • узлы-комментарии и так далее.

Имеются и другие типы узлов, но на практике в основном используются только перечисленные выше.

Каждый узел в дереве DOM является объектом. Но при этом формируют структуру DOM только узлы-элементы. Текстовые узлы, например, содержат в себе только текст. Они не могут содержать внутри себя другие узлы. Поэтому вся работа с DOM в основном связана с узлами-элементами.

Кстати, директива <!doctype html> тоже является DOM-узлом. Но она нам не интересна, поэтому на схеме мы её опустили.

Чтобы перемещаться по узлам DOM-дерева нужно знать какие они имеют отношения. Зная их можно будет выбирать правильные свойства и методы. Связи между узлами, определяются их вложенностью. Каждый узел в DOM может иметь следующие виды отношений:

  • родитель – это узел, в котором он непосредственно расположен; при этом родитель у узла может быть только один; также узел может не иметь родителя, в данном примере им является document;
  • дети или дочерние узлы – это все узлы, которые расположены непосредственно в нём; например, узел <ul> имеет 2 детей;
  • соседи или сиблинги – это узлы, которые имеют такого же родителя что и этот узел;
  • предки – это его родитель, родитель его родителя и так далее;
  • потомки – это все узлы, которые расположены в нем, то есть это его дети, а также дети его детей и так далее.

Например, узел-элемент <h1> имеет в качестве родителя <body>. Ребенок у него один – это текстовый узел «Мобильные ОС». Сосед у него тоже только один – это <ul>.

Отношения между узлами в DOM-дереве

Теперь рассмотрим, каких предков имеет текстовый узел «iOS». У него они следующие: <li>, <ul>, <body> и <html>.

Все предки узла в DOM-дереве

У элемента <head> 2 потомка: <title> и текстовый узел «Моя страница».

Все потомки узла в DOM-дереве

Зачем нужно знать, как строится DOM-дерево? Во-первых, это понимание той среды, в которой вы хотите что-то изменять. Во-вторых, большинство действий при работе с DOM сводится к поиску нужных элементов. Но не зная как устроено DOM-дерево и отношения между узлами, найти что-то в нём будет достаточно затруднительно.

Задания

1. Представленное DOM-дерево преобразуйте обратно в HTML-код:

DOM-дерево, которые нужно обратно преобразовать в HTML-код

Следующая тема: Узлы DOM-дерева.

ГИС ЖКХ: асинхронная модель взаимодействия

Время прочтения
10 мин

Просмотры 14K

Продолжаю делиться опытом по взаимодействию с ГИС ЖКХ. Следующей задачей, после установки защищенного соединения, стала организация обмена сообщениями. Разработчики ГИС ЖКХ предлагают две модели взаимодействия: синхронную и асинхронную. Некоторые разработчики выбирают синхронную модель из-за её простоты и доступности. В этой статье постараюсь объяснить, почему нужно использовать именно асинхронную модель и дать подсказки по реализации на C#.

Выбор модели взаимодействия

Синхронная модель подразумевает классический «запрос-ответ». Вы формируете объект запроса, отправляете его в ГИС ЖКХ, и система удерживает соединение до того момента как не будет сформирован ответ или соединение не разорвётся по таймауту.

Асинхронная модель строится на двух операциях: постановка задания на выполнение действия и запрос состояния выполнения действия (при необходимости повторяем несколько раз). Именно эта модель взаимодействия называлась разработчиками ГИС ЖКХ как предпочтительная и рекомендуемая. Далее мы подробно рассмотрим эти обе операции.

Постановка задания на выполнение действия

Для получения информации или отправки данных в ГИС ЖКХ, необходимо заполнить объект запроса. Именно в нём находится информация «по какому дому нужно получить информацию» или «какие именно лицевые счета нужно создать в ГИС ЖКХ».

В сообщении также указывается идентификатор сообщения (MessageGUID), он однозначно идентифицирует сообщение в информационной системе. Запрос, с одним и тем же MessageGUID можно несколько раз отправлять в ГИС ЖКХ, и ГИС ЖКХ гарантирует, что он выполнится один раз. Например, при постановке задания на создание лицевых счетов запрос упал по таймауту или связь внезапно прервалась, мы можем потом ещё раз отправить этот же запрос с уверенностью, что лишних лицевых счетов мы не создадим.

Если выполняется отправка массива объектов, каждому объекту присваивается TransportGUID, он позволяет сопоставить объект запроса и ответа. Например, из результата обработки мы сможем узнать, почему именно этот лицевой счет из всего сообщения не принимается ГИС ЖКХ.

В ответ мы получим другой MessageGUID – идентификатор запроса в ГИС ЖКХ. Именно по этому идентификатору будет запрашиваться состояние выполнения запроса в ГИС ЖКХ.

Запрос состояния выполнения действия

Для получения состояния выполнения нужно выполнить короткий запрос getStateResult. В нём указывается MessageGUID, присвоенный в ГИС ЖКХ. Этот запрос можно отправлять несколько раз.

В ответе мы получим состояние обработки сообщения: принято, в обработке, готово. Если сообщение обработано, ГИС ЖКХ возвращает либо результат обработки (получаемый объект или информацию об отправке данных), либо сообщает об ошибках, произошедших при обработке сообщения. Самые распространённые ошибки: «EXP001000: Внутренняя ошибка.», «Доступ запрещен для поставщика данных организация «*» полномочие «*»», «Удаленный сервер вернул неожиданный ответ: (502) Bad Gateway.», «Прослушивание на api.dom.gosuslugi.ru* не выполняла ни одна конечная точка, которая могла бы принять сообщение.» и прочее. По сути, они делят сообщения на два типа: те сообщения, которые можно отправить ещё раз и те, которые уже нет смысла повторно отправлять. Для себя решили, что, если получаем обработанную ошибку ГИС ЖКХ, то повторно запрос не отправляем. Если запрос отвалился по таймауту или проблема в нашем коде, отправляем сообщение ещё раз.

Типичные ошибки ГИС ЖКХ

  1. Выполнение обработки сообщения на стороне ГИС ЖКХ проходит не в транзакции.
    Например, мы отправляем сообщение на создание 30 лицевых счетов, в результате получаем «EXP001000: Внутренняя ошибка.». Мы справедливо ожидаем, что ни один из лицевых счетов не создался, однако при контрольной проверке видим, что ВСЕ лицевые счета создались.
  2. Некоторые запросы «зависают» в статусе «принято» или «в обработке» на неопределенное время.
    Обычно результат обработки сообщения можно получить через несколько секунд, но некоторые сообщения висят в необработанном статусе несколько дней, такие сообщения нужно на своей стороне помечать, чтобы не спрашивать состояние обработки в очередной раз.

Из-за подобных «особенностей» процесс отправки информации в ГИС ЖКХ делится на три этапа:

  1. Загружаем информацию из ГИС ЖКХ для сверки текущего состояния
  2. Отправка нужной информации в ГИС ЖКХ
  3. Контрольная проверка загруженной информации, может быть, что-то опять упало с «EXP001000: Внутренняя ошибка.», а информация была создана.

Техническая сторона взаимодействия

Любой процесс взаимодействия с ГИС ЖКХ состоит их трёх этапов:

  1. Получение информации для сообщений, сохранение её в БД
  2. Создание прокси-объектов ГИС ЖКХ (напомню, мы работаем через WCF), отправка сообщения, обработка ответа, сохранение MessageGUID ГИС ЖКХ
  3. Получение результата обработки, обработка результата

Создание сообщений

Для каждого типа взаимодействия мы создаем таблицу в БД, например, ExportHouseInfoMessages или ImportLsMessages, в ней мы храним всю необходимую информацию для создания прокси-объекта сообщения, которую будем отправлять в ГИС ЖКХ. Именно на этом этапе мы создаем MessageGuid сообщения.

На этом этапе нужно создать сообщения только по тем данным, по которым ещё не были созданы сообщения и не получен результат обработки, иначе можно задублировать данные.

Главная сложность этого этапа – достать данные, необходимые для отправки, из своей информационной системы. Например, в ГИС ЖКХ нужно отправлять все изменения в лицевых счетах, а у нас не было истории изменения в нужном разрезе.

Пример реализации на C#

/// <summary>
/// Базовый сервис для первого этапа взаимодействия - создания сообщений
/// </summary>
/// <typeparam name="TMessageDomain">Тип доменного сообщения</typeparam>
/// <typeparam name="TSourceDomain">Тип объекта, который возвращается из информационной системы</typeparam>
public class CreateMessageCoreService<TMessageDomain, TSourceDomain>
	where TMessageDomain : MessageDomain
{
	private readonly ISourceService<TSourceDomain> _sourceService;
	private readonly IMessageDomainConverter<TMessageDomain, TSourceDomain> _messageDomainConverter;
	private readonly IMessageDomainService<TMessageDomain> _messageDomainService;
	private readonly IOrgPPAGUIDService _orgPPAGUIDService;
	private readonly IGisLogger _logger;
	
	public CreateMessageCoreService(ISourceService<TSourceDomain> sourceService,
		IMessageDomainConverter<TMessageDomain, TSourceDomain> messageDomainConverter,
		IMessageDomainService<TMessageDomain> messageDomainService,
		IOrgPPAGUIDService orgPPAGUIDService, IGisLogger logger)
	{
		_sourceService = sourceService;
		_messageDomainConverter = messageDomainConverter;
		_messageDomainService = messageDomainService;
		_orgPPAGUIDService = orgPPAGUIDService;
		_logger = logger;
	}

	public void CreateMessages(CoreInitData coreInitData)
	{
		var stopWatch = new Stopwatch();
		stopWatch.Start();
		try
		{
			//получаем данные из информационной системы, по которым нужно осуществить взаимодействие
			var sourceDomains = _sourceService.GetSourceDomains(coreInitData);
			//получаем senderId по УК
			var orgPPAGUID = _orgPPAGUIDService.GetOrgPPAGUID(coreInitData.UkId);
			//по исходным данным создаем доменные сообщения 
			var messages = _messageDomainConverter.ToMessageDomain(sourceDomains, coreInitData, orgPPAGUID);
			//сохраняем сообщения в базу данных
			_messageDomainService.InsertMessageDomains(messages);

			stopWatch.Stop();
			_logger.Info(this.GetType(), $"Создано {messages.Count} доменных сообщений по УК {coreInitData.UkId} за {stopWatch.Elapsed}");
		}
		catch (Exception ex)
		{
			_logger.Error(this.GetType(), $"Произошло исключение при обработке {coreInitData}", ex);
		}
	}
}

Отправка сообщений

На этом этапе:

  • Поднимаем сообщения из БД, которые нужно отправить в ГИС ЖКХ
  • Создаем по ним прокси объекты сообщений
  • Отправляем в ГИС ЖКХ
  • Получаем MessageGUID ГИС ЖКХ
  • Сохраняем его в сообщении в БД

Пример реализации на C#

/// <summary>
/// Базовый сервис для второго этапа взаимодействия - отправки сообщений
/// </summary>
/// <typeparam name="TMessageDomain">Тип доменного сообщения</typeparam>
/// <typeparam name="TMessageProxy">Тип прокси объекта сообщения</typeparam>
/// <typeparam name="TAckProxy">Тип прокси объекта ответа</typeparam>
public class SendMessageCoreService<TMessageDomain, TMessageProxy, TAckProxy>
	where TMessageDomain : MessageDomain
	where TAckProxy : IAckRequestAck
{
	private readonly IMessageDomainService<TMessageDomain> _messageDomainService;
	private readonly IMessageProxyConverter<TMessageDomain, TMessageProxy> _messageProxyConverter;
	private readonly ISendMessageProxyProvider<TMessageProxy, TAckProxy> _sendMessageProxyProvider;
	private readonly ISendMessageHandler<TMessageDomain, TAckProxy> _sendMessageHandler;
	private readonly IGisLogger _logger;
	
	public SendMessageCoreService(IMessageDomainService<TMessageDomain> messageDomainService,
		IMessageProxyConverter<TMessageDomain, TMessageProxy> messageProxyConverter,
		ISendMessageProxyProvider<TMessageProxy, TAckProxy> sendMessageProxyProvider,
		ISendMessageHandler<TMessageDomain, TAckProxy> sendMessageHandler, IGisLogger logger)
	{
		_messageDomainService = messageDomainService;
		_messageProxyConverter = messageProxyConverter;
		_sendMessageProxyProvider = sendMessageProxyProvider;
		_sendMessageHandler = sendMessageHandler;
		_logger = logger;
	}

	public void SendMessages(CoreInitData coreInitData)
	{
		var stopWatch = new Stopwatch();
		stopWatch.Start();
		try
		{
			//получаем доменные сообщения для отправки
			//не обязательно могут быть только новые
			//также поднимаются не отправленные с первого раза
			var messages = _messageDomainService.GetMessageDomainsForSend(coreInitData);
			foreach (var messageDomain in messages)
			{
				try
				{
					//по каждому из доменных сообщений создаем прокси сообщение
					var proxyMessageRequests = _messageProxyConverter.ToMessageProxy(messageDomain);
					//отправляем прокси сообщение
					var proxyAck = _sendMessageProxyProvider.SendMessage(proxyMessageRequests);
					//обрабатываем успешный результат
					_sendMessageHandler.SendSuccess(messageDomain, proxyAck);
				}
				catch (Exception exception)
				{
					//обрабатываем исключения
					_sendMessageHandler.SendFail(messageDomain, exception);
				}
			}

			stopWatch.Stop();
			_logger.Info(this.GetType(), $"По {messages.Count} доменным сообщениям УК {coreInitData.UkId} отправлено " +
						  $"{messages.Count(x => x.Status == MessageStatus.Sent)} сообщений, " +
						  $"{messages.Count(x => x.Status == MessageStatus.SendError)} упали с ошибкой, " +
						  $"{messages.Count(x => x.Status == MessageStatus.SendErrorTryAgain)} будут отправлены повторно, за {stopWatch.Elapsed}");
		}
		catch (Exception ex)
		{
			_logger.Error(this.GetType(), $"Произошло исключение при обработке {coreInitData}", ex);
		}
	}
}

Получение результата обработки сообщения

На этом этапе:

  • Поднимаем сообщения из БД, по которым нужно получить результаты
  • Формируем прокси объект получения состояния обработки
  • Отправляем в ГИС ЖКХ
  • Если сообщение ещё не обработано, сохраняем в БД, что сообщение не обработано. Если после отправки сообщения прошло слишком много времени, помечаем сообщение.
  • Если по сообщению есть результат, его нужно обработать. Обычно это сохранение привязок идентификаторов объектов в ГИС ЖКХ и в нашей ИС.

Пример реализации на C#

	/// <summary>
	/// Базовый сервис для третьего этапа взаимодействия - получения результата обработки
	/// </summary>
	/// <typeparam name="TMessageDomain">Тип доменного сообщения</typeparam>
	/// <typeparam name="TGetStateResultProxy">Тип прокси объекта запроса результата обработки</typeparam>
	/// <typeparam name="TResultProxy">Тип прокси объекта результата обработки сообщения</typeparam>
	/// <typeparam name="TResult">Тип объекта результата обработки сообщения</typeparam>
	public class GetResultsCoreService<TMessageDomain, TGetStateResultProxy, TResultProxy, TResult>
		where TMessageDomain : MessageDomain
		where TResultProxy : IGetStateResult
	{
		private readonly IMessageDomainService<TMessageDomain> _messageDomainService;
		private readonly IGetResultProxyProvider<TGetStateResultProxy, TResultProxy> _getResultProxyProvider;
		private readonly IGetStateProxyConverter<TGetStateResultProxy, TMessageDomain> _getStateProxyConverter;
		private readonly IResultConverter<TResultProxy, TResult> _resultConverter;
		private readonly ISaveResultService<TResult, TMessageDomain> _saveResultService;
		private readonly IGetResultMessageHandler<TMessageDomain, TResult> _getResultMessageHandler;
		private readonly IGisLogger _logger;
		
		/// <summary>
		/// Количество дней, через которые считается, что запрос не выполнится никогда
		/// </summary>
		private const int GET_RESULT_TIMEOUT_IN_DAYS = 3;

		public GetResultsCoreService(IMessageDomainService<TMessageDomain> messageDomainService,
			IGetResultProxyProvider<TGetStateResultProxy, TResultProxy> getResultProxyProvider,
			IGetStateProxyConverter<TGetStateResultProxy, TMessageDomain> getStateProxyConverter,
			IResultConverter<TResultProxy, TResult> resultConverter,
			ISaveResultService<TResult, TMessageDomain> saveResultService,
			IGetResultMessageHandler<TMessageDomain, TResult> getResultMessageHandler, IGisLogger logger)
		{
			_messageDomainService = messageDomainService;
			_getResultProxyProvider = getResultProxyProvider;
			_getStateProxyConverter = getStateProxyConverter;
			_resultConverter = resultConverter;
			_saveResultService = saveResultService;
			_getResultMessageHandler = getResultMessageHandler;
			_logger = logger;
		}

		public void GetResults(CoreInitData coreInitData)
		{
			var stopWatch = new Stopwatch();
			stopWatch.Start();
			try
			{
				//получаем доменнные сообщения для проверки результата обработки
				var messages = _messageDomainService.GetMessageDomainsForGetResults(coreInitData);
				foreach (var messageDomain in messages)
				{
					try
					{
						//по доменному сообщению получаем getState для проверки результатов обработки сообщения
						var getStateProxy = _getStateProxyConverter.ToGetStateResultProxy(messageDomain);
						TResultProxy resultProxy;
						//проверяем результат обработки. 
						//если возвращается false, значит сообщение ещё не обработано
						//если true, значит можно получать результат обработки
						if (_getResultProxyProvider.TryGetResult(getStateProxy, out resultProxy))
						{
							//полученный ответ преобразовываем из прокси сущности в нашу бизнес-сущность результата обработки
							var result = _resultConverter.ToResult(resultProxy);
							//сохраняем результат обработки сообщения
							_saveResultService.SaveResult(result, messageDomain);
							//проставляем статусы обработки сообщения в доменном сообщении
							_getResultMessageHandler.Success(messageDomain, result);
						}
						else
						{
							if (messageDomain.SendedDate.HasValue 
								&& DateTime.Now.Subtract(messageDomain.SendedDate.Value).Days > GET_RESULT_TIMEOUT_IN_DAYS)
							{
								//в течение таймаута не можем получить результат обработки сообщения, помечаем
								_getResultMessageHandler.NoResultByTimeout(messageDomain);
							}
							else
							{
								//помечаем, что сообщение ещё не обработалось
								_getResultMessageHandler.NotReady(messageDomain);
							}
						}
					}
					catch (Exception exception)
					{
						//обрабатываем исключения во время работы
						_getResultMessageHandler.Fail(messageDomain, exception);
					}
				}
				stopWatch.Stop();
				_logger.Info(this.GetType(), $"По {messages.Count} доменным сообщениям УК {coreInitData.UkId} получено " +
							  $"{messages.Count(x => x.Status == MessageStatus.Done)} успешных ответов, " +
							  $"{messages.Count(x => x.Status == MessageStatus.InProcess)} в обработке, " +
							  $"{messages.Count(x => x.Status == MessageStatus.ResponseTakingError)} упали с ошибкой, " +
							  $"{messages.Count(x => x.Status == MessageStatus.ResponseTakingErrorTryAgain)} будут отправлены повторно, за {stopWatch.Elapsed}");
			}
			catch (Exception ex)
			{
				_logger.Error(this.GetType(),$"Произошло исключение при обработке {coreInitData}", ex);
			}
		}
	}

Заключение

Асинхронная модель взаимодействия позволяет контролировать отправляемую информацию в ГИС ЖКХ за счет соглашения «один MessageGUID — одно выполненное действие». Рекомендую!

На github выложил базовые классы, которыми мы пользуемся для взаимодействия, постарался написать наиболее подробные комментарии. Если использовать такой подход, то остается лишь реализовывать логику подъема данных из своей информационной системы и обрабатывать результат.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Коды ошибок dodge intrepid
  • Коды ошибок diag ман тгс
  • Коды ошибок автономки автотепло 24в 4 кв
  • Коды ошибок аркадия
  • Коды ошибок deutz на русском

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии