2014-11-05 67 views
0

我在java中編寫應用程序以存儲來自UDP廣播的數據並將它們存儲到MongoDB。 UDP以毫秒爲單位發送,它包含有關昏迷(大約30個字段)分開的文本文件。以毫秒爲單位將數據存儲到MongoDB Collection

但我遇到了如下問題(問題僅在4-5分鐘內顯示,我運行該程序)。

Connect success 
Doc inserted 
Connect success 
Doc inserted 
Connect success 
com.mongodb.MongoTimeoutException: Timed out after 10000 ms while waiting for a server that matches AnyServerSelector{}. Client view of cluster state is {type=Unknown, servers=[{address=127.0.0.1:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.net.SocketException: Too many open files}}] 
    at com.mongodb.BaseCluster.getServer(BaseCluster.java:82) 
    at com.mongodb.DBTCPConnector.getServer(DBTCPConnector.java:654) 
    at com.mongodb.DBTCPConnector.access$300(DBTCPConnector.java:39) 
    at com.mongodb.DBTCPConnector$MyPort.getConnection(DBTCPConnector.java:503) 
    at com.mongodb.DBTCPConnector$MyPort.get(DBTCPConnector.java:451) 
    at com.mongodb.DBTCPConnector.authenticate(DBTCPConnector.java:624) 
    at com.mongodb.DBApiLayer.doAuthenticate(DBApiLayer.java:195) 
    at com.mongodb.DB.authenticateCommandHelper(DB.java:765) 
    at com.mongodb.DB.authenticate(DB.java:721) 
    at UdpGPSListener.main(UdpGPSListener.java:108) 

以下是我在Java代碼:

  DatagramSocket serverSocket = new DatagramSocket(2020); 
     byte[] receiveData = new byte[2048]; 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     serverSocket.receive(receivePacket); 
     String dtCollection = new String(receivePacket.getData(), "UTF8"); 
     String[] arrCollection = dtCollection.split(","); 
     String dtField = "UnitTime,Ab1,ab2,ab3,ab4,ab5,ab6,ab7,cc1,cc2,cc3,cc4,cc5,cc6,cc7,cc8,cc9,cc9,cc10,m01,m02,m03,m04,m05,m06,m07"; 
     String[] arrField = dtField.split(","); 
     String gbCollection=""; 
     for (int m=0; m<arrCollection.length; m++) { 
      gbCollection+=arrField[m] + "=" +arrCollection[m] +","; 
     } 
      try { 
       MongoClient mClient = new MongoClient(); 
       //MongoClient mClient = new MongoClient("127.0.0.1", 27017); 
       DB db = mClient.getDB("mms"); 
         System.out.println("Connect success"); 
       boolean auth = db.authenticate("user1", "passw0rd".toCharArray()); 
       DBCollection coll = db.getCollection("tgps"); 
       BasicDBObject doc = new BasicDBObject(arrField[0], arrCollection[0]). 
        append(arrField[1], arrCollection[1]). 
        append(arrField[2], arrCollection[2]). 
        append(arrField[3], arrCollection[3]). 
        append(arrField[4], arrCollection[4]). 
        append(arrField[5], arrCollection[5]). 
        append(arrField[6], arrCollection[6]). 
        append(arrField[7], arrCollection[7]). 
        append(arrField[8], arrCollection[8]). 
        append(arrField[9], arrCollection[9]). 
        append(arrField[10], arrCollection[10]). 
        append(arrField[11], arrCollection[11]). 
        append(arrField[12], arrCollection[12]). 
        append(arrField[13], arrCollection[13]). 
        append(arrField[14], arrCollection[14]). 
        append(arrField[15], arrCollection[15]). 
        append(arrField[16], arrCollection[16]). 
        append(arrField[17], arrCollection[17]). 
        append(arrField[18], arrCollection[18]). 
        append(arrField[19], arrCollection[19]). 
        append(arrField[20], arrCollection[20]). 
        append(arrField[21], arrCollection[21]). 
        append(arrField[22], arrCollection[22]). 
        append(arrField[23], arrCollection[23]). 
        append(arrField[24], arrCollection[24]). 
        append(arrField[25], new Date()); 
       coll.insert(doc); 
       System.out.println("Doc inserted"); 
      } catch(UnknownHostException e) { 
        System.err.println(e.getClass().getName() + ": " + e.getMessage()); 
      } catch(MongoException e) { 
        e.printStackTrace(); 
      } 

回答

0

我認爲通過

UDP在毫秒發送

你的意思是一updat e可能每毫秒發生一次。

反正你遇到這樣的問題:

java.net.SocketException異常:打開的文件太多

我也假設你收到您的活動在某種循環。

在這種情況下,這可能是你的問題:

MongoClient mClient = new MongoClient();

你應該初始化MongoClient纔開始監聽事件前一次,否則打開一個連接,並永遠不會關閉每一個你消耗事件。

這也應該用於獲取數據庫,驗證和獲取收集。即

MongoClient mClient = new MongoClient(); 
//MongoClient mClient = new MongoClient("127.0.0.1", 27017); 
DB db = mClient.getDB("mms"); 
System.out.println("Connect success"); 
boolean auth = db.authenticate("user1", "passw0rd".toCharArray()); 
DBCollection coll = db.getCollection("tgps"); 

你開始接收事件之前,所有這些應該只發生一次

+0

感謝您的建議Orid,這是真的。我最終添加了MongoClient.Close而不是問題消失了。 – user3483621 2014-11-07 01:20:22

相關問題