Как создать глобальные переменные в Erlang

Я пишу ejabberd модуль для фильтрации пакетов. Я должен заставить имя хоста вытягивать некоторое использование конфигураций gen_mod:get_module_opt().

У меня есть 4 важных функции:

  1. start(Host, _Opt) : Это - функция ejabberd для загрузки моего модуля. Я добираюсь Host атом здесь
  2. filter_packet({From, To, XML}): Это - мой рычаг фильтра пакетов. Я не могу передать пользовательские параметрические усилители этой функции, поскольку это - рычаг в ejabberd.
  3. get_translation(XmlData): filter_packet() вызовы get_translation() в цикле
  4. fetch_translation(XmlData): названный рекурсивно от get_translation(). Это - то, где я звоню gen_mod:get_module_opt(), и следовательно потребность Host.

Мой вопрос, как я могу взять Host от start() и помещенный это в глобальную переменную, так, чтобы fetch_translation может получить доступ к нему?

15
задан ymn 12 April 2013 в 07:33
поделиться

4 ответа

Самый "простой способ" - создать именованную таблицу 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 может предоставить средства для того, что вы хотите, но я не могу вам в этом помочь.

9
ответ дан 1 December 2019 в 03:24
поделиться

Вы можете начать новый процесс фильтрации сообщений и зарегистрировать его с помощью 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.
1
ответ дан 1 December 2019 в 03:24
поделиться
#define MYASSERT(condition) \
  if (!(condition)) { return; }

MYASSERT(condition);

Если вам нужно что-то более привлекательное, вы можете использовать cuPrintf () , который доступен на сайте CUDA для зарегистрированных разработчиков.

-121--3802350-

Начиная с 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 может быть вашим хостом.

1
ответ дан 1 December 2019 в 03:24
поделиться

угадывая для своего описания, чем вы находитесь в однодоменном развертывании ejabberd (без виртуальных хостов),

yo может получить локальный XMPP домен с помощью макроса ?MYNAME (см. определение в ejabberd.hrl).

1
ответ дан 1 December 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: