4

ここでメソッドは、増加し続けるシーケンス番号を持つ一意の ID を持つデータベースを読み取ります。Java の初心者なので、この反復ポーリングを実装し、毎回新しい着信メッセージをチェックする方法を知ることができますか?

/**
 * Method which defines polling of the database and also count the number of Queries
 * @return pojo collection
 * @throws Exception
 */
public List<KAMessage> fullPoll() throws Exception {
    Statement st = dbConnection.createStatement();  
    ResultSet rs = st.executeQuery("select * from msg_new_to_bde where ACTION = 804 order by SEQ DESC");
        List<KAMessage> pojoCol = new ArrayList<KAMessage>();
        while (rs.next()) {
            KAMessage filedClass = convertRecordsetToPojo(rs);
            pojoCol.add(filedClass);
        }

        return pojoCol;
        }


/**
 * Converts a provided record-set to a {@link KAMessage}.
 * 
 * The following attributes are copied from record-set to pojo:
 * 
 * <ul>
 * <li>SEQ</li>
 * <li>TABLENAME</li>
 * <li>ENTRYTIME</li>
 * <li>STATUS</li>
 * </ul>
 * 
 * @param rs
 * @return the converted pojo class object
 * @throws SQLException
 *     
 */
private KAMessage convertRecordsetToPojo(ResultSet rs) throws SQLException {

    KAMessage msg = new KAMessage();
    int sequence = rs.getInt("SEQ");
    msg.setSequence(sequence);
    int action = rs.getInt("ACTION");
    msg.setAction(action);
    String tablename = rs.getString("TABLENAME");
    msg.setTableName(tablename);
    Timestamp entrytime = rs.getTimestamp("ENTRYTIME");
    Date entryTime = new Date(entrytime.getTime());
    msg.setEntryTime(entryTime);
    Timestamp processingtime = rs.getTimestamp("PROCESSINGTIME");
    if (processingtime != null) {
        Date processingTime = new Date(processingtime.getTime());
        msg.setProcessingTime(processingTime);
    }
    String keyInfo1 = rs.getString("KEYINFO1");
    msg.setKeyInfo1(keyInfo1);
    String keyInfo2 = rs.getString("KEYINFO2");
    msg.setKeyInfo2(keyInfo2);
    return msg;
    }
      }

これは私が試したことです:

       while(true){
        try {

           incomingMessages.addAll(fullPoll());
       System.out.println("waiting 6 seconds");
           //perform this operation in a loop
           Thread.sleep(6000);
           } 
           catch (InterruptedException e)
           {
        // TODO Auto-generated catch block
         e.printStackTrace();
        }
            catch (Exception e) 
            {
        // TODO Auto-generated catch block
        e.printStackTrace();                               
           }

準備されたステートメントを使用してパラメーターをこのコードのクエリに渡す方法は、ここで立ち往生しています..

public List<KAMessage> fullPoll() throws Exception {
            PreparedStatement oldSeq = null;
    PreparedStatement newSeq = null;
    Statement st = dbConnection.createStatement();
    System.out.println("Polling");
    String query = "select * from msg_new_to_bde where ACTION = 804 and SEQ between           oldSeq and newSeq order by SEQ DESC";// insert in table
    pstmt = conn.prepareStatement(query);
 }
4

2 に答える 2

2

反復ポーリングを実装するにはさまざまな方法がある可能性があります。私が考えることができる最も簡単な方法は、たとえば thread.sleep を使用して、ポーリング メソッドをしばらく中に入れることです。

    while(true){
        fullPoll();
        Thread.sleep(10000);
     }

例外がスローされるため、try catch を使用することを忘れないでください。または、タイマー タスクやフレームワークなどをクォーツとして使用することもできます。

DB に新しいデータがあるかどうかを確認するために、その場で次の方法を考えることができます (より最適化された方法がある可能性があります)。

クエリを再実行できるように、他の行が追加されたかどうかを理解するために、行の数を保持できます。

これは、行が削除されて再挿入される場合をカバーしません。これをカバーするために、最後にデータベースにクエリを実行したときに使用した最大 ID をどこかに保存し、新しい最大 ID が最後に使用したものと異なるかどうかを毎回確認することができます。はいの場合、データベースが変更されました。

たとえば、古いインデックスを変数 oldSeq に保持し、新しいインデックスを変数 newSeq に保持し、新しく追加されたメッセージのみを取得する場合は、クエリを次のように使用できます。

select * from msg_new_to_bde where ACTION = 804 and SEQ between oldSeq and newSeq order by SEQ DESC

DB の間にテスト値 (oldSeq と newSeq) も含まれているかどうかを確認する必要があります。

于 2013-01-08T10:55:14.043 に答える
1

fullPoll()while ループ内でメソッドをthread.sleep(<number of millis>)呼び出し、呼び出し間で待機するために使用できます。

別の解決策は、Quartz などの本格的なスケジューラ フレームワークを使用することです。

それがあなたの質問に答えることを願っています。

于 2013-01-08T10:44:58.093 に答える