2009-12-02 5 views
2

Мы используем ось 2 для создания наших веб-сервисов и сервера Jboss для выполнения логики всех наших приложений. Нам было предложено создать веб-сервис, который связывается с компонентом, который может занять до 1 часа ответа (в зависимости от размера запроса), поэтому мы не сможем поддерживать связь с потребителями, открытыми в течение этого времени.Долгосрочная архитектура webservice

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

Вопросы у меня есть:

  1. Как я запрашиваю статус компонента на сервере JBoss, как только я вернулся из метода сервиса, который создал этот компонент. Нужно ли использовать фасоль с натуральным выражением?
  2. Могу ли я использовать фасоль с состоянием, если я хочу выполнять асинхронные вызовы со стороны webservice?

ответ

1

Я не думаю, что готовые сеансовые компоненты являются ответом на вашу проблему, они предназначены для длительных сеансов общения, что не является вашим сценарием.

Моя рекомендация будет использовать пул потоков Java5 стиле ExecutorService, созданный с использованием класса Executors фабрики:

  1. Когда сервер веб-службы инициализации, создать ExecutorService экземпляр.
  2. Входит вызов веб-службы, обработчик создает экземпляр Callable. Метод Callable.call() сделал бы фактический вызов для бизнес-логики в любой форме.
  3. Этот Callable передан ExecutorService.submit(), который немедленно возвращает объект Future, представляющий конечный результат вызова. Executor начнет ссылаться на ваш Callable в отдельной теме.
  4. Создайте случайный токен, сохраните Future в Map с помощью токена в качестве ключа.
  5. Возвращает маркер для клиента веб-службы (шаги 1 до 4 должно произойти немедленно)
  6. Позже он клиент веб-службы делает еще один звонок с просьбой о результате, переходящие в маркере
  7. Сервер просматривает Future используя токен, и вызывает get() на Future со значением тайм-аута, так что он ждет только короткого времени для ответа. Вызов get() возвращает результат выполнения любого вызываемого Callable.
    • Если ответ имеется, верните его клиенту и удалите Future с карты.
    • В противном случае скажите клиенту вернуться позже.

Это довольно надежный подход. Вы даже можете настроить ExecutorService, чтобы ограничить количество вызовов, которые могут выполняться одновременно, если вы этого желаете.

+0

Кажется, что новая тема создается, когда я использую этот интерфейс. Я попытался создать простой Thread, а также попробовать Timer, а затем я столкнулся с другой проблемой. Когда дочерний поток выполняется, он, похоже, не имеет доступа к типам данных, определенным в файле .aar. Ни один из моих пользовательских типов данных не распознается, и я должен был поместить их в отдельную банку в папку tomcat lib, чтобы она работала. Я предполагаю, что то же самое произойдет здесь ... Знаете ли вы, есть ли способ обойти это, поэтому мне не нужно класть эту банку в каталог tomcat lib? Спасибо – poijoi

+0

Также как сохранить маркер на карте? Объект умрет, когда метод вернет ответ клиенту webservice ... нет? – poijoi

3

Другой подход, который вы могли бы предпринять, - использовать JMS и DB.

Процесс будет

  1. В вызове веб-сервиса, поместить сообщение на JMS Queue
  2. вставить запись в таблицу БД и возвращает уникальный идентификатор для этой записи клиенту
  3. в MDB, который прослушивает в очередь, вызовите боб
  4. Когда боб возвращается, обновить запись БД с «Done» статусом
  5. Когда клиент обращается к статусу, прочитать запись DB, возвращение «Не Done "или" Готово " в ожидании записи.
  6. Когда клиент звонит и запись указывает на «Done», возвращение «Done» и удалить запись

Этот процесс немного тяжелее на использование ресурсов, но имеет некоторые преимущества

  • Прочный JMS Queue будет возвращать, если ваш метод компонента генерирует исключение
  • Длительная JMS Queue будет возвращать, если ваш сервер перезагружается
  • используя таблицу БД вместо некоторых статических данных, вы можете поддержать кластерный или загрузить БАЛ связанная среда