2013-07-09 21 views
1

我正在嘗試執行以下操作:我有一個網站,在我的網站上有jsf頁面。在一些頁面中,我有一個數據表,其中填充了一些來自數據庫的值。我想定期更新這個數據庫,以便這些表中的值也會改變。當我搜索時發現我需要使用石英。我正在考慮讓託管bean填充數據庫中的表,然後從該數據庫中獲取該值的值。這裏是我的示例代碼:如何在jsf網站的背景中運行線程?

<h:form> 
     <rich:extendedDataTable style=" column-width: 174px; width:174px;" value="#{exchangeRates.values}" var="values" id="accountsTable" styleClass="accountsTable" headerClass="accountsTableHeader" rowClasses="accountsTableOddRow,accountsTableEvenRow" > 

      <rich:column width="40px;"> 
       <f:facet name="header">Currency</f:facet> 
        #{values.type} 
      </rich:column> 
      <rich:column width="45px;"> 
       <f:facet name="header">Alış</f:facet> 
        #{values.buy} 
      </rich:column > 
      <rich:column width="45px;" > 
       <f:facet name="header">Satış</f:facet> 
        #{values.sell} 
      </rich:column> 

     </rich:extendedDataTable> 

,爲此JSF頁面管理bean:

private String value; 
private ArrayList<Money> values = new ArrayList<>(); 

public ArrayList<Money> getValues() { 
    try { 
     getCurrentExchangeValue(); 
    } catch (IOException ex) { 
     Logger.getLogger(ExchangeRates.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return values; 
} 

private void getCurrentExchangeValue() throws IOException { 
    //GET THE VALUES FROM THE DATABASE AND 
    //FILL THE "values" ArrayList 
} 


public String getValue() { 
    return value; 
} 

public void setValue(String value) { 
    this.value = value; 
} 

我的頁面數據表上成功地填充這個代碼,但沒有定期更新。 我的問題是,我應該在哪裏「手動更新數據庫」代碼?它應該在另一個函數中的託管bean上嗎?我跌倒了,就像我需要另一個在freeground中運行的線程一樣,每當#{values.buy}調用託管bean時,線程應該更新數據庫。我該怎麼做?

感謝

編輯:我覺得我的問題不是清楚,所以這裏的總結:我希望數據庫定期更新,每10分鐘等。由於我從數據庫中填充數據表,每當用戶瀏覽查看此數據表的頁面時,表中就會填入最新的更新數據庫值。

+0

您是否需要隨時更新數據庫,或只是在用戶正在查看頁面時?您需要在用戶查看時自動更新這些值,還是僅在用戶重新加載頁面時才更新這些值? – Simon

+0

@Simon我想要每隔20分鐘更新一次數據庫,而不管查看數據表所在頁面的人。我希望數據庫中的值自動更新,以便如果用戶查看數據表所在的頁面,表中填充了最新的更新值 – yrazlik

+0

數據表視圖可以在頁面查看時更新 – yrazlik

回答

1

使用數據表內容自動更新數據庫,您需要定期向服務器發送AJAX請求。

在服務器端代碼上使用多線程將無濟於事,除非您向服務器發出請求。

要發送定期的AJAX請求,您可以使用JS計時器和Richfaces AJAX支持組件。

這樣開始計時...

var pingInterval = 1000; // 1 sec 
setInterval(contactServer, pingInterval); 

function contactServer(){ 
    // send request to server 
} 

您可以參考this瞭解有關使用發送RichFaces的Ajax請求的各種選項。

+0

謝謝但如果我手動更新數據表發生的原因是數據庫中的值仍然相同。我試圖更新「數據庫」,在那裏我保留了一些定期更改的值 – yrazlik

+0

當您向managed bean發送請求時,您需要從託管bean中查詢數據庫以獲取最新結果。 – Apurv

+0

你想更新數據庫?您是否希望保持數據庫與數據表同步,以防數據表中的內容更改? – Apurv

0

在後臺更新數據庫不需要託管bean。它的全部都與服務器應該處理的業務邏輯有關。

您可以在上下文初始化期間或使用Application Scoped Bean Post構造方法啓動ScheduledExecutorService

查看作用域數據表可以使用db中的最新更改進行刷新。

0

我前一段時間也有類似的問題,來到了以下結論:

至於你可以使用Ajax用戶的Web瀏覽器會自動更新頁面。

至於更新數據庫,你有什麼選擇取決於你在什麼環境下工作(web-server/servlet容器和框架)。

如果您正在使用JPA來做數據庫工作,那麼您會想要獲得您的EntityManager不能注入石英線。此外,在由石英管理的線程中,您將無法訪問JSF 上下文(如果使用該上下文,也不能使用CDI上下文)。如果您在使用EJB 3.1的Web服務器上,則可以使用@Schedule。這樣你就可以注入你的EntityManager並獲得JSF/CDI上下文,儘管它並沒有完成石英在調度方面所做的一切。如果你直接連接到數據庫,那麼石英是一個很好的選擇。 如果您需要訪問JSF/CDI上下文並且沒有EJB 3.1(或者如果您需要石英有的功能,但缺少@Schedule,那麼您可以有一個石英作業調用Web服務(例如JAX- RS),這將能夠訪問上下文

總結:

如果您需要JPA或JSF/CDI上下文並可以使用@Schedule
更新數據庫中@Schedule工作

如果你需要J PA,但不能使用@Schedule或需要高級計劃:
設置一個調用web服務並使webservice更新數據庫的石英作業。

如果您連接到數據庫直接:
使用石英工作,直接從那裏更新數據庫。