ejabberd符合Riak,它已经在Riak中存储数据包。例如,mod_offline
这样做。
您可以直接在ejabberd代码中找到如何做到这一点。例如,在mod_offline
,这里是如何ejabberd店离线消息:
store_offline_msg(Host, {User, _}, Msgs, Len, MaxOfflineMsgs,
riak) ->
Count = if MaxOfflineMsgs =/= infinity ->
Len + count_offline_messages(User, Host);
true -> 0
end,
if
Count > MaxOfflineMsgs ->
discard_warn_sender(Msgs);
true ->
lists:foreach(
fun(#offline_msg{us = US,
timestamp = TS} = M) ->
ejabberd_riak:put(M, offline_msg_schema(),
[{i, TS}, {'2i', [{<<"us">>, US}]}])
end, Msgs)
end.
的ejabberd_riak:put/3
的代码是:
put(Rec, RecSchema, IndexInfo) ->
Key = encode_key(proplists:get_value(i, IndexInfo, element(2, Rec))),
SecIdxs = [encode_index_key(K, V) ||
{K, V} <- proplists:get_value('2i', IndexInfo, [])],
Table = element(1, Rec),
Value = encode_record(Rec, RecSchema),
case put_raw(Table, Key, Value, SecIdxs) of
ok ->
ok;
{error, _} = Error ->
log_error(Error, put, [{record, Rec},
{index_info, IndexInfo}]),
Error
end.
put_raw(Table, Key, Value, Indexes) ->
Bucket = make_bucket(Table),
Obj = riakc_obj:new(Bucket, Key, Value, "application/x-erlang-term"),
Obj1 = if Indexes /= [] ->
MetaData = dict:store(<<"index">>, Indexes, dict:new()),
riakc_obj:update_metadata(Obj, MetaData);
true ->
Obj
end,
catch riakc_pb_socket:put(get_random_pid(), Obj1).
您应该已经正确的API做你想做的事,ejabberd有关Riak数据包存储。
这个数据包可能已经在ejabberd中处理它们的地方被解析了。 –
嗨@MickaëlRémond - 抱歉不明白 - 你的意思是说我应该利用xml模块从ejabberd数据包中提取数据点?当我在offline_message_hook上打印数据包时,我得到了类似于下面的内容 - 所以我相信我确实需要将它放在双引号中(如何?),然后放在Riak上,否则我应该使用xml解析器来提取/将数据保存在某个结构中? – vikram17000
'{xmlel,<<"message">>,{{<<"type">>,<<"chat">>},{<<"id">>,<<“purplefe7f4130”>>},{<<"to">>,<<“[email protected]”>>} ],[{xmlel,<<"active">>,[<< http://jabber.org/protocol/chatstates >> >>}],[]},{xmlel,<<"body">>,[],[{xmlcdata ,<<“我的短信”>>}]}]}' – vikram17000