Web applications compojure web项目中的堆栈溢出异常
我一直在玩clojure,并用它来构建一个简单的小音频播放器。奇怪的是,有时,可能是二十分之一,在联系服务器时,我会出现以下错误:Web applications compojure web项目中的堆栈溢出异常,web-applications,clojure,compojure,Web Applications,Clojure,Compojure,我一直在玩clojure,并用它来构建一个简单的小音频播放器。奇怪的是,有时,可能是二十分之一,在联系服务器时,我会出现以下错误: 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 clojur
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)))
及
其中,coll从该函数中提取:
(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)))))
我从来没有在我的日志中得到处理命令,所以它在按唱片集播放曲目时必须停止
因此,它看起来确实是堆栈跟踪中的“按唱片集播放曲目”功能。我只是不明白为什么有时有效有时无效。我说它是按唱片集播放的曲目,因为它是唯一一个进行过滤的功能(包括它的子项),从跟踪中可以看出
所有源代码可在以下位置获得:。学习clojure是我的一个小爱好项目,到目前为止,它有很多缺陷(这只是一个缺陷:),所以我还不想告诉太多人:)我在clojure邮件列表上问了这个问题。答案似乎是过滤器返回一个懒惰的seq,当您链接这些seq时,您将在某个点以堆栈溢出结束。您可以使用doall强制生成序列。您可以说“(…)因此它看起来确实是stack trace中的tracks by album函数”,但该函数在您发布的stack trace(堆栈跟踪的一部分)中不起作用。是否有更多的错误输出?另外,你能给我们看一下排序的曲目和任何地方的曲目专辑得到调用?(或者,如果有太多的内容无法全部发布,你可以选择那些看起来最相关的内容。)我用更多的代码更新了这篇文章。此外,堆栈跟踪就像我发布的代码片段一样继续。遗憾的是,没有更多有趣的信息;-)我还想补充一点,tracks是对大约2300个元素(包含名称、文件名等内容的结构)列表的引用。我花了一段时间才理解“堆栈溢出”不是对该站点的引用;)
(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))
....)