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.

Reply via email to