1

사용자 용 폴더에서 CSV 파일을 처리하고 처리 후 데이터베이스에 저장해야하는 시나리오가 있습니다. 우리는 사용자 당 5 종류의 피드를 가지고 있습니다. 모든 사용자가 규칙 아래에 따를 필요, 처리를 위해 해당 폴더의 모든 시간을 어떤 피드를 보낼 수 있습니다복수 사용자를위한 csv 동시 처리

같은 클라이언트에 대한 공급의
  • 동일한 유형이 동일한에서 처리 할 수없는
      의미하는 시간은 항상되는 것을 차단해야 동시에 처리됩니다.
    • 이 같은 클라이언트

    이를 달성 할 수있는 좋은 방법은 무엇인가에 대한보다 "Y"파일의 동시 처리를 허용하지 않는보다 "X"클라이언트를 통해 동시 처리를 허용하지 않습니다?

  • +0

    so ... 예를 들어 파일 이름이 FEED1_CLIENT1입니까? – Eugene

    +0

    옙 FEED_CLIENT_TIMESTAMP.csv –

    답변

    0

    첫 번째 제한은 AtomicBoolean의 맵으로 구현 될 수 있습니다. 이것은 초기화 후에 맵의 키를 변경하지 않으므로 ConcurrentHashMap 일 필요는 없습니다. 완료되면 피드 값을 false로 재설정하는 것을 잊지 마십시오.

    checkAndProcessFeed(Feed feed, Map<String, AtomicBoolean> map) { 
        while(!map.get(feed.type).compareAndSet(false, true)) // assuming the AtomicBooleans were initialized to false 
         Thread.sleep(500); 
        } 
        process(feed); // at this point map.get(feed.type).get() == true 
        map.get(feed.type).set(false); // reset the AtomicBoolean to false 
    } 
    

    다른 두 제한

    는 클라이언트의 수와 당 클라이언트 파일을 유지하는 데 사용, AtomicInteger로 구현 될 수있다; 감소가 완료되면 compare-and-set을 사용하여 새 클라이언트/파일을 시작합니다.

    final int maxClient = 5; 
    AtomicInteger clientCount = new AtomicInteger(0); 
    ConcurrentLinkedQueue<Client> queue = new ConcurrentLinkedQueue<>(); // hold waiting clients 
    while(true) { 
        int temp = clientCount.intValue(); 
        if(!queue.isEmpty() && clientCount.compareAndSet(temp, temp + 1) { // thread-safe increment 
         process(clients.poll()); // don't forget to decrement the clientCount when the processing finishes 
        } else Thread.sleep(500); 
    } 
    
    +0

    감사합니다 Zim, 나에게 약속 해 보인다. 그러나 파일이 들어 왔을 때 동시에 여러 클라이언트에 대해 처리해야하는 한 가지가 있습니다. 논리가 어떻게 나타나야하는지에 대해서도 안내해주십시오. 이 스로틀 링 또는 스레드 풀링입니까? –

    +0

    당신은 이것을 위해 ThreadPoolExecutor와 같은 것을 사용할 것입니다; 'Processor'가'Runnable'을 구현하고'run' 메소드가 클라이언트 프로세싱 로직을 구현하는'threadPoolExecutor.execute (new Processor (clients.poll())'이 될 것입니다 –

    +0

    데이터베이스 잠금을 피하기 위해 동일한 유형의 피드를 동시에 처리하지 않으려 고합니다. –