Я пишу ejabberd модуль для фильтрации пакетов. Я должен заставить имя хоста вытягивать некоторое использование конфигураций gen_mod:get_module_opt()
.
У меня есть 4 важных функции:
start(Host, _Opt)
: Это - функция ejabberd для загрузки моего модуля. Я добираюсь Host
атом здесьfilter_packet({From, To, XML})
: Это - мой рычаг фильтра пакетов. Я не могу передать пользовательские параметрические усилители этой функции, поскольку это - рычаг в ejabberd.get_translation(XmlData)
: filter_packet()
вызовы get_translation()
в циклеfetch_translation(XmlData)
: названный рекурсивно от get_translation()
. Это - то, где я звоню gen_mod:get_module_opt()
, и следовательно потребность Host
.Мой вопрос, как я могу взять Host
от start()
и помещенный это в глобальную переменную, так, чтобы fetch_translation
может получить доступ к нему?
Самый "простой способ" - создать именованную таблицу ets и поместить ее туда.
start(Host, _Opt) ->
ets:new(my_table, [named_table, protected, set, {keypos, 1}]),
ets:insert(my_table, {host, Host}),
...
fetch_translation(XmlData) ->
[{_, Host}] = ets:lookup(my_table, host),
...
Обратите внимание, что это "общее" решение. Ejabberd может предоставить средства для того, что вы хотите, но я не могу вам в этом помочь.
Вы можете начать новый процесс фильтрации сообщений и зарегистрировать его с помощью Erlang: Регистрация / 2
, затем маршрут все Filter_packet / 1
через него (A потенциальное узкое место).
-define(?SERVER, msg_filter).
start(Host, Opt) ->
{ok, Pid} = spawn(?MODULE, filter_loop, [Host, Opt]),
register(?SERVER, Pid).
filter_loop(Host, Opt) ->
receive
{Pid, filter_packet, {_From, _To, XML}} ->
Trans = get_translation(XML, Host),
Pid ! {?SERVER, translation, Trans},
filter_loop(Host, Opt)
end.
filter_packet(Pack) ->
?SERVER ! {self(), filter_packet, Pack}
receive
{?SERVER, translation, Trans} ->
% wrap translation
UpdatedPacket
end.
#define MYASSERT(condition) \
if (!(condition)) { return; }
MYASSERT(condition);
Если вам нужно что-то более привлекательное, вы можете использовать cuPrintf ()
, который доступен на сайте CUDA для зарегистрированных разработчиков.
Начиная с SQL Server 2005, можно предоставлять собственные веб-службы XML непосредственно из базы данных.
SQL Server можно настроить для прослушивания просить HTTP SOAP через конечную точку HTTP. Как правило, необходимо представить хранимые процедуры или пользовательские функции в качестве конечных точек HTTP, поэтому требуется небольшое кодирование. Но это должно быть очень легко следовать из примеров.
Вы обычно начинаете с создания хранимой процедуры следующим образом:
CREATE PROCEDURE [dbo].[getContact]
@ID [int]
AS
BEGIN
SELECT * FROM [AdventureWorks].[Person].[Contact] WHERE ContactID = @ID
END;
А затем определяете конечную точку HTTP так:
CREATE ENDPOINT SQLEP_GetContact
STATE = STARTED
AS HTTP
(
PATH = '/Contact',
AUTHENTICATION = (INTEGRATED),
PORTS = (CLEAR),
SITE = 'localhost'
)
FOR SOAP
(
WEBMETHOD 'ContactInfo' (NAME='AdventureWorks.dbo.getContact'),
BATCHES = DISABLED,
WSDL = DEFAULT,
DATABASE = 'AdventureWorks',
NAMESPACE = 'http://AdventureWorks/Contact'
);
После создания конечной точки вы можете отправить HTTP-запрос на сервер, чтобы убедиться, что конечная точка отвечает: http ://localhost/Contact? wsdl
.
Для изменения или остановки оконечного устройства используется команда ALTER ENDPOINT
:
ALTER ENDPOINT SQLEP_GetContact
STATE = STOPPED;
Вы можете продолжить, ознакомившись со следующими статьями:
UPDATE: После приведенного ниже комментария Ed Harper обратите внимание, что собственные веб-службы XML устарели в SQL Server 2008 (ноябрь 2009), и эта функция будет удалена в будущей версии SQL Server. Корпорация Майкрософт предлагает использовать вместо этого веб-службы WCF. Источник: MSDN - собственные веб-службы XML: устарел в SQL Server 2008
-121--2319033-Предположим, что вы фильтруете входящие пакеты, тогда на # jid.lserver может быть вашим хостом.
угадывая для своего описания, чем вы находитесь в однодоменном развертывании ejabberd (без виртуальных хостов),
yo может получить локальный XMPP домен с помощью макроса ?MYNAME (см. определение в ejabberd.hrl).