Изоляция ненадежного нативного кода в Java - PullRequest
4 голосов
/ 18 декабря 2010

У меня есть часть библиотеки C, которой я не доверяю (в том смысле, что она может часто падать). Я вызываю это из процесса Java.

Чтобы предотвратить сбой в библиотеке C, приносящей все приложение Java. вниз, я подумал, что будет лучше, если я создам выделенные процессы Java для этой библиотеки и позволю ей взаимодействовать с приложением Java. через программирование сокетов или RMI. Затем, если произойдет сбой, я могу просто создать еще один и продолжить обработку.

ProcessBuilder путь? Или есть еще более простые способы?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 18 декабря 2010

Я не знаю более простого способа.

Для взаимодействия между родителем и потомком я бы не использовал RMI или сокеты - я бы использовал стандартные дочерние потоки ввода и вывода,доступны через объект Process.Это просто, эффективно и приватно.Вы можете использовать потоки точно так же, как и сокеты потоков, но без учета идентификации, адресов, аутентификации и т. Д.Вы можете написать протокол самостоятельно или использовать что-то вроде Thrift или Protocol Buffers для создания протокола из определений сущностей.

2 голосов
/ 18 декабря 2010

Да, размещение собственного кода в отдельном Java-процессе - единственный способ защитить ваше приложение от собственного кода.

Что касается более простых способов, только незначительные различия в реализации. Например, не вызывая код из вашего Java-приложения и оборачивая нативный код в нативную оболочку, которая настроена на автоматический запуск. Это упростит решение, если у вас есть знания C и сокетов. При таком подходе RMI не будет лучшим выбором.

Даже если вы закроете нативный код в Java, я все равно не выберу RMI. Я столкнулся с сетевыми проблемами с Windows в глобальных сетях. Я хотел бы сохранить общение простым, если это возможно. Если данные слишком сложны, возможно, это базовая библиотека сериализации. Есть несколько вариантов, если вы идете по маршруту XML. Это излишне, но вы также можете встроить слой http-сервера и веб-сервисов. Я не знаю ваши системные требования, но

Восстановление создаст множество проблем. Если он перестает отвечать, вы просто запускаете другой процесс ... сколько раз вы готовы это сделать ... Управление процессами из Java оставляет желать лучшего.

0 голосов
/ 18 декабря 2010

Если производительность не является проблемой, и если есть вероятность того, что другие приложения столкнутся с вашим «нативным» сервисом, я бы выбрал RESTful или какой-то другой вид, ориентированный на веб-сервис. Что касается повторного появления сбоев, как уже упоминалось, просто порождайте процесс как службу, и вы должны быть в порядке.

Если ваше приложение является единственной сущностью, которая будет работать с этой нативной службой, то я бы предпочел пойти по пути RMI, а не по чисто сокетному пути. IMO, RMI является естественным подходом для межпроцессного взаимодействия (где процессы являются процессами Java). RMI имеет концепцию «активируемого» удаленного объекта, который будет естественным образом соответствовать вашим требованиям (автоматическое появление при сбое). Кроме того, если вы используете RMI, ваше приложение будет взаимодействовать с собственным процессом через четко определенные интерфейсы Java, а не с контрактами на специальные протоколы (что может быть достигнуто с помощью других высокоуровневых решений, таких как веб-сервисы, но реальная боль, когда дело касается необработанных сокетов) .

Кстати, JFTR, мы используем эту стратегию с нашим производственным приложением, и она работает довольно хорошо, YMMV. : -)

...