Parametri dinamici in web.xml

di il
5 risposte

Parametri dinamici in web.xml

Ciao a tutti
Ho la necessità di impostare dinamicamente due parametri in una servlet nel web.xml

Mi spiego :
Questa è la servlet

<servlet>
	<servlet-name>AtmosphereServlet</servlet-name>
	<servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
	<async-supported>true</async-supported>
	<init-param>
		<param-name>org.atmosphere.websocket.maxTextMessageSize</param-name>
		<param-value>1048576</param-value>
	</init-param>
	
	<init-param>
            <param-name>org.atmosphere.kafka.propertiesFile</param-name>
            <param-value>WEB-INF/classes/kafka.properties</param-value>
        </init-param>  
        <init-param>
            <param-name>org.atmosphere.cpr.broadcasterClass</param-name>
            <param-value>eu.dedalus.sop.o4c.servlets.atmosphere.clinicalevent.KafkaBroadcasterImpl</param-value>
        </init-param>      
		<load-on-startup>2</load-on-startup>
</servlet>

I due init-param org.atmosphere.kafka.propertiesFile e org.atmosphere.cpr.broadcasterClass devo inserirli dinamicamente.
Ho due jar nel pom.xml che sono mutuamente esclusivi, che pensavo di gestire con i profili maven, ma non so come intervenire nel web.xml.

Avete mai avuto questa esigenza?
grazie mille

5 Risposte

  • Re: Parametri dinamici in web.xml

    vegas ha scritto:


    I due init-param org.atmosphere.kafka.propertiesFile e org.atmosphere.cpr.broadcasterClass devo inserirli dinamicamente.
    Ho due jar nel pom.xml che sono mutuamente esclusivi, che pensavo di gestire con i profili maven, ma non so come intervenire nel web.xml.
    Se ti basta usare i "profili" Maven, ovvero: faccio il build con profilo X oppure con profilo Y allora .... è fattibile.
    Basta usare il resource filtering di Maven

    Metti nel web.xml il valore es.
        <param-value>${kafkaProp}</param-value>
    Poi nel pom.xml metti
    <build>
    
        <resources>
            <resource>
                <directory>src/main/webapp/WEB-INF</directory>
                <filtering>true</filtering>
                <includes>
                    <include>web.xml</include>
                </includes>
            </resource>
        </resources>
    
    </build>
    Poi sempre nel pom.xml, per il profilo X metti es.
        <profile>
            <id>profilo-X</id>
            <properties>
                <kafkaProp>TUO VALORE</kafkaProp>
            </properties>
        </profile>
    Similare per un profilo Y

    Non l'ho provato ma ... il concetto è quello. All'atto del build, Maven va a "filtrare" il web.xml e gli inietta quel kafkaProp (non modifica quel web.xml ma quello che va sotto target/war ecc..).
  • Re: Parametri dinamici in web.xml

    andbin ha scritto:


    vegas ha scritto:


    I due init-param org.atmosphere.kafka.propertiesFile e org.atmosphere.cpr.broadcasterClass devo inserirli dinamicamente.
    Ho due jar nel pom.xml che sono mutuamente esclusivi, che pensavo di gestire con i profili maven, ma non so come intervenire nel web.xml.
    Se ti basta usare i "profili" Maven, ovvero: faccio il build con profilo X oppure con profilo Y allora .... è fattibile.
    Ciao Andrea
    ti ringrazio molto per la risposta e per il tempo che mi hai dedicato.
    Si la mia idea era esattamente quella!
    Domani la provo, grazie sei stato gentilissimo!
  • Re: Parametri dinamici in web.xml

    L'ho provato velocemente .... "quasi" giusto. Nel senso che il concetto del filtering è ok ma l'uso del <resource> è sbagliato perché (non mi ricordavo...) lo tratta come "risorsa" che fa andare il web.xml "filtrato" ma sotto WEB-INF/classes (che è errato).

    In questo caso si può usare il maven-war-plugin

    Togli il <resources> / <resource>

    e metti quindi:
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.3</version>
                    <configuration>
                        <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    Il <filteringDeploymentDescriptors> fa già tutto quello che serve.


    P.S.: 3.2.3 è l'ultima versione attuale, vedi se non crea problemi per il tuo progetto specifico.
    P.S.2: potresti già avere il maven-war-plugin per "altri" motivi ...
  • Re: Parametri dinamici in web.xml

    Grazie davvero Andrea!, spero che qui non mi facciano storie nell'aggiungere un plugin perchè sono molto pignoli e restrittivi nell'aggiungere tools.
    Ma grazie, ho due strade da percorrere ottime!
  • Re: Parametri dinamici in web.xml

    Ciao Andrea

    Ti volevo dare un feedback visto il tempo che mi hai dedicato.

    Entrambe le soluzioni (compresa la mia pensata iniziale dei profili) presupponevano una soluzione 'custom' del war generato. In altre parole mi hanno contestato che ad ogni release sarebbe stato necessario creare due war per versione, una con kafka e l'altra senza.
    Quindi era necessario creare la (invento) 1.20.3-kafka e 1.20.3-atmopshere.

    Sono riuscito ad aggirare il problema modificando a runtime in fase di avvio del tomcat estendendo la servlet , e sovrascrivendo gli init-param tramite un parametro (JVM/context/properties devo stabilirlo).
    Ecco la classe
    
    public class AtmosphereServletImpl extends AtmosphereServlet {
    
    	private String final KAFKA_PROPERTIES_PARAMETER_NAME= "org.atmosphere.kafka.propertiesFile";
    	private String final KAFKA_PROPERTIES_NAME= "WEB-INF/classes/kafka.properties";
    	private String final BROADCASTER_PARAMETER_NAME= "org.atmosphere.cpr.broadcasterClass";
    	private String final BROADCASTER_CLASS_KAFKA= "eu.dedalus.sop.o4c.servlets.atmosphere.clinicalevent.KafkaBroadcasterImpl";
    	private String final BROADCASTER_CLASS_ATMOSPHERE= "org.atmosphere.cpr.DefaultBroadcaster";
    	
    	@Override
    	public void init(ServletConfig sc) throws ServletException {
    
    		boolean isKafka = true; 
    		if (isKafka) {
    			sc.getServletContext().getServletRegistrations().get("AtmosphereServlet").setInitParameter(KAFKA_PROPERTIES_PARAMETER_NAME, KAFKA_PROPERTIES_NAME);
    			sc.getServletContext().getServletRegistrations().get("AtmosphereServlet").setInitParameter(BROADCASTER_PARAMETER_NAME, BROADCASTER_CLASS_KAFKA);
    		}
    		else
    			sc.getServletContext().getServletRegistrations().get("AtmosphereServlet").setInitParameter(BROADCASTER_PARAMETER_NAME, BROADCASTER_CLASS_ATMOSPHERE);
    		
    		super.init(sc);
    	}
    }
    
    ora ho impostato isKafka = true, e in quel punto devo parametrizzarlo, però in questo modo funziona.
    Naturalmente ho cambiato la definizione della servlet nel web.xml con questa nuova classe
    Grazie ancora per il tuo aiuto prezioso comunque
    ciao
    Marco
Devi accedere o registrarti per scrivere nel forum
5 risposte