wrap-reload doesn't seem to be working

242 views
Skip to first unread message

Rayne

unread,
May 7, 2010, 2:24:54 PM5/7/10
to Ring
http://gist.github.com/393814 is the code I'm working with.

If I add (wrap-reload) to the (app ..) in Clojure routes, and then try
to load the page, I get this:

java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365)
at java.net.ServerSocket.bind(ServerSocket.java:319)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at java.net.ServerSocket.<init>(ServerSocket.java:141)
at
org.mortbay.jetty.bio.SocketConnector.newServerSocket(SocketConnector.java:
80)
at org.mortbay.jetty.bio.SocketConnector.open(SocketConnector.java:
73)
at org.mortbay.jetty.AbstractConnector.doStart(AbstractConnector.java:
283)
at org.mortbay.jetty.bio.SocketConnector.doStart(SocketConnector.java:
147)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:
50)
at org.mortbay.jetty.Server.doStart(Server.java:233)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:
50)
at ring.adapter.jetty$run_jetty__611.invoke(jetty.clj:66)
at tryclojure.core$eval__1649.invoke(core.clj:36)
at clojure.lang.Compiler.eval(Compiler.java:4642)
at clojure.lang.Compiler.load(Compiler.java:4972)
at clojure.lang.RT.loadResourceScript(RT.java:330)
at clojure.lang.RT.loadResourceScript(RT.java:321)
at clojure.lang.RT.load(RT.java:399)
at clojure.lang.RT.load(RT.java:371)
at clojure.core$load__6449$fn__6458.invoke(core.clj:4171)
at clojure.core$load__6449.doInvoke(core.clj:4170)
at clojure.lang.RestFn.invoke(RestFn.java:413)
at clojure.core$load_one__6379.invoke(core.clj:4007)
at clojure.core$load_lib__6400.doInvoke(core.clj:4044)
at clojure.lang.RestFn.applyTo(RestFn.java:147)
at clojure.core$apply__4370.invoke(core.clj:438)
at clojure.core$load_libs__6417.doInvoke(core.clj:4070)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply__4370.invoke(core.clj:438)
at clojure.core$require__6440.doInvoke(core.clj:4138)
at clojure.lang.RestFn.invoke(RestFn.java:426)
at ring.middleware.reload$wrap_reload__905$fn__907.invoke(reload.clj:
13)
at clojure.lang.Var.invoke(Var.java:359)
at ring.adapter.jetty$proxy_handler__594$fn__596.invoke(jetty.clj:17)
at ring.adapter.jetty.proxy$org.mortbay.jetty.handler.AbstractHandler
$0.handle(Unknown Source)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
534)
at org.mortbay.jetty.HttpConnection
$RequestHandler.headerComplete(HttpConnection.java:864)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:533)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
at org.mortbay.jetty.bio.SocketConnector
$Connection.run(SocketConnector.java:228)
at org.mortbay.thread.QueuedThreadPool
$PoolThread.run(QueuedThreadPool.java:522)
2010-05-07 13:08:07.688::WARN: failed Server@1735b26
java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365)
at java.net.ServerSocket.bind(ServerSocket.java:319)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at java.net.ServerSocket.<init>(ServerSocket.java:141)
at
org.mortbay.jetty.bio.SocketConnector.newServerSocket(SocketConnector.java:
80)
at org.mortbay.jetty.bio.SocketConnector.open(SocketConnector.java:
73)
at org.mortbay.jetty.AbstractConnector.doStart(AbstractConnector.java:
283)
at org.mortbay.jetty.bio.SocketConnector.doStart(SocketConnector.java:
147)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:
50)
at org.mortbay.jetty.Server.doStart(Server.java:233)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:
50)
at ring.adapter.jetty$run_jetty__611.invoke(jetty.clj:66)
at tryclojure.core$eval__1649.invoke(core.clj:36)
at clojure.lang.Compiler.eval(Compiler.java:4642)
at clojure.lang.Compiler.load(Compiler.java:4972)
at clojure.lang.RT.loadResourceScript(RT.java:330)
at clojure.lang.RT.loadResourceScript(RT.java:321)
at clojure.lang.RT.load(RT.java:399)
at clojure.lang.RT.load(RT.java:371)
at clojure.core$load__6449$fn__6458.invoke(core.clj:4171)
at clojure.core$load__6449.doInvoke(core.clj:4170)
at clojure.lang.RestFn.invoke(RestFn.java:413)
at clojure.core$load_one__6379.invoke(core.clj:4007)
at clojure.core$load_lib__6400.doInvoke(core.clj:4044)
at clojure.lang.RestFn.applyTo(RestFn.java:147)
at clojure.core$apply__4370.invoke(core.clj:438)
at clojure.core$load_libs__6417.doInvoke(core.clj:4070)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply__4370.invoke(core.clj:438)
at clojure.core$require__6440.doInvoke(core.clj:4138)
at clojure.lang.RestFn.invoke(RestFn.java:426)
at ring.middleware.reload$wrap_reload__905$fn__907.invoke(reload.clj:
13)
at clojure.lang.Var.invoke(Var.java:359)
at ring.adapter.jetty$proxy_handler__594$fn__596.invoke(jetty.clj:17)
at ring.adapter.jetty.proxy$org.mortbay.jetty.handler.AbstractHandler
$0.handle(Unknown Source)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
534)
at org.mortbay.jetty.HttpConnection
$RequestHandler.headerComplete(HttpConnection.java:864)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:533)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
at org.mortbay.jetty.bio.SocketConnector
$Connection.run(SocketConnector.java:228)
at org.mortbay.thread.QueuedThreadPool
$PoolThread.run(QueuedThreadPool.java:522)
2010-05-07 13:08:07.690::WARN: EXCEPTION
java.net.BindException: Address already in use (core.clj:0)
at clojure.lang.Compiler.eval(Compiler.java:4658)
at clojure.lang.Compiler.load(Compiler.java:4972)
at clojure.lang.RT.loadResourceScript(RT.java:330)
at clojure.lang.RT.loadResourceScript(RT.java:321)
at clojure.lang.RT.load(RT.java:399)
at clojure.lang.RT.load(RT.java:371)
at clojure.core$load__6449$fn__6458.invoke(core.clj:4171)
at clojure.core$load__6449.doInvoke(core.clj:4170)
at clojure.lang.RestFn.invoke(RestFn.java:413)
at clojure.core$load_one__6379.invoke(core.clj:4007)
at clojure.core$load_lib__6400.doInvoke(core.clj:4044)
at clojure.lang.RestFn.applyTo(RestFn.java:147)
at clojure.core$apply__4370.invoke(core.clj:438)
at clojure.core$load_libs__6417.doInvoke(core.clj:4070)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply__4370.invoke(core.clj:438)
at clojure.core$require__6440.doInvoke(core.clj:4138)
at clojure.lang.RestFn.invoke(RestFn.java:426)
at ring.middleware.reload$wrap_reload__905$fn__907.invoke(reload.clj:
13)
at clojure.lang.Var.invoke(Var.java:359)
at ring.adapter.jetty$proxy_handler__594$fn__596.invoke(jetty.clj:17)
at ring.adapter.jetty.proxy$org.mortbay.jetty.handler.AbstractHandler
$0.handle(Unknown Source)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
534)
at org.mortbay.jetty.HttpConnection
$RequestHandler.headerComplete(HttpConnection.java:864)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:533)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
at org.mortbay.jetty.bio.SocketConnector
$Connection.run(SocketConnector.java:228)
at org.mortbay.thread.QueuedThreadPool
$PoolThread.run(QueuedThreadPool.java:522)
Caused by: java.net.BindException: Address already in use
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365)
at java.net.ServerSocket.bind(ServerSocket.java:319)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at java.net.ServerSocket.<init>(ServerSocket.java:141)
at
org.mortbay.jetty.bio.SocketConnector.newServerSocket(SocketConnector.java:
80)
at org.mortbay.jetty.bio.SocketConnector.open(SocketConnector.java:
73)
at org.mortbay.jetty.AbstractConnector.doStart(AbstractConnector.java:
283)
at org.mortbay.jetty.bio.SocketConnector.doStart(SocketConnector.java:
147)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:
50)
at org.mortbay.jetty.Server.doStart(Server.java:233)
at
org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:
50)
at ring.adapter.jetty$run_jetty__611.invoke(jetty.clj:66)
at tryclojure.core$eval__1649.invoke(core.clj:36)
at clojure.lang.Compiler.eval(Compiler.java:4642)
... 30 more

Note that this is very much my first web development project: I don't
know even know HTML (I'm learning as I go). So please forgive me if I
have missed something crucial. :D

Mark McGranaghan

unread,
May 7, 2010, 3:14:42 PM5/7/10
to Ring
Hi,

I think the problem is that when you are using wrap-reload and refresh
the page, the entire tryclojure.core namespace gets reloaded,
including the (run-jetty ...) form. If this form has been evaluated
earlier and there is a corresponding server already running, you will
get an "Address already in use" error like the one you're reporting.

The solution is to put the (run-jetty ...) form in a function
definition, and then to invoke that function from outside of the
namespace when you actually want to boot the server. The post at
http://mmcgrana.github.com/2010/03/clojure-web-development-ring.html
walks through that approach, in particular invoking the function from
the REPL. You could also put the invocation in another namespace or
"script" file that is eval'd with clojure.main.

I hope this helps,
Mark

On May 7, 2:24 pm, Rayne <disciplera...@gmail.com> wrote:
> http://gist.github.com/393814is the code I'm working with.
Reply all
Reply to author
Forward
0 new messages