#java #coldfusion #javaloader
#java #coldfusion #javaloader
Вопрос:
Я пытаюсь использовать JavaLoader для загрузки класса java (HttpAsyncClient) в ColdFusion.
client = loader.create("org.apache.commons.HttpAsyncClient")
Как мы узнаем, что это за ссылка org.apache.commons.HttpAsyncClient
? Я подумал, что если вы откроете файл jar и будете следовать структуре каталогов, он предоставит вам ссылочный путь. Но я не думаю, что это правда.
Я пытаюсь использовать HttpAsyncClient, но не могу его загрузить:
client = loader.create("org.apache.commons.HttpAsyncClient")
возвращает ошибку class not found .
Loader — это ссылка на JavaLoader, который загружает классы Java на ваш CF-сервер.
Комментарии:
1. Пакеты Java должны следовать структуре каталогов.
org.apache.commons.httpclient
будет найден вorg/apache/commons/httpclient
каталоге.
Ответ №1:
Вместо того, чтобы изобретать велосипед, почему бы не попробовать существующий инструмент, такой как библиотека AsyncHTTP Марка Манделя?
Обновление: из комментариев следует, что этот инструмент предназначен только для ACF. Итак, вы можете попробовать использовать конкретный класс DefaultHttpAsyncClient
, как показано в примере асинхронного обмена HTTP.
Комментарии:
1. Я только что нашел это. На самом деле я сейчас читаю документы по нему. Я хочу передавать данные между двумя веб-сайтами. : D
2. некоторая дополнительная информация об этом. Он работает только на ACF и использует тот же http-движок, что и CF. Я говорил об этом с Марком, и он сказал, что вы могли бы просто использовать
cfthread
для достижения того же самого. Что я и сделал. Однако это ужасно медленно.3.О, извините. Вы не упомянули об использовании другого движка. Я не уверен, что так медленно. Но вы проверили API библиотеки, как я предложил? Пример асинхронного HTTP-обмена выглядит многообещающим. Он использует конкретную реализацию, называемую
DefaultHttpAsyncClient
hc.apache.org/httpcomponents-asyncclient-dev/examples.html4. Сейчас я собираюсь прочитать. В моих тестах реализация Railo выполняет около 5 запросов в секунду с использованием cfthread; мне нужно быть около 25 запросов в секунду. Если я правильно вас понял, указав мне на API, должен ли я перевести этот код в CF или написать оболочку CF, которая взаимодействует с ним? Для меня это новая территория. Может быть, пришло время изучать Java.
5. Да. Я бы перевел его на CF. Со всеми улучшениями cfscript он не сильно отличается от CF. И, к счастью, это всего лишь шесть (6) строк 😉 В этой статье есть несколько хороших советов по переводу coldfusionmuse.com/index.cfm/2009/2/23 /…
Ответ №2:
Я не знаю ColdFusion. Вероятно, вам нужно указать полный путь к классу, а не только пакет, содержащий класс.
В соответствии с примером, который я нашел, полный пакет и имя класса таковы: org.apache.http.nio.client.HttpAsyncClient
Вы также можете использовать javadoc, чтобы узнать имена пакетов и классов: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/index.html
Получение чего-то асинхронного с таким интерфейсом, вероятно, будет жестоким. Я бы предложил сначала попробовать версию синхронизации.
Редактировать
Я бы попробовал адаптировать этот пример синхронизации к CF: http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientWithResponseHandler.java
Когда вы создаете экземпляр HttpGet, вам нужно передать дополнительные параметры в init(), как это делается в этом примере: http://www.coldfusionjedi.com/index.cfm/2009/5/29/Generating-Speech-with-ColdFusion-and-Java
Комментарии:
1. вот и все. Это сделало это. Спасибо. Почему вы сказали, что это было бы жестоко? Я все время использую такие вещи, как AntiSamy и string.utils … хотя этот показался немного другим… путь был длиннее.
2. Обычно с асинхронным интерфейсом вам нужно создать свой собственный класс, который реализует их интерфейс, затем вы передаете экземпляр своего класса при инициировании вызова, и при возникновении событий вызывается ваш класс. Я не знаю, легко или сложно сделать все это с помощью ColdFusion или нет.
3. @Mohamad — С точки зрения path, этот класс ничем не отличается от любого другого. Полный путь может быть длинным или коротким. Все зависит от того, как автор (ы) решил организовать классы. Но вы всегда должны указывать полный путь .. что бы это ни было. (И технически файлы .class не обязательно упаковывать в jar, хотя это встречается гораздо реже).
4. @Leigh и @Sarel, спасибо. Оказывается, я, возможно, не смогу использовать это в конце концов. Я получаю
No matching Constructor for org.apache.http.nio.client.HttpAsyncClient() found
ответ всякий раз, когда я вызываю init() или start() для объекта клиента, который он создает)! Спасибо за помощь.5. Это потому, что это
interface
. Вы не можете создать его экземпляр. По сути, это просто схема. То же, что и CFinterface
. Как сказал Сарел, вы должны написать свою собственную реализацию, которая реализует этот интерфейс .. или найти библиотеку / класс, который уже это делает. Проверьте API. Но что вы пытаетесь сделать, чего вы не можете достичь с помощью простого CF-кода или существующего CF-инструмента? Потому что Марк Мандель выпустил асинхронный http-клиент много лет назад compoundtheory.com/?action=displayPostamp;ID=137 .