1
我一直在玩clojure,并一直在使用它来构建一个简单的小音频播放器。奇怪的是,有时候,可能有二十个,当联系服务器时,我会得到以下错误:compojure web项目中的堆栈溢出异常
2010-04-20 15:33:20.963::WARN: Error for /control
java.lang.StackOverflowError
at clojure.lang.RT.seq(RT.java:440)
at clojure.core$seq__4245.invoke(core.clj:105)
at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:440)
at clojure.core$seq__4245.invoke(core.clj:105)
at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:440)
at clojure.core$seq__4245.invoke(core.clj:105)
at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:440)
at clojure.core$seq__4245.invoke(core.clj:105)
at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:440)
...
如果我再做它,它会一直工作。所以它似乎与时间或某事有关。有问题的代码是:
(defn add-track [t]
(common/ref-add tracks t))
(defn add-collection [coll]
(doseq [track coll] (add-track track)))
和
(defn ref-add [ref value]
(dosync (ref-set ref (conj @ref value))))
其中科尔从该函数提取:
(defn tracks-by-album [album]
(sort sort-tracks (filter #(= (:album %) album) @tracks)))
它使用:
(defn get-album-from-track [track]
(seq/find-first #(= (:album track) (:name %)) @albums))
(defn sort-tracks [track1 track2]
(cond (= (:album track1) (:album track2))
(cond (and (:album-track track1) (:album-track track2))
(< (:album-track track1) (:album-track track2))
:else 0)
:else
(> (:year (get-album-from-track track1)) (:year (get-album-from-track track2)))))
它被称为多或更少直接从请求我得到:
(when-handle-command cmd params (audio/tracks-by-album decoded-name))
(defn when-handle-command [cmd params data]
(println (str "handling command:" cmd))
....)
我从来没有在我的日志得到调节指令,所以当它的曲目按专辑就一定会死。
因此,它似乎是来自堆栈跟踪的逐个专辑功能。我只是不明白为什么它有时会起作用,有时不起作用。我说它是逐个专辑,因为它是唯一可以过滤的功能(包括它的孩子),正如在跟踪中可以看到的那样。
所有源代码可在:http://code.google.com/p/mucomp/。这是我学习clojure的小型业余爱好项目,迄今为止它非常有问题(这只是一个bug :))所以我不想告诉太多人有关它:)
你说“(...)所以它看起来像是来自堆栈跟踪的逐个专辑功能”,但是该功能在您发布的堆栈跟踪(的部分)中不具有功能。有更多的错误输出?另外,您能否向我们展示排序曲目以及曲目专辑从哪里来的? (或者,也许你可以选择那些看起来最相关的,如果有太多可以发布的话)。 – 2010-04-30 23:47:38
我用更多的代码更新了帖子。此外,堆栈跟踪就像我发布的那个片段一样继续。悲伤地没有更多有趣的信息;-) – 2010-05-01 11:03:11
我想补充的另一件事是,轨道是约2300元素列表(结构像名称,文件名等东西) – 2010-05-02 19:37:49