Как запустить серверный код из couchdb? - PullRequest
2 голосов
/ 12 августа 2010

Couchdb отлично справляется с хранением и обслуживанием данных, но у меня возникли некоторые проблемы, связанные с обработкой данных на нем. Например, GWT имеет встроенную поддержку синхронных и асинхронных обратных вызовов, которые позволяют запускать произвольный код Java на сервере. Есть ли способ сделать что-то подобное с couchdb?

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

  • Пользователь вводит некоторые данные
  • Пользователь нажимает кнопку генерации
  • Вызов на сервер, и PDF генерируется на стороне сервера. Код сервера может быть написан на любом языке, но предпочтительно на Java.
  • Когда генерация PDF завершена, пользователю предлагается загрузить и сохранить документ.

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

РЕДАКТИРОВАТЬ: Похоже, я довольно плохо объяснил свой вопрос. Что меня интересует, так это обслуживание сервлетов из Couchdb по аналогии с тем, как вы можете обслуживать сервлеты Java вдоль боковых веб-страниц из файла war. Я использовал GWT в качестве примера, потому что он поддерживает совместную разработку сервлетов и кода на стороне клиента и сборку всего в один файл war. Мне было бы очень интересно что-то подобное, потому что это сделало бы развертывание полнофункциональных веб-сайтов быстрым благодаря репликации Couchdb.

Судя по всему, ответ на мой вопрос - нет, вы не можете подавать сервлеты из couchdb. База данных настроена для взаимодействий в стиле CRUD, и любые компоненты стиля сервлета должны обслуживаться либо по отдельности, либо опрашиваться в базе данных на предмет изменений и действовать соответственно.

Ответы [ 2 ]

3 голосов
/ 16 августа 2010

Вот что я бы предложил в качестве основного рабочего процесса:

  1. Когда пользователь нажимает кнопку «Создать»: сериализуйте введенные данные и любые другие соответствующие метаданные (например, приоритет, имя пользователя) и отправьте их в couchdbкак новый документ.Отслеживайте _id документа.
  2. Кодируйте фоновый процесс, который отслеживает couchdb для документов, которые требуют обработки.
  3. Когда он видит такой документ, попросите его сгенерировать PDF и прикрепите его.на ту же самую кушетку док.
  4. Теперь вернемся к клиентской стороне.Вы можете использовать ajax-опрос, чтобы повторно получить ДОКУМЕНТ документ и проверить, есть ли у него вложение или нет.Если да, то вы можете показать пользователю ссылку для скачивания.

Конечно, дьявол кроется в деталях ...

Два способа, которыми ваши фоновые процессы могут идентифицироватьожидающие документы:

  • Используйте _changes API для отслеживания новых документов с _rev, начинающимся с "1 -"
  • Отправляйте запросы на просмотр couchdb, который только возвращаетдокументы, которые не имеют свойства _attachments.Когда нет документов для обработки, он ничего не вернет.
    • Опционально: если у вас есть несколько процессов создания PDF, работающих в очереди параллельно, вам нужно обновить документацию Couch с таким свойством, как {"being-processed":true} и отфильтровать их также.

Некоторые другие мысли:

  • Я не рекомендую использовать API внешнего интерфейса couchdb для этого варианта использования, поскольку это (в основном) означает couchdb и ваш код, генерирующий PDFдолжен быть на одной машине.Но это то, о чем нужно знать.
  • Я ничего не знаю о GWT, но это не кажется необходимым для достижения ваших целей.Конечно, CouchDB может обслуживать любые статические файлы (js или другие), которые вы хотите, либо как вложения в документы в БД, либо из файловой системы.Вы можете даже оценить свойства JSON (), которые вы поместили в документацию.Таким образом, вы можете использовать GWT для выполнения вызовов ajax или чего-то еще, но GWT может быть полностью отделен от couchdb.Может быть так проще.
1 голос
/ 12 августа 2010

GWT состоит из двух частей.Одним из них является клиент, который компилятор GWT переводит на Java, а другим - сервлет, если вы выполняете какой-либо RPC.Обычно вы запускаете свой клиентский код в браузере, а затем, когда вы делаете какие-либо вызовы RPC, вы обращаетесь к серверу Java Servlet Engine (например, Tomcat или Jetty или ...), который, в свою очередь, вызывает ваш уровень персистентности.

GWT имеет возможность делать запросы JSON по HTTP, и, по совпадению, это то, что использует CouchDB.Так что в теории это должно быть возможно.(Я не знаю, пробовал ли кто-нибудь это).Было бы несколько проблем.
CouchDB должен был бы обслуживать файлы .js, которые имеют скомпилированный код клиента GWT.
Основная проблема, которую я вижу в вашем случае, заключается в том, что couchDB должен будет генерировать ваши файлы PDFв то время как couchDB - это просто механизм хранения и обычно не выполняет никакой обработки.Я думаю, вы могли бы расширить его, если вы хорошо разбираетесь в языке программирования Erlang.

...