如何进行轮询并定期检查数据库中的新传入数据

时间:2013-01-08 10:39:27

标签: java multithreading object methods polling

这里的方法读取具有唯一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);
 }

2 个答案:

答案 0 :(得分:1)

您可以在while循环中调用方法fullPoll(),并使用thread.sleep(<number of millis>)在调用之间等待。

另一种解决方案是使用完整的调度程序框架,例如quartz。

希望能回答你的问题。

答案 1 :(得分:1)

可以有多种方式来实现重复轮询,我能想到的简单方法是将轮询方法放在一段时间内,例如使用thread.sleep:

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

不要忘记使用try catch,因为你抛出了一个异常。 或者,您可以使用计时器任务或框架之类的东西作为石英。

为了检查数据库中是否有新数据,我可以动态地考虑以下方式(可以有更优化的方法):

您可以保留行数,以了解是否已添加其他行,以便您可以重新运行查询。

这不包括删除和重新插入行的情况,为了覆盖这一点,您可以尝试存储上次查询数据库时使用的最大ID,并检查每次新的最大ID是否与你记忆的最后一个,如果是的话,数据库已经改变了。

例如,如果将旧索引保留在变量oldSeq中,并将new保留在变量newSeq中,并且只想获取新添加的消息,则可以使用以下查询:

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

你应该检查你的数据库之间是否还包括测试值(oldSeq和newSeq)