2013-08-02 75 views
1

我的架構飛:
GlassFish應用服務器版3.1.2.2(5)
Java EE 6的
的Eclipse IDE
如何修改JNDI自定義資源的屬性值上

我創建了一個EJB計時器,它打印日誌消息:

@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: [email protected] 
INFO: 2 Aug 2013 10:55:50 GMT Programmatical: [email protected] 
INFO: 2 Aug 2013 10:56:00 GMT Programmatical: [email protected] 

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

現在我想改變在應用程序運行時該屬性值。 通過Adminconsole或asadmin的編輯它不工作。 這是可能的,或者是有一個其他/更好soulution?

提前

回答

6

還有就是要解決你的問題的可能性:

如果應用程序使用resource injection,GlassFish服務器調用JNDI API,以及這樣做的應用是不需要的。

一旦注入的屬性不加載並沒有直接posibility默認重新加載資源。

但是,它也有可能爲應用程序通過向JNDI API直接調用定位資源。

您需要爲您的Custom Resoruce執行JNDI Lookup,無論是計劃還是每次使用屬性之前。此代碼爲我工作:

@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

非常感謝據我瞭解,EJB是由只發生在lifecycle of bean.

因此一次性容器實例化後的mailProperties資源注入,期貨屬性的變化是不可用給他。

另一種可能是,試圖查找@Timeout方法裏面mailProperties。

相關問題