2009-11-10 20 views
1

Mon application nécessite plusieurs implémentations d'interface qui nécessitent un serveur Jetty pour faire leur travail. Ceci n'est cependant pas forcément le cas dans toutes les implémentations de ces interfaces, de sorte que le serveur Jetty n'est qu'une dépendance.Injection de dépendances: Jetty 7

Puisqu'il serait très pénible d'enrouler tout le serveur jetée avec toutes ses configurations de journalisation, de connecteur et de gestionnaire, je veux injecter le serveur dans ces implémentations avec Spring. J'ai décidé qu'injecter la classe Server n'est pas une bonne idée car une implémentation pourrait arrêter le serveur même si c'est nécessaire à un autre endroit. Actuellement j'injecte HandlerList classes vides à ces implémentations et ils enregistrent leurs gestionnaires pour éviter ces problèmes. Le problème: Ces gestionnaires peuvent interférer avec d'autres gestionnaires par exemple: l'implémentation peut enregistrer un gestionnaire pour/foo et l'implémentation deux aussi ... problème. Quelqu'un at-il utilisé Jetty dans un tel environnement? Et comment ce problème pourrait-il être résolu?

Mon XML pour clarifier mon problème:

<bean id="jetty" class="org.eclipse.jetty.server.Server" destroy-method="stop"> 
    <property name="connectors"> 
     <list> 
      <bean class="org.eclipse.jetty.server.bio.SocketConnector"> 
       <property name="host" value="10.8.0.46" /> 
       <property name="port" value="9999" /> 
      </bean> 
     </list> 
    </property> 

    <property name="handler"> 
     <bean class="org.eclipse.jetty.server.handler.HandlerCollection"> 
      <property name="handlers"> 
       <list> 
        <ref bean="jetty.handlerList" /> 
        <bean class="org.eclipse.jetty.server.handler.RequestLogHandler"> 
         <property name="requestLog"> 
          <bean class="org.eclipse.jetty.server.NCSARequestLog"> 
           <constructor-arg value="${jetty.logfile}" /> 
           <property name="extended" value="false"/> 
          </bean> 
         </property> 
        </bean> 
       </list> 
      </property> 
     </bean> 
    </property> 

    <property name="sendServerVersion" value="false" /> 
</bean> 

<bean id="jetty.handlerList" class="org.eclipse.jetty.server.handler.HandlerList" /> 

Si je requiers un vide HandlerList J'utilise quelque chose comme ça où com.example.myapp.util.ioc.CreateHandlerListFactory est un org.springframework.beans.factory.FactoryBean qui crée une nouvelle HandlerList au sein de la donnée HandlerList.

<constructor-arg> 
    <bean class="com.example.myapp.util.ioc.CreateHandlerListFactory"> 
     <constructor-arg ref="jetty.handlerList"/> 
    </bean> 
</constructor-arg> 

Répondre

0

J'ai quelques suggestions:

Ajouter un org.eclipse.jetty.servlet.ServletHandler et au lieu de Handlers Jetty spécifiques, carte servlets standard au lieu. Vous pouvez définir les servlets ServletHandler soit en les ajoutant une par une (chacune étant enveloppée dans un ServletHolder), soit avec des supports setServlets (ServletHolder []). Les ServletMappings sont définis de manière similaire. Vous pouvez injecter le ServletHandler à chaque implémentation d'interface pour leur permettre d'ajouter leurs servlets mappés, ou créer des tableaux de ServletHolders et ServletMappings de manière centralisée, empêchant ainsi les chemins dupliqués en gardant le contrôle des chemins hors de chaque implémentation d'interface. Ce dernier permettrait également de programmer au moins les implémentations d'interface par rapport à l'API Servlet standard, rendant la majeure partie de votre code indépendant de Jetty.