是否有一个与 RabbitMQ 无关的 Erlang AMQP客户端库?
我知道rabbitmq-erlang-client,但我想要一些更解耦的东西......在为Debian存储库打包这些东西,安装等时很痛苦......
假设我有一个主管,我需要start_child为这个主管执行一些。我必须先启动所有启动我的主管吗?或者我可以supervisor:start_child(my_sup,[])不启动 my_sup 吗?
Dialyzer 不会发出此函数返回类型不一致的信号:
-spec myfun(integer()) -> zero | one.
myfun(0) -> zero;
myfun(1) -> one;
myfun(2) -> other_number.
Run Code Online (Sandbox Code Playgroud)
但它在最后一行的情况下检测到
myfun(_) -> other_number.
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我相信以上应该是一个非常简单的案例。
谢谢
我两次引用相同的方法,但引用不同。看这个例子:
import java.util.function.Consumer;
public class MethodRefTest {
public static void main(String[] args) {
new MethodRefTest();
}
public MethodRefTest() {
Consumer<Integer> a = this::method;
System.out.println(a);
Consumer<Integer> b = this::method;
System.out.println(b);
}
public void method(Integer value) {
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
MethodRefTest$$Lambda$1/250421012@4c873330
MethodRefTest$$Lambda$2/295530567@776ec8df
Run Code Online (Sandbox Code Playgroud)
方法引用只不过是匿名类的语法糖吗?如果不是,我该怎么做才能始终获得相同的方法引用?(除了在字段中存储一次参考以供使用之外。)
(应用:我认为方法引用是观察者实现的一种更漂亮的方式。但是每次使用不同的引用,一旦添加观察者就不可能从可观察者中删除观察者。)
OTP 主管重启策略名称对我来说似乎很奇怪,可能是因为我的母语不是英语。
one_for_one:当一个孩子死亡时,它会重新启动该孩子one_for_all:当一个孩子死亡时,它会杀死所有其他孩子并按顺序重新启动它们rest_for_one:当一个孩子死亡时,它会杀死在该死亡孩子之后启动的所有孩子,并按顺序重新启动它们我试图通过将它们读作句子来理解这些策略名称,例如“重新启动one孩子for one的死亡”。
那么要么one_for_allorrest_for_one对我来说似乎是一个颠倒的名字。( "restart one child for all children's death"??)
为什么这些策略如此命名?
cf erlang 文档one_for_all部分有一个数字说“全对一监督”。这只是一个错字吗?
我们即将选择 Google Cloud Pub/Sub 作为我们的消息总线。一些消息需要在低延迟持续时间(例如小于 100-200 毫秒)内进行调度。
我在某处读到,在大量消息中,它表现良好,但对于每秒数百条消息等较少数量的消息,Pub/Sub 可能会产生高延迟。
在上一个问题中,主题也不清楚。从 2016 年开始,谷歌云发布/订阅延迟是多少。
是否有任何关于 Pub/Sub 延迟和与消息量关系的定义指标?
我正在尝试使用 Windows XP Home 中的 -sname 选项启动一个命名的 Erlang 节点,但是当我运行 erl 时,它会打印出一条我不明白的长错误消息,然后退出:
> erl -sname allyourcode
{error_logger,{{2009,5,25},{16,20,57}},"Protocol: ~p: register error: ~p~n",["in
et_tcp",{{badmatch,{error,econnrefused}},[{inet_tcp_dist,listen,1},{net_kernel,s
tart_protos,4},{net_kernel,start_protos,3},{net_kernel,init_node,2},{net_kernel,
init,1},{gen_server,init_it,6},{proc_lib,init_p_do_apply,3}]}]}
{error_logger,{{2009,5,25},{16,20,57}},crash_report,[[{initial_call,{net_kernel,
init,['Argument__1']}},{pid,},{registered_name,[]},{error_info,{exit,{er
ror,badarg},[{gen_server,init_it,6},{proc_lib,init_p_do_apply,3}]}},{ancestors,[
net_sup,kernel_sup,]},{messages,[]},{links,[#Port,]},{dicti
onary,[{longnames,false}]},{trap_exit,true},{status,running},{heap_size,610},{st
ack_size,24},{reductions,490}],[]]}
{error_logger,{{2009,5,25},{16,20,57}},supervisor_report,[{supervisor,{local,net
_sup}},{errorContext,start_error},{reason,{'EXIT',nodistribution}},{offender,[{p
id,undefined},{name,net_kernel},{mfa,{net_kernel,start_link,[[allyourcode,shortn
ames]]}},{restart_type,permanent},{shutdown,2000},{child_type,worker}]}]}
{error_logger,{{2009,5,25},{16,20,57}},supervisor_report,[{supervisor,{local,ker
nel_sup}},{errorContext,start_error},{reason,shutdown},{offender,[{pid,undefined
},{name,net_sup},{mfa,{erl_distribution,start_link,[]}},{restart_type,permanent}
,{shutdown,infinity},{child_type,supervisor}]}]}
{error_logger,{{2009,5,25},{16,20,57}},std_info,[{application,kernel},{exited,{s
hutdown,{kernel,start,[normal,[]]}}},{type,permanent}]}
{"Kernel pid terminated",application_controller,"{application_start_failure,kern
el,{shutdown,{kernel,start,[normal,[]]}}}"}
Crash dump was written to: erl_crash.dump
Kernel pid terminated (application_controller) ({application_start_failure,kernel,{shutdown,{kernel,start,[normal,[]]}}})
Run Code Online (Sandbox Code Playgroud)
我想包含 erl_crash.dump 文件,但我不知道这样做的好方法,因为它很长。
起初,我以为我遇到了防火墙问题,因为我第一次尝试这样做时,我的防火墙询问我是否会授予不同程序的权限,我做到了;然而,即使在禁用我的防火墙后,我仍然遇到同样的问题。
改用 -name 似乎也无济于事。
我正在尝试检查我在 MongoDB 中定义的所有索引是否正在被我的应用程序使用,并且没有额外的索引。我有一个实用程序可以为单个Eunit测试套件执行此操作。但是,我的一些组件有多个Eunit测试套件,我想知道是否有办法在调用任何测试套件之前运行通用代码,然后在所有测试套件完成后运行通用拆卸代码。我rebar用来调用Eunit.
提前致谢。
我正在使用epgsqlErlang 查询数据库。它返回字符串结果包括它们周围像这样引号:"what_was_in_the_row"。如何在处理结果之前删除这些引号?
我在文末读过一篇关于Erlang select receive机制的文章,有一个结论:“消息从邮箱移动到保存队列,然后在匹配的消息到达后返回到邮箱”。我已经尝试过文章中显示的示例,但无法得到相同的结果。这是我的代码,我的 erlang/otp 版本是 21。
shell1:
(aaa@HW0003727)1> register(shell, self()).
true
(aaa@HW0003727)2> shell ! c, shell ! d.
d
(aaa@HW0003727)3> process_info(whereis(shell),messages).
{messages,[c,d]}.
(aaa@HW0003727)4> receive a -> 1; b -> 2 end.
shell2:
(aaa@HW0003727)1> process_info(whereis(shell),messages).
{messages,[c,d]}
(aaa@HW0003727)2> process_info(whereis(shell)).
[{registered_name,shell},
{current_function,{prim_eval,'receive',2}},
{initial_call,{erlang,apply,2}},
{status,waiting},
{message_queue_len,2},
{links,[<0.113.0>]},
{dictionary,[]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.112.0>},
{total_heap_size,4212},
{heap_size,1598},
{stack_size,30},
{reductions,13906},
{garbage_collection,[{max_heap_size,#{error_logger => true,kill => true,size => 0}},
{min_bin_vheap_size,46422},
{min_heap_size,233},
{fullsweep_after,65535},
{minor_gcs,1}]},
{suspending,[]}]
Run Code Online (Sandbox Code Playgroud)
文章。