Прочитайте данные JSON в txt-файле, чтобы опубликовать сообщения в Cloud Pub Sub - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь опубликовать данные в Cloud Pub Sub.Данные в формате JSON и хранятся в моей локальной папке.Я не использую Cloud Storage и не пытаюсь читать сообщения pubsub напрямую через облачную функцию.Протестировал поток с передачей сообщений вручную, и данные также вставляются в таблицы Bigquery.Единственное место, где я застрял, это как я передам набор данных JSON .txt file в Cloud PubSub,

Пример данных

{"ID":6,"NAME":"Komal","AGE":22,"ADDRESS":"Assam","SALARY":20000}

Может ли кто-нибудь дать PLSмне подсказку!

Я мог видеть различные варианты использования облачного хранилища и все, здесь я читаю измененные данные из таблицы БД, вставляю эти записи в 1 фиктивную таблицу и преобразовываю данные из этой таблицы в формат JSON изапись в файл .txt.Отсюда, если я смогу опубликовать данные в pubsub, весь поток будет завершен

Если я передам вручную, как показано ниже, данные будут вставлены

gcloud pubsub themes publish pubsubtopic1 -сообщение

{"ID":6,"NAME":"Komal","AGE":22,"ADDRESS":"Assam","SALARY":20000}

Редактировать 10 АПРЕЛЯ

Как я могу добиться вставки данных из файла .txt в pubsub с помощью пакетного файла.Но когда я вызываю командный файл из процедуры PL SQL (DBMS_SCHEDULER), возникает ошибка «gcloud не распознается как внутренняя или внешняя команда».Но когда я вызываю командный файл из командной строки, данные попадают в паб-саб, а также в таблицу Bigquery. Используемый мной скрипт PFB и код PL SQL.Мы будем благодарны за любую помощь

Пакетный скрипт и код PL PL, используемый для вызова скрипта

@echo off
set file=C:\temp\TEST_EXTRACT.txt
echo %file% >> C:\temp\T1.txt
for /f "tokens=*" %%A in (%file%) do (ECHO %%A >> C:\temp\T2.txt
ECHO cmd.exe /K cd C:\Users\test\AppData\Local\Google\Cloud SDK && gcloud pubsub topics publish pubsubtopic1 --message %%A > C:\temp\T3.txt)

Below mentioned the PL SQL code which is used for calling the batch file

BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB( 
    job_name => 'LOOP_JOB',
    job_type => 'EXECUTABLE',
    job_action => 'C:\WINDOWS\system32\cmd.exe',
    --repeat_interval => 'FREQ=WEEKLY;BYDAY=MON,TUE,WED,THU,FRI;  BYHOUR=18;BYMINUTE=0;BYSECOND=0',
    --start_date => SYSTIMESTAMP at time zone 'EUROPE/LONDON',
    job_class => 'DEFAULT_JOB_CLASS',
    comments => 'Job to test call out to batch script on Windows',
    auto_drop => FALSE,
    number_of_arguments => 3,
    enabled => FALSE);

SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( 
    job_name => 'LOOP_JOB', argument_position => 1, argument_value => '/q'); 
SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( 
    job_name => 'LOOP_JOB', argument_position => 2, argument_value => '/c'); 
SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( 
    job_name => 'LOOP_JOB', argument_position => 3, argument_value => 'C:\temp\loop.bat'); 
SYS.DBMS_SCHEDULER.ENABLE( 'LOOP_JOB' ); 
END;
/

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Проблема с вашим bash-сценарием, вероятно, связана с тем, что инструмент командной строки gcloud не установлен на машине, на которой фактически выполняется база данных, или отсутствует в PATH для среды, в которой выполняется сценарий, поэтому он не найден при вашей.Сценарий bat запущен.

При этом я настоятельно рекомендую не пытаться выполнять обработку данных в сценарии .bat и передавать ее в инструмент командной строки, так как она будет подвержена ошибкам и иметьбольшие накладные расходы как из-за прохождения неэффективной кодировки JSON, так и из-за запуска и разрушения клиента-издателя для каждого сообщения.Вместо этого я бы посоветовал вам вместо этого экспортировать данные в формате CSV и использовать одну из клиентских библиотек , чтобы прочитать этот файл и опубликовать его в Cloud Pub / Sub.Это все еще может быть вызвано заданием cron базы данных, как вы упомянули ниже, и будет гораздо более эффективным, а также более тестируемым.

0 голосов
/ 04 апреля 2019

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

jq -c ".[]" json_array.json | xargs -t -I {} gcloud pubsub topics publish yourTopic --message {}

Убедитесь, что у вас установлено jq, в то время как xargs встречается чаще.

...