2015-07-16 4 views
1

Моя задача - выгрузить большую таблицу mssql в файл csv, который будет загружен в другое место. Задача должна выполняться по ночам (или по любой запланированной основе), а также должна выполняться по требованию (с веб-страницы). Преобразование csv должно выполняться на Java.Как выполнить задачу Java по расписанию и по требованию?

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

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

  2. Включите мою программу Java в jar и настройте задание Jenkins (у меня есть доступ к установке сервера Jenkins), чтобы выполнить основной класс в любом расписании. И создайте рабочие задания Jenkins (в php или что-то еще), если нужно, чтобы выполнять заказы по требованию. Кажется, это очень простой и простой вариант, есть ли какие-то очевидные ошибки, которые мне не хватает?

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

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

+0

Можете ли вы рассказать о том, почему это должно быть сделано на Java? – niallhaslam

+0

Это требование. Но я мог бы предложить любую реализацию, если бы мог это оправдать. Вы предлагаете превосходную реализацию/выбор языка? – ab11

ответ

1

Самый распространенный способ обработки работы по расписанию - cron.

Что касается доступа к нему через веб-страницу, возможно, он может работать как веб-сервис, используя какой-то отдых или мыло api. Этот веб-сервис будет в основном запускать вашу Java-логику и доставлять csv либо в виде ответа, либо генерировать его в файловой системе на сервере.

Что касается сброса данных - она ​​должна быть возможностью экспорта в CSV из MySQL напрямую: Dump a mysql database to a plaintext (CSV) backup from the command line

Если не требуется, чтобы сделать это в Java, то я хотел бы предложить простой веб-страницу с кнопкой отправки для вызова команда mysqldump. Это может быть php-скрипт, который будет оболочкой для системного вызова для запуска mysqldump в csv и выгрузки его в местоположение на http-сервере.

+0

Я прочитал вопрос как для MSSQLSERVER, а не для MySQL. Я отправил ответный ответ отдельно - и, как вы указываете, я внедрил ESB с тривиальной службой Rache Apache. – irwinj

0

Я сделал что-то вроде этого раньше, но ограничения, которые я имел были:

  1. Вызов был третьей стороной (с помощью Control-M - другие инструменты планирования доступны в том числе хрон).

  2. Целью был ETL в MySQL.

  3. Платформа Linux на моем конце и (очевидно)/Windows для конца MSSQLSERVER.

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

начало было вызвано путем нажатия задачи на очередь, которая контролировалась простым циклом (cronnable вероятно), который был написан в bash. Это вызвало isql для сброса каждой из таблиц схемы.

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

SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME like'<Schema>.%'; 

Нам нужно отфильтровать временные таблицы, которые соответствовали простым моделям - я думаю, что я использовал для этого СЭД , Если вас не волнует реимпорт на другую СУРБД, мы можем пропустить шаг восстановления инструкции create table (мы не нашли эквивалент MSSQLSERVER show create table и сделали что-то еще).

Чтобы сбросить таблицу, мы просто вызвали клиента isql. Если вы находитесь на Windows, вы можете использовать native MSSQLSERVER client

echo "select * from $table" | isql -b -q -d\|  $schema $username $p/w > /tmp/$table.csv 

Это дамп с помощью трубы (|), а не запятые, так как у нас было много запятых в свободных текстовых данных. Он также цитирует инкапсулированные строковые поля. Я думаю, что я также отредактировал источник для isql (поскольку он был открытым исходным кодом и блестящим для этой работы), чтобы избежать встроенных кавычек в строковых типах (я должен был сделать это для наших источников Oracle тоже), чтобы упростить загрузку в MySQL.

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

Состояние было удобством для клиента всей этой услуги. То, что мы узнали, что вы должны подготовить для них выдать начала с последующим занятомом циклом позже статус (от 20 & 200 в секунду!) До пятнадцать минут до трех часов, когда состояние возвращается простой с последующим клиент, выдавший стоп (убедитесь, что вы не являетесь оператором a stop на простоя экстракт). Мы просто добавили спать в статус сервис, поскольку было слишком сложно убедить клиента изменить свою логику.

Это было для центрального правительственного агентства, клиент выше был одним из наших аутсорсинговых поставщиков ИТ-услуг. Эта экосистема была (есть!) Работает против около полудюжины источников, включая Oracle, MSSQLSERVER и SESAM.

Смежные вопросы