2012-06-06 1 views
0

У меня есть проблема, которую трудно объяснить, так позволяет начать работу:Перехватив метод приложения TOMCAT с АОП

Контекст: У меня есть приложение, работающее на сервере Tomcat Назовём его «админ». Администратор имеет функцию импорта/экспорта. Наше собственное приложение является дополнением к этому, и нам нужно собрать некоторую информацию, когда «admin apps» используют функцию импорта/экспорта.

Задача: Там находится сторонняя банка, содержащая класс ImportController: ~/someFolder/admin/WEB-INF/lib/admin.jar. Цель состоит в том, чтобы собрать старый идентификатор проекта и новый идентификатор проекта, чтобы наше расширение могло связать наш класс с правильным проектом. Поскольку я знаю подпись метода, хотя я мог бы использовать AOP для этого.

Идея: Идея, с которой я пришел, состоит в том, чтобы положить что-то наподобие idHiJacker.jar, которое содержало бы один pointcut и совет в ~/someFolder/admin/WEB-INF/lib/ и включало бы временное плетение. Этот совет просто помещает информацию в XML-файл, поэтому наше расширение сможет прочитать его, когда мы захотим вернуть ссылку после импорта проекта.

Также я должен сказать, что я чистый новичок с АОП и веб-материалами. Но я не хочу импортировать монстра для выполнения этой небольшой операции с АОП. В настоящий момент чтения им на AspectJ и AspectWerkz

Вопрос:

  • 1) Могу ли я в правильном направлении? Вы видите что-нибудь, что могло бы заставить эту идею не работать вообще?
  • 2) Если это возможно, что было бы хорошей практикой сделать это очень чистым способом?
  • 3) Должен ли я сделать это с AspectJ? AspectWerkz? Или что-то другое?
  • 4) Я делаю это зря? Есть ли более простой способ сделать эту операцию?

Edit: Кроме того, если у вас есть хороший учебник, чтобы связать с ответом, это было бы удивительным

Спасибо за ваше время и ответить

ответ

1

Вопрос:

1) Am I in the right direction? Do you see anything that would make this idea not work at all? 

Я не вижу никаких причин, почему это не будет работать. Aspect Oriented Programming и cross-cutting касается, кроме того, понятие advice заключается в том, чтобы выполнять некоторые до или после некоторого другого pointcut и часто влиять на поведение этой рекомендуемой функции. Вы делаете именно это.

2) If this is possible what would be the good practice to do it in a very clean manner? 

Существует некоторый присущий хаос с аспекты/советы - поскольку поток управления угнали более простое последовательное чтение кода необходимо, чтобы понять, что происходит.

3) Should i do it with AspectJ? AspectWerkz? Or Something else? 

Я никогда не использовал AspectWerkz, но у меня есть очень хороший опыт работы с AspectJ; особенно с точки зрения поддержки здесь в stackoverflow и, возможно, даже больше в его списке рассылки.

4) Am i doing this for nothing? Is there an easier way to do that operation? 

Если вы не можете изменить код контроллера импорта или изменить клиент, чтобы сделать дополнительные вызовы для выполнения этой связывающей вещи этого подход, основанный на перехвате кажется, лучше ИМХО.

+0

Спасибо за ответ. Проблема у меня есть, это довольно сложно ввести АОП. Я только заметил, что «сервер приложений администратора» запущен со сложным сценарием bash. Поэтому сначала я должен выяснить, как включить время загрузки во времени – drgn

+0

@ drgn ltw не очень сложно. Большая проблема будет заключаться в том, чтобы выяснить, как изменить скрипт, чтобы добавить агента и дополнительную банку. Другой альтернативой является использование времени компиляции для инструментария существующих классов и замены развернутой банки с помощью инструментальной банки. Не знаете, как это работает, если банк подписан. –

+0

После помещения простого aop.xml в WEB-INF, мою банку, которая содержит только аспект (экспортируется из банка eclipse с поддержкой aspectJ), а также добавление javaagent (предыдущий комментарий), это не работает. Проблема в том, что у меня нет сообщения об ошибке, и я поместил опцию verbose в aop.xml, но у меня нет сообщения от ткача. Я должен делать что-то неправильно. – drgn

0

У меня есть предложение для более простого решения - использовать шаблон декоратора оберните вокруг стороннего ImportController, добавьте свою функциональность до вызова библиотеки сторонних разработчиков. Вы должны иметь возможность сделать это, поскольку у вас, похоже, есть доступ к приложению администратора.

Это по существу делает то, что делает АОП, но использует код. Ваш подход, использующий загрузчик времени загрузки, также должен работать, но, на мой взгляд, сложный - если вы абсолютно планируете идти этим путем, используйте AspectJ.

+1

Как OP введет украшенный 'ImportController' в стороннее приложение? –

+0

Это не плохая идея, я буду помнить это как вторичное решение, так как «админ-приложения» запускаются со сложным сценарием bash, и я, возможно, не смогу успешно использовать время загрузки. Спасибо за эту хорошую идею. – drgn