2010-04-30 55 views
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 :))所以我不想告诉太多人有关它:)

+1

你说“(...)所以它看起来像是来自堆栈跟踪的逐个专辑功能”,但是该功能在您发布的堆栈跟踪(的部分)中不具有功能。有更多的错误输出?另外,您能否向我们展示排序曲目以及曲目专辑从哪里来的? (或者,也许你可以选择那些看起来最相关的,如果有太多可以发布的话)。 – 2010-04-30 23:47:38

+0

我用更多的代码更新了帖子。此外,堆栈跟踪就像我发布的那个片段一样继续。悲伤地没有更多有趣的信息;-) – 2010-05-01 11:03:11

+0

我想补充的另一件事是,轨道是约2300元素列表(结构像名称,文件名等东西) – 2010-05-02 19:37:49

回答

1

我问了关于clojure邮件列表。看起来答案是过滤器返回一个懒惰的seq,并且当你链接它们时,你会在某个点结束堆栈溢出。可以使用doall强制产生序列。