Как мне запустить более одного экземпляра веб-машины в приложении erlang?
Я пытаюсь создать два экземпляра веб-машины в одном приложении Erlang. Каждый экземпляр должен работать на своем порте и имеет свою особую конфигурацию. Следуя документации по веб-машине, я добавил следующие процессы, которые должны быть запущены в моей спецификации супервизора (application_sup.erl):
{
webmachine_instance_1,
{ webmachine_mochiweb, start,
[
[
{ ip, "0.0.0.0"},
{ port, 8000},
{ dispatch, [ {["*"], file_resource, []} ] }
]
]
},
permanent,
5000,
worker,
dynamic
},
{
webmachine_instance_2,
{ webmachine_mochiweb, start,
[
[
{ ip, "0.0.0.0"},
{ port, 8080},
{ dispatch, [ {["*"], file_resource, []} ] }
]
]
},
permanent,
5000,
worker,
dynamic
}
Когда я включаю оба экземпляра, я получаю ошибку запуска и не могу запустить мое приложение erlang. После простой попытки запустить приложение с одним экземпляром webmachine (webmachine_instance_1 ИЛИ webmachine_instance_2) мое приложение запускается нормально.
Вот конкретная ошибка:
=PROGRESS REPORT==== 11-Mar-2014::17:00:31 ===
supervisor: {local, application_sup}
started: [{pid,<0.230.0>},
{name,webmachine_instance_1},
{mfargs,
{webmachine_mochiweb,start,
[[{ip,"0.0.0.0"},
{port,8000},
{dispatch, [{['*'],
file_resource,
[]
}]}]
]
}
},
{restart_type,permanent},
{shutdown,5000},
{child_type,worker}]
=SUPERVISOR REPORT==== 11-Mar-2014::17:00:31 ===
Supervisor: {local, application_sup}
Context: start_error
Reason: {'EXIT',
{undef,
[{webmachine_mochiweb,start,
[{ip,"0.0.0.0"},
{port,8080},
{dispatch,[{["*"],file_resource,[]}]}],
[]},
{supervisor,do_start_child,2,
[{file,"supervisor.erl"},{line,303}]},
{supervisor,start_children,3,
[{file,"supervisor.erl"},{line,287}]},
{supervisor,init_children,2,
[{file,"supervisor.erl"},{line,253}]},
{gen_server,init_it,6,
[{file,"gen_server.erl"},{line,304}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]}}
Offender: [{pid,undefined},
{name,webmachine_instance_2},
{mfargs,
{webmachine_mochiweb,start,
[{ip,"0.0.0.0"},
{port,8080},
{dispatch,[{["*"],file_resource,[]}]}]}},
{restart_type,permanent},
{shutdown,5000},
{child_type,worker}]
Я довольно новичок в Erlang и, возможно, не совсем понимаю основные проблемы здесь - в соответствии с документом webmachine, мы должны иметь возможность запустить два экземпляра одного и того же приложения, но с разными конфигурациями в приложении erlang.
Спасибо за любую помощь / обсуждение по этому вопросу!
1 ответ
Конфигурация вашего дочернего процесса должна иметь следующую форму:
{Name,
{webmachine_mochiweb, start, [WebConfig]},
permanent, 5000, worker, [mochiweb_socket_server]}
где Name
а также WebConfig
должен быть уникальным для вашего экземпляра веб-машины. WebConfig
часть должна включать name
а также dispatch_group
свойства. Например:
WebConfig = [{name,instance1},
{dispatch_group,instance1},
{ip, Ip},
{port, Port},
{log_dir, "priv/log"},
{dispatch, Dispatch}],
Таким образом, для нескольких случаев у вас может быть что-то подобное для вашей спецификации супервизора:
WebConfig1 = [{name,instance1},
{dispatch_group,instance1},
{ip, Ip},
{port, Port},
{log_dir, "priv/log"},
{dispatch, Dispatch}],
WebConfig2 = [{name,instance2},
{dispatch_group,instance2},
{ip, Ip},
{port, Port+1},
{log_dir, "priv/log"},
{dispatch, Dispatch}],
Web1 = {instance1,
{webmachine_mochiweb, start, [WebConfig1]},
permanent, 5000, worker, [mochiweb_socket_server]},
Web2 = {instance2,
{webmachine_mochiweb, start, [WebConfig2]},
permanent, 5000, worker, [mochiweb_socket_server]},
Processes = [Web1, Web2],
{ok, { {one_for_one, 10, 10}, Processes} }.
Еще одна вещь: судя по названию application_sup
появляется в вашем вопросе, возможно, вы запустили веб-машину ./scripts/new_webmachine.sh
и указал имя приложения как application
, Если так, не делайте этого, так как application
это имя ключевого OTP-модуля Erlang, и ваш код будет конфликтовать с ним и вызывать всевозможные проблемы.