如何动态修改JNDI自定义资源属性值

时间:2013-08-02 11:10:18

标签: java java-ee properties glassfish jndi

我的建筑:
GlassFish Server开源版3.1.2.2(5)
Java EE 6
Eclipse IDE

我创建了一个EJB Timer,它打印一条日志消息:

@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"));
    }
}

此类注入我的自定义JNDI资源:

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

Eclipse控制台:

INFO: 2 Aug 2013 10:55:40 GMT Programmatical: tim.herold@mylocal.de
INFO: 2 Aug 2013 10:55:50 GMT Programmatical: tim.herold@mylocal.de
INFO: 2 Aug 2013 10:56:00 GMT Programmatical: tim.herold@mylocal.de

Glassfish设置

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

server.resources.custom-resource.properties/mailconfig.property.to=tim.herold@mylocal.de

Command get executed successfully.
asadmin>



enter image description here

现在我想在应用程序运行时更改此属性值。 通过Adminconsole或Asadmin编辑它不起作用。 这是可能的,还是有其他/更好的疗法?

非常感谢提前

2 个答案:

答案 0 :(得分:6)

有可能解决您的问题:

如果应用程序使用resource injection,GlassFish Server将调用JNDI API,并且不要求应用程序执行此操作。

注入后,属性不会重新加载,默认情况下无法直接重新加载资源。

但是,应用程序也可以通过直接调用JNDI API来查找资源。

您需要为JNDI Lookup执行Custom Resoruce,无论是计划的还是每次使用属性之前。这段代码对我有用:

@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 :(得分:1)

根据我的理解,在容器实例化EJB之后注入了mailProperties资源,该容器只在lifecycle of bean.中出现一次

因此,他无法获得期货物业变更。

另一种方法是尝试在@Timeout方法中查找mailProperties。