2012-04-03 13 views
2

Ich habe ein Clojure/Ring-Projekt, das zwei verschiedene App/Handler auf verschiedenen Ports (eine für eine API und eine für ein Web-Frontend) läuft. Sie teilen viel Code, aber jeder hat seinen eigenen Namespace, in dem er die gesamte Arbeit für diese Schnittstelle ausführt. Jetzt möchte ich dies als ein Servlet in Tomcat oder etwas ähnliches (muss wirklich in jedem Servlet-Container arbeiten) bereitstellen. Ich habe jedoch Probleme, weil es so aussieht, als ob Lein-Ring die Annahme macht, dass es nur einen Handler im Servlet geben wird. Zum Beispiel in meinem project.clj habe ich diese Zeile:clojure/lein/ring: Ich habe zwei Ringhandler, die verschiedene Sachen machen, wie verpacke ich das in ein Servlet?

:ring {:handler caribou.api/app 
     :servlet-name "caribou" 
     :init caribou.api/init} 

Dies ist ideal für die api, aber jetzt was über das Frontend? Muss ich ein anderes Projekt erstellen, das dieses enthält, damit es einen eigenen Handler und ein eigenes Servlet haben kann? Läuft ein Servlet immer an einem Port?

Es gibt zwei Dinge, über die ich mir im Grunde nicht sicher bin: Ich komme nicht aus einem Java-Hintergrund, also bin ich mir nicht sicher, was mit dem Servlet-Ansatz passiert und welche Einschränkungen es hat genau genommen entspricht clojure dem Servlet-Paradigma genug, um dieses Projekt allgemein zu strukturieren.

Jede Hilfe wird geschätzt, danke!

Antwort

1

Alle Servlets im selben Container werden vom selben Server und daher vom selben Port bedient. Normalerweise identifizieren Sie verschiedene Servlets, indem Sie ihnen unterschiedliche URI-Präfixe wie /servlet1 oder /my/servlet geben.

Ich weiß nicht, ob etwas daran hindert, separate Servlets mit Ring zu erstellen, aber im Allgemeinen scheint es keine gute Idee zu sein, wenn Ihre gesamte App Clojure-basiert ist. Zumindest, wie Sie bereits erwähnt haben, erzwingt das Leinring-Plugin, dass nur ein Servlet für die Webanwendung verwendet wird.

Eine Sache, die Sie tun können, ist ein Parent-Handler zu erstellen, der an die App oder API-Handler basierend auf dem URI delegiert. Dies gibt Ihnen im Wesentlichen Kontrolle, ohne die Logik an die Servlet-API delegieren zu müssen.