Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consume падает если в очереди нет новых сообщений #14

Closed
nagorsky opened this issue Nov 5, 2024 · 6 comments

Comments

@nagorsky
Copy link

nagorsky commented Nov 5, 2024

Тестирую DaJet Script 3.8.5

Использую простую конструкцию с подключением к 1С на postgresql, чтение и удаление из планов обмена через CONSUME (см. скрин).

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

При этом если запустить этот же скрипт и в этот момент в исходящей очереди не будет сообщений - скрипт падает с 500 ошибкой (см. скрин).

Возможно он падает не из-за CONSUME, а из-за последующего SELECT

Это корректное поведение системы ?

image

@nagorsky
Copy link
Author

nagorsky commented Nov 5, 2024

И можно ли как-то повышать уровень логирования чтобы получать более внятные ошибки?
А не 500 internal. Смотрел dajet.log - там ничего в момент ошибки не появляется

Заранее благодарю.

@zhichkin
Copy link
Owner

zhichkin commented Nov 5, 2024

Добрый вечер!

  1. У Вас в скрипте нет команды USE, которая определяет контекст и строку подключения к базе данных. Не совсем понятно как это вообще может работать ...
  2. Согласен. Непонятных ошибок типа "Object reference not set to an instance of an object" (где-то получилась нулевая ссылка) не должно быть. Подебажу - сделаю понятной.
  3. Уровень логирования пока что только один. Спасибо за идею. Подумаю на тему расширенного логирования.

Сделал скрипт аналогичный Вашему test-consume.djs. Проверил на SQL Server и PostgreSQL (работает аналогично).

DECLARE @object object

USE 'pgsql://postgres:postgres@localhost:5432/dajet-exchange' --'mssql://zhichkin/dajet-exchange'

   CONSUME TOP 10 Ссылка
      INTO @object
      FROM Справочник.Номенклатура.Изменения

   SELECT name = ISNULL(Наименование, '')
     INTO @object
     FROM Справочник.Номенклатура
    WHERE Ссылка = @object.Ссылка

   PRINT '[JSON] ' + JSON(@object)

END

Далее запустил скрипт при помощи утилиты dajet на пустой таблице регистрации изменений для справочника "Номенклатура":
image

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

Затем перезаписываю разные элементы справочника "Номенклатура" (настроена автоматическая регистрация изменений в плане обмена). Практически сразу в консоль выводится JSON. Таблица регистрации изменений становится пустой. Скрипт снова какбы "зависает". Дублирование номенклатуры на скриншоте выше из-за того, что у меня 2 узла обмена.

Ну то есть всё работает ...

@nagorsky
Copy link
Author

nagorsky commented Nov 5, 2024

На самом деле я привел самую основную часть скрипта.

Привожу полную на скрине и ниже текстом.
Так же записал на видео как воспроизводится. Сначала запускаю когда изменений в плане обмена нет - валится с ошибкой. Затем создаю несколько изменений - перестает валиться. У меня не слишком быстрая среда, поэтому работает медленно, но все же странно что выдает 500 ошибку. Возможно нужно как-то делать проверку на NULL при CONSUME или последующем SELECT?

2024-11-05.23-19-12.mp4

image

-- ***********************************************************************
-- * Источник сообщений PostgreSQL - регистр сведений "ИсходящаяОчередь" *
-- ***********************************************************************

PRINT '-- START DJS SCRIPT'

USE "pgsql://dajet_test:dajet@127.0.0.1:5432/1C_UMC_DEV?mdex"

DECLARE @Получатель string = "DaJet"
DECLARE @ЭтотУзел   string = "DaJet"
DECLARE @ТипСообщения   string = "1C_UMC.1C_Trade.ClientChanged"
DECLARE @message object

PRINT 'BEFORE CONSUME'


CONSUME TOP 10 Ссылка
   INTO @message
   FROM Справочник.DaJet_Тестовый.Изменения
  
SELECT  name = ISNULL(Данные.Наименование, "")
, code = ISNULL(Данные.Код, "deleted")
, isDeleted = Данные.ПометкаУдаления
  INTO @message
  FROM (SELECT Ссылка = @message.Ссылка) AS Изменения
  LEFT JOIN Справочник.DaJet_Тестовый      AS Данные
    ON Изменения.Ссылка = Данные.Ссылка   
   

PRINT 'AFTER CONSUME'
PRINT 'Объект в формате JSON    = ' + JSON(@message)




-- ************************************************************************
-- * Приёмник сообщений PostgreSQL - регистр сведений "ВходящиеСообщения" *
-- ************************************************************************

PRINT 'BEFORE CONNECT TO RECEIVER'

USE "pgsql://dajet_test:dajet@127.0.0.1:5432/1C_TRADE_DEV"

DECLARE @simple_key uuid = SELECT NEWUUID();


INSERT РегистрСведений.DaJet_ВходящаяОчередь
SELECT НомерСообщения = VECTOR('so_incoming_queue')
     , Отправитель    = @ЭтотУзел
     , ТипСообщения   = @ТипСообщения
     , ТелоСообщения  = JSON(@message)
     , ОтметкаВремени = NOW() 

PRINT 'AFTER INSERT TO RECEIVER'

END -- Контекст базы данных приёмника
END -- Контекст базы данных источника

PRINT '-- END DJS SCRIPT'

@zhichkin
Copy link
Owner

zhichkin commented Nov 5, 2024

Теоретически любой INTO @variable может в некоторыхз случаях возвращать NULL. В коде это можно проверять так:

IF @message = NULL
THEN PRINT '@message IS NULL'
ELSE PRINT '@message NOT NULL'
END

Постараюсь в ближайшее время посмотреть эту ошибку.

@nagorsky
Copy link
Author

nagorsky commented Nov 6, 2024

Проверил, добавив ваш код. На самом деле до этого блока не доходит. Падает на CONSUME вероятно.

image

@zhichkin
Copy link
Owner

zhichkin commented Nov 7, 2024

Исправлено в релизе DaJet 3.8.6

@zhichkin zhichkin closed this as completed Nov 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants