2011-07-05 47 views
1

我有一個問題關於認證和TimerService @Timeout註釋:EJB3.1 TimerService @Timeout現任校長

在我們的應用程序的用戶可安排在給定的時間間隔要執行的任務,他們從任務列表中選擇,每個任務都與應用程序中的特定EJB相關聯。當用戶按下保存按鈕時,一個新的定時器被添加到Timer服務中,當@Timeout方法被調用時,用戶指定的一個方法用@Timeout方法調用

當超時方法由Timerservice發起,現任負責人是「匿名者」。如果你需要從timout方法中調用任何受保護的EJB,這是有問題的。是否有可能將當前的主體和角色更改爲與創建計時器的用戶相同的主體和角色?

@Singleton 
@LocalBean 
public class TestEJB 
{ 

    @Resource 
    SessionContext context; 
    @Resource 
    TimerService timerService; 

    @Timeout 
    public void execute(Timer timer) throws Exception { 
     //Get the current username 
     System.out.println(context.getCallerPrincipal().getName()); 
    } 

    public void createScheduledTimer(ScheduleExpression e,String timerId) throws IllegalArgumentException, IllegalStateException, EJBException { 
     TimerConfig tc = new TimerConfig(); 
     tc.setInfo(timerId); 
     tc.setPersistent(true); 
     timerService.createCalendarTimer(e, tc); 
    } 

} 

回答

1

我們在Glassfish中做了這個。在我們的例子中,我們有一個通用的Timer bean,它可以運行多個任務中的任何一個,而不是像任何一個bean那樣運行,但是概念是相同的。

我們最終做的是在任務提交時記錄用戶,然後利用Glassfish特定的ProgramaticLogin工具在計時器啓動時重新登錄用戶。這樣整個EJB安全上下文就可以爲用戶和任務進行適當的設置。

+0

@Timeout public void execute(Timer timer){ProgrammaticLogin programmaticLogin = new ProgrammaticLogin(); programmaticLogin.login(userName,password); – user829776

+0

嗨,感謝上百萬,這正是我期待的目標,我們正在運行我們的glassfish應用程序,我無法找到大量關於程序登錄的示例,您的實現看起來類似於以下內容: ProgrammaticLogin programmaticLogin =新的ProgrammaticLogin(); programmaticLogin.login(userName,password); – user829776

+0

是的,這就是我們使用的。我應該注意到我們正在爲我們的實現使用自定義的Realm(通常Glassfish只帶有一個文件,jdbc和一個LDAP領域)。我們所做的另一件事是傳遞簽名的令牌,而不是Realm可以檢測到的密碼,以便知道「它來自我們」,這樣我們就不需要以純文本形式獲得用戶的實際密碼。 –

0

由於您正在使用3.1有狀態會話Bean支持定時器。嘗試使用@Stateful而不是@Singleton註釋您的bean。然後嘗試在您的createScheduledTimer方法中獲取用戶名。將其存儲爲專用字段,然後使用@Timeout方法訪問它。

+0

SFSB不支持定時器。您可能能夠保留對SFSB的引用,但這取決於計時器是否會在SFSB超時之前觸發。 –

+0

我認爲在3.1中增加了對它們的支持嗎? 從JSR:EJB定時器服務增強來支持類似cron的調度,部署時間計時器創建和有狀態會話bean定時對象。 –

+1

支持SFSB在最初的JSR 318提案中,但最終版本(第18.2節)說:「可以爲無狀態會話bean,單例會話bean,消息 驅動的bean和2.1實體bean [94]創建定時器, 。無法爲有狀態會話bean創建定時器[95]。「 –