2013-08-02 5 views
1

Mon architecture:
serveur GlassFish Edition Open Source 3.1.2.2 (5)
Java EE 6
Eclipse IDE
Comment modifier JNDI Ressources personnalisées Propriétés Valeurs à la volée

je créé un temporisateur EJB, qui imprime un message de journal:

@Startup 
@Singleton 
public class ProgrammaticalTimerEJB { 
    private final Logger log = Logger.getLogger(getClass().getName()); 

    @Resource(name = "properties/mailconfig") 
    private Properties mailProperties; 

    @Resource 
    private TimerService timerService; 

    @PostConstruct 
    public void createProgrammaticalTimer() { 
     log.log(Level.INFO, "ProgrammaticalTimerEJB initialized"); 
     ScheduleExpression everyTenSeconds = new ScheduleExpression().second("*/10").minute("*").hour("*"); 
     timerService.createCalendarTimer(everyTenSeconds, new TimerConfig("passed message " + new Date(), false)); 
    } 

    @Timeout 
    public void handleTimer(final Timer timer) { 
     log.info(new Date().toGMTString() + " Programmatical: " + mailProperties.getProperty("to")); 
    } 
} 

Cette classe injecte ma ressource JNDI personnalisée:

@Resource(name = "properties/mailconfig") 
    private Properties mailProperties; 

Eclipse Console:

INFO: 2 Aug 2013 10:55:40 GMT Programmatical: [email protected] 
INFO: 2 Aug 2013 10:55:50 GMT Programmatical: [email protected] 
INFO: 2 Aug 2013 10:56:00 GMT Programmatical: [email protected] 

paramètres Glassfish

asadmin> get server.resources.custom-resource.properties/mailconfig.property 

server.resources.custom-resource.properties/[email protected] 

Command get executed successfully. 
asadmin> 



enter image description here

Maintenant, je veux changer cette valeur de la propriété lors de l'exécution de l'application. L'éditer via Adminconsole ou Asadmin ne fonctionne pas. Est-ce possible, ou existe-t-il une autre/meilleure soulution?

Un grand merci à l'avance

Répondre

6

Il est possible de résoudre votre problème:

Si une application utilise resource injection, GlassFish Server appelle la JNDI API et l'application n'est pas nécessaire de le faire.

Une fois injectées, les propriétés ne sont pas rechargées et il n'y a pas de possibilité directe de recharger la ressource par défaut.

Cependant, il est également possible pour une application de localiser des ressources en appelant directement le JNDI API.

Vous devez effectuer un JNDI Lookup pour votre Custom Resoruce, programmé ou à chaque fois avant d'utiliser les propriétés. Ce code a fonctionné pour moi:

@Timeout 
public void handleTimer(final Timer timer) throws IOException, NamingException { 
    Context initialContext = new InitialContext(); 
    mailProperties = (Properties)initialContext.lookup("properties/mailconfig"); 
    log.info(new Date().toGMTString() + " Programmatical: " + mailProperties.getProperty("to"));   
} 
1

Selon ma compréhension, la ressource de mailProperties est injecté après l'EJB est instancié par le conteneur qui se produit qu'une seule fois dans le lifecycle of bean.

Par conséquent, les propriétés à terme des changements ne sont pas disponibles à lui.

Une alternative pourrait être d'essayer de rechercher les propriétés mailProperties dans la méthode @Timeout.

Questions connexes