2013-02-19 2 views
1

Я динамически загружаю приложение Erlang в систему на основе конфигурационного файла, который заставляет меня запускать распределенное приложение во время загрузки - я могу заставить отказоустойчивость работать, но не отказываться (или в терминах OTP, поглощение.)Приобретение распределенного приложения OTP

Скажем, у меня есть приложение NodeA, а NodeB - узел отказоустойчивости. Я вытаскиваю шнур на NodeA, и приложение переносится в NodeB. Это ожидается. Но когда я принесу обратно онлайн узла А и попытаться вызвать application:start(MyApp) я получаю:

{error, {shutdown,{myapp, start, [normal,["config.xml"]]}}} что свидетельствует о приложении неисправного для запуска.

Неважно, он не запускается, потому что у меня уже есть надзиратели, работающие на другом узле NodeB, и я net_adm: ping'ed их вместе.

Я бы предположил, что могу вызвать приложение: takeover/2 на MyApp, чтобы получить управление обратно от узла и убить приложение на другом узле.

{error,{not_running_distributed, MyApp}}

Но это не работает. Список приоритетов для моего узла - [NodeA, {NodeB, NodeC}], поэтому я думаю, что приложение будет знать, что он перейдет на узел с более высоким приоритетом после онлайн-подключения.

Как я могу реализовать захват в этом сценарии?

+0

Кроме того, этот первый ответ http://stackoverflow.com/questions/6402873/erlang-distributed-application-strange-behaviour?rq=1 утверждает, что распределенные приложения работают только как часть выпуска ... но мой переход на другой ресурс работает, а не отката! – batman

+0

Почему вы используете файл XML для своей конфигурации? Я уверен, что вы можете перевести его в конфигурацию стиля erlang, что позволит вам запустить его во время загрузки. Кроме того, XML ужасен. –

+0

Интеграция с сторонними компонентами ... XMerl работает просто отлично, но вполне функционально. – batman

ответ

0

Вместо этого вам может потребоваться использовать application:takeover/2.

Смежные вопросы