Hi, Following the tips I removed the middleware wrappers, separated the handler and created closures over the routes. Now, when I do a reset after every change I am having a nice experience. So it was not much that was missing.
Thanks everybody for your help, Sven Am Sonntag, 10. August 2014 21:11:12 UTC+2 schrieb Matt Mitchell: > > Here's some relevant info about tools.namespace and protocols: > https://github.com/clojure/tools.namespace#warnings-for-protocols > > - Matt > > On Saturday, August 9, 2014 6:04:03 PM UTC-4, Sven Richter wrote: >> >> Hi, >> >> First I would like to thank everybody for your answers and hints. >> >> I setup a small project you can find here: >> https://github.com/sveri/component_test >> You can run it with lein repl and then calling (go). >> >> I have three questions/problems for this one: >> 1. Did I separate the handler and the server correctly (I was trying to >> follow your advices)? >> >> 2. In scheduler.clj I defined a protocol (additionally to the lifecycle >> protocol) and a record implementing that protocol. I create a new instance >> of that record and pass it down to the handler and there to the routes. >> Now, when I open a webpage and go to http://localhost:3000/sched >> everything works fine. >> Next I edit the add-job function in scheduler.cljs to print something >> different like this: >> (add-job [this] >> (println "new sys out")) >> Just a small change is enough. If you go to the webpage again and try to >> reload it an exception will be thrown: >> Sat Aug 09 23:52:28 CEST 2014 [worker-3] ERROR - GET /sched >> java.lang.IllegalArgumentException: No implementation of method: :add-job >> of protocol: #'component-test.scheduler/ISched found for class: >> component_test.schedul >> er.Sched >> at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:544) >> at >> component_test.scheduler$eval6553$fn__6554$G__6544__6559.invoke(scheduler.clj:6) >> at component_test.routes$sched_in.invoke(routes.clj:8) >> at >> component_test.routes$home_routes$fn__3312.invoke(routes.clj:19) >> at compojure.core$make_route$fn__2331.invoke(core.clj:99) >> at compojure.core$if_route$fn__2315.invoke(core.clj:45) >> ... >> >> I dont really understand why that happens and any hints regarding what I >> am doing wrong would be great. And this leads to my last question. >> >> 3. After having an exception I will usually try to reset the system with: >> (reset), but in this case (and many different other cases) I will just get >> another error: >> component-test.user=> (reset) >> :reloading (component-test.scheduler component-test.routes >> component-test.server component-test.handler component-test.core >> component-test.user component-test.c >> ore-test) >> ;; Starting HTTP-Kit server on port 3000 >> >> BindException Address already in use: bind sun.nio.ch.Net.bind0 >> (Net.java:-2) >> >> And now all I can do is exit the repl and start it again to get my code >> running. >> >> This is exactly what I dont want to do all the time and the problem I >> thought would be solved by the component library, so once more, every hint >> you have for me will be valuable about what I can do and what not. >> >> Best Regards, >> Sven >> >> Am Freitag, 8. August 2014 13:16:49 UTC+2 schrieb Sven Richter: >>> >>> Hi, >>> >>> I am trying to integrate Stuarts component library into my application. >>> I am not sure if I use it correctly or do something else wrong or just have >>> a wrong mindset. So I will explain how I am currently using it and the >>> problem I see with it. >>> >>> I have three components: database, a scheduler and web application (note >>> that my example is simplified to get faster to the point). These components >>> are built like this: >>> >>> (component/system-map >>> :database (db db-uri) >>> :scheduler (component/using (scheduler) [:database]) >>> :web-app (component/using (web-app) >>> [:database >>> :scheduler] )) >>> >>> And in my web-app I do something like this: >>> >>> (start [component] >>> (let [db-conn (get-in web-app [:database :db-conn])] >>> (assoc component :server >>> (run-server (make-handler web-app db-conn) {:port >>> port})))) >>> >>> And make-handler is a middleware that associates the database component >>> into the request map. >>> >>> Now as I added the scheduler to my system it occured to me that I will >>> have to associate the scheduler into the request map too to access it and I >>> might have to do that for every other component that is coming along the >>> road. >>> So basically I am tying my web-app to to all these components and I am >>> tying some components to other components (like scheduler component to the >>> database component). >>> >>> And by tying this things together this way they do depend on each other >>> and I cannot move them anymore. This came to my mind as I started thinking >>> about microservices. >>> >>> So let's say I want to convert the scheduler into a restful >>> microservice, it's hard to pass in a database connection into it via HTTP, >>> so it seems like it's not decoupled enough. Does that make sense? >>> >>> Am I using it wrong? Is it ok to pass all kind of dependencies into the >>> request map and shove it around in the web application? Any other >>> suggestions / remarks? >>> >>> Best Regards, >>> Sven >>> >> -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.