Перезапустите java.exe из апплета

У меня есть апплет, упакованный с третьей частью DLL (от JTwain). Мой апплет сканирует документы с TWAIN-совместимого принтера по умолчанию. Апплет терпит неудачу на застревании бумаги и не восстанавливается. Пользователь уходит со страницы и апплет уничтожается. При возврате на страницу снова происходит сбой. Закрытие браузера (который убивает процесс java.exe на компьютере), а затем возврат на страницу устраняет проблему, и все работает.

Я хочу перезапустить все, не требуя, чтобы пользователи закрыли браузер. Я добавил строку запроса GUID к URL-адресам, с которых загружаются ресурсы апплета - так что я знаю, что ничего не кэшируется. Я проверил в диспетчере задач Windows, и нет никакого процесса, созданного DLL, все это происходит в основном процессе java.exe. Я попытался обернуть процесс сканирования в поток, чтобы я мог прервать его в методах остановки или уничтожения (на случай, если поток апплетов не был остановлен при уничтожении апплета), но это не сработало.

Любое предложение будет с благодарностью. В идеале я хотел бы каким-то образом перезапустить Java, когда апплет выгружается (но я сомневаюсь, что это возможно).

ОБНОВИТЬ

Я потратил пару дней, пытаясь определить причину сбоя апплета. Я до сих пор не знаю:(

Когда происходит замятие бумаги (не мой код), выдает пару всплывающих окон. Первый предупреждает пользователя о замятии и может быть закрыт нажатием кнопки ОК. Второй говорит "чтение с устройства" и зависает. Его нельзя закрыть красным окном, значком в верхнем углу - я убиваю его из диспетчера задач, и Windows просит отправить отчет о "неотвечающей программе". Я предполагаю, что эти всплывающие окна создаются DLL. И учитывая, что второе зависание, я предполагаю, что поток, запущенный dll, завис, сохраняя блокировку какого-либо компонента приложения TWAIN. я получил

com.asprise.util.jtwain.JTwainException: Failed to open the specified data source:
    Source: TW-Brother MFC-9970CDW LAN Thrown

... когда я пытаюсь получить доступ к сканеру.

Я немного растерялся, узнав, как получить больше информации. Я тестирую свой апплет на виртуальном ПК с Windows (чтобы использовать ie7), и у меня нет способа пошаговой отладки в этой среде. (И он падает на сторонний код, для которого у меня все равно нет исходного кода)

1 ответ

Решение

Я вижу только два практических варианта здесь:

  1. Используйте API, который справляется с застреванием бумаги без проблем. Конечно, это легко сказать (получить надежный API), труднее найти.
  2. Запустите приложение. свободное плавание с использованием Java Web Start. Если он зависает, пользователь может убить его и щелкнуть ссылку для другого экземпляра в новой JVM. Или апплет может также вызвать BasicService.showDocument(URLof.jnlp) если он может обнаружить проблему с DLL и сам не заморожен.

Конечно, вы также должны сообщить об ошибке разработчикам..Asprise(?). Оптимальным решением было бы решение проблемы в ее источнике. Все, что мы здесь делаем, является "обходным путем".

Другие вопросы по тегам