我已阅读此文档https://doc.akka.io/docs/akka/current/general/message-delivery-reliability.html#dead-letters,其中说:
演员可以订阅事件流上的 akka.actor.DeadLetter 类,请参阅事件流了解如何做到这一点。
在事件流文档:https : //doc.akka.io/docs/akka/current/event-bus.html#event-stream 中,示例代码似乎与经典 Akka 有关,而包akka.actor.ActorSystem不是akka.actor.typed.ActorSystem:
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
final ActorSystem system = ActorSystem.create("DeadLetters");
final ActorRef actor = system.actorOf(Props.create(DeadLetterActor.class));
system.getEventStream().subscribe(actor, DeadLetter.class);
Run Code Online (Sandbox Code Playgroud)
但是在 Akka Typed 中,没有subscribe()在akka.actor.typed.ActorSystem.eventStream().
我在我的Ubuntu上安装了leiningen,但是当我运行时它会抛出"Connection refused"错误lein repl.这是错误:
$ lein repl
Exception in thread "Thread-4" java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at clojure.tools.nrepl$connect.doInvoke(nrepl.clj:184)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.tools.nrepl.ack$send_ack.invoke(ack.clj:47)
at clojure.tools.nrepl.server$start_server.doInvoke(server.clj:146)
at clojure.lang.RestFn.invoke(RestFn.java:619)
at user$eval540.invoke(NO_SOURCE_FILE:0)
at clojure.lang.Compiler.eval(Compiler.java:6619)
at clojure.lang.Compiler.eval(Compiler.java:6609)
at clojure.lang.Compiler.eval(Compiler.java:6582)
at clojure.core$eval.invoke(core.clj:2852)
at leiningen.core.eval$fn__3577.invoke(eval.clj:304)
at clojure.lang.MultiFn.invoke(MultiFn.java:231)
at leiningen.core.eval$eval_in_project.invoke(eval.clj:326)
at clojure.lang.AFn.applyToHelper(AFn.java:167)
at clojure.lang.AFn.applyTo(AFn.java:151)
at clojure.core$apply.invoke(core.clj:619)
at leiningen.repl$server$fn__7443.invoke(repl.clj:201)
at clojure.lang.AFn.applyToHelper(AFn.java:159)
at clojure.lang.AFn.applyTo(AFn.java:151)
at clojure.core$apply.invoke(core.clj:617)
at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1788)
at clojure.lang.RestFn.invoke(RestFn.java:425) …Run Code Online (Sandbox Code Playgroud) mydata是关于使用的名称和性别:
(def mydata [["a" 'f] ["b" 'm]])
Run Code Online (Sandbox Code Playgroud)
我想要的是:
(group-by #(let [[name gender] %1] name) mydata)
; {"a" [["a" f]], "b" [["b" m]]}
Run Code Online (Sandbox Code Playgroud)
并且:
(group-by #(let [[name gender] %1] gender) mydata)
; {f [["a" f]], m [["b" m]]}
Run Code Online (Sandbox Code Playgroud)
所以我想构建一个这样的函数:
(defn my-group-by [data, field]
(group-by #(let [[name gender] %1] field) mydata))
Run Code Online (Sandbox Code Playgroud)
但它出错了
(mygroup-by mydata 'name)
; {name [["a" :F] ["b" :M]]}
Run Code Online (Sandbox Code Playgroud)
然后我认为宏可以做到这一点
(defmacro my-macro [data field]
`(group-by #(let [[name,gender] %1] ~field) ~data))
Run Code Online (Sandbox Code Playgroud)
然后我跑了
(my-macro mydata name)
; CompilerException java.lang.RuntimeException: Can't let qualified …Run Code Online (Sandbox Code Playgroud) clojure ×2
actor ×1
actorsystem ×1
akka ×1
akka-typed ×1
dead-letter ×1
leiningen ×1
macros ×1