Я динамически загружаю приложение 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}]
, поэтому я думаю, что приложение будет знать, что он перейдет на узел с более высоким приоритетом после онлайн-подключения.
Как я могу реализовать захват в этом сценарии?
Кроме того, этот первый ответ http://stackoverflow.com/questions/6402873/erlang-distributed-application-strange-behaviour?rq=1 утверждает, что распределенные приложения работают только как часть выпуска ... но мой переход на другой ресурс работает, а не отката! – batman
Почему вы используете файл XML для своей конфигурации? Я уверен, что вы можете перевести его в конфигурацию стиля erlang, что позволит вам запустить его во время загрузки. Кроме того, XML ужасен. –
Интеграция с сторонними компонентами ... XMerl работает просто отлично, но вполне функционально. – batman