1

私は次のことをしようとしています: 私はウェブサイトを持っていて、私のウェブサイトに jsf ページがあります。一部のページには、データベースからの値が入力されたDataTableがあります。これらのテーブルの値も変更されるように、このデータベースを定期的に更新したいと考えています。検索したところ、これにはクォーツを使用する必要があることがわかりました。データベースからテーブルを埋めるマネージド Bean を作成し、その Bean でデータベースから値を取得することを考えています。これが私のコード例です:

 <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 に配置する必要がありますか? バクグラウンドで別のスレッドを実行する必要があるように感じました。 #{values.buy} のようなものがマネージド Bean を呼び出すたびに、スレッドはデータベースを更新する必要があります。どうすればできますか?

ありがとう

編集:私の質問が明確ではなかったと思うので、ここに要約があります:データベースを定期的に、たとえば10分ごとに更新したいです。データベースからデータテーブルに入力するため、このデータテーブルが表示されているページをユーザーが閲覧するたびに、テーブルには最新の更新されたデータベース値が入力されます。

4

3 に答える 3

1

データテーブルのコンテンツでデータベースを自動的に更新します。サーバーに対して定期的な AJAX リクエストを行う必要があります。

サーバー側のコードでマルチスレッドを使用しても、サーバーにリクエストを送信しない限り役に立ちません。

定期的な AJAX リクエストを送信するには、JS タイマーと richfaces AJAX サポート コンポーネントを使用できます。

こんな感じでタイマーをスタートさせて……

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

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

Richfaces を使用した AJAX リクエストの送信に関するさまざまなオプションについては、これを参照できます。

于 2013-07-09T07:07:59.993 に答える
0

少し前に同様の問題があり、次の結論に達しました。

ユーザーの Web ブラウザーでページを自動的に更新するには、ajax を使用できます。

データベースの更新に関しては、どのような代替手段があるかは、作業している環境 (Web サーバー/サーブレット コンテナーとフレームワーク) によって異なります。

JPAを使用してデータベースの作業を行っている場合はEntityManager、クォーツ スレッドに注入できないものを取得する必要があります。また、クォーツによって管理されるスレッドでは、JSFコンテキストにアクセスできません(それを使用する場合は CDI コンテキストにもアクセスできません)。EJB 3.1を使用する Web サーバーを使用している場合は、 @Schedule. EntityManagerそうすれば、スケジューリングに関して Quartz が行うすべてのことを行うわけではありませんが、JSF/CDI コンテキストを注入して取得することができます。データベースに直接接続する場合は、クォーツが非常に適しています。JSF/CDI コンテキストにアクセスする必要があり、EJB 3.1 を持っていない場合 (または、Quartz にある機能が必要な場合)@Schedule欠落している場合は、コンテキストにアクセスする Web サービス (たとえば JAX-RS) を呼び出す Quartz ジョブを使用できます。

要約する:

JPA または JSF/CDI コンテキストが必要で、以下を使用できる場合@Schedule:ジョブ
でデータベースを更新します。@Schedule

@ScheduleJPA は必要だが高度なスケジューリングを使用できない、
または必要とする場合: Web サービス を呼び出す Quartz ジョブをセットアップし、Web サービスにデータベースを更新させます。

データベースに直接接続する場合:
Quartz ジョブを使用して、そこからデータベースを直接更新します。

于 2013-07-10T13:21:46.767 に答える