2017-06-12 51 views
0

我在這裏已經一個代碼。我的代碼用於獲取表中的每一行的內容(int),並不斷髮送給ActiveMQ。當表更新時,新行的內容將被髮送到ActiveMQ。從MySQL的表中獲取內容不斷

但是,當我停止進程並重新運行,它會發送所有內容,從行0 - 所有的ActiveMQ的。我希望我可以把它只是不斷髮出,它不是之前發送並正常工作作爲再次照常內容...

我想我必須創建一個新的數據庫表,以節省每一個最後的限制(行計數號)在循環中,所以我可以在進程停止時再次使用它。任何幫助?

else if(vardbtype.equals("MYSQL")){ 
     Class.forName("com.mysql.jdbc.Driver"); 
     System.out.println("----------------------------"); 
     int limitrowmysql = 0; 
     Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+ vardbserver, vardbuser, vardbpassword); 
     while(true) { 
      Statement stmts = c.createStatement(); 
      int countrowmysql = 0; 
      String sql = ("SELECT * FROM "+ vardbname +" LIMIT "+ limitrowmysql +", 18446744073709551615"); 
      ResultSet rss = stmts.executeQuery(sql); 
      while(rss.next()) { 
       String message = rss.getString("MESSAGE"); 
       System.out.println("Message = " + message); 
       TextMessage mssg = session.createTextMessage(message); 
       System.out.println("Sent: " + mssg.getText()); 
       producer.send(mssg); 
       countrowmysql = countrowmysql + 1; 
      } 
      rss.close(); 
      stmts.close(); 

      limitrowmysql = limitrowmysql + countrowmysql; 
      Thread.sleep(batchperiod2); 
     } 
} 

回答

1

正確,你將需要處理自己最後看到的ID,或利用一個框架,爲您處理此。

FYI--你所追求的是通常被稱爲「輪詢消費」的格局。 Apache Camel有自動處理這種情況的代碼。

+0

噢好吧,我會找的!謝謝btw! – NWD

0

至於我的觀點而言,保持新表保存「行計數數字」不會解決你的問題。考慮當這個過程下來,任何行已被刪除/由某些其他用戶(在多用戶應用程序的情況下)更新,存儲「行計數數字」不會幫助你。

事實上,您應該依靠輪詢機制(直接RMI/API /方法調用)在進程啓動時一次性從數據庫中獲取所有記錄,並遵循此後的通知機制(ActiveMQ)對於桌面上的每一個更新,就像你已經在做的那樣。

+0

您是正確的,收集更新很重要,但收集這些信息的唯一方法是瞭解表的結構(記錄更新字段或時間戳記),或使用數據庫的內置觸發器或記錄工藝事件。我並不是建議「行計數」,而是一個記錄標識符。但是,輪詢整個表或數據庫不會擴展,並且在數據庫端和中間件上佔用資源非常大。這也要求中間件跟蹤和過濾「已經看到的數據」。 –