2016-12-15 1 views
0

내 UI에서 오는 요청에 따라 HotFolder를 보는 요구 사항이 있습니다. 내 UI에서 시작 및 중지 버튼이 있습니다. 시작을 클릭하면 코드가 폴더를보고 클릭해야합니다. 그것을 멈추지 말아야한다. HotFolder를보기 위해 시계 서비스를 사용하고 있으며, 내 컨트롤러에서 플래그를 전달하여 서비스 시청을 시작하고 폴더 시청을 중지합니다. 폴더를 보는 것을 어떻게 멈추게 할 수 있습니까? 여기 시계 서비스 스레드를 죽이는 방법

는 코드 조각입니다 :

@RequestMapping(value = "/start", method = RequestMethod.GET) 
public ModelAndView hotFolder() 
{ 
    ModelAndView model = new ModelAndView(); 
    model.setViewName("welcomePage"); 

    HotFolder h = new HotFolder(); 
    h.hotfolderTesting(true); 
    return model; 
} 

@RequestMapping(value = "/stop", method = RequestMethod.POST) 
public ModelAndView hotFolderStop() 
{ 
    ModelAndView model = new ModelAndView(); 
    model.setViewName("welcomePage"); 

    HotFolder h = new HotFolder(); 
    h.hotfolderTesting(false); 
    return model; 
} 

HotFolder.java : 나는 내가 당신이라고 생각하게 주석을 볼 수 있기 때문에, 당신은 언급하지 않았다 확실히 뭔가가

public void hotfolderTesting(boolean flag) 
{ 
    try (WatchService service = FileSystems.getDefault().newWatchService()) { 
     Map<WatchKey, Path> keyMap = new HashMap<>(); 
     Path path = Paths.get("E:\\TestingWatch"); 
     keyMap.put(path.register(service, StandardWatchEventKinds.ENTRY_CREATE), path); 

     WatchKey watchKey; 
     if (flag) { 
      while (true) { 
       watchKey = service.take(); 
       for (WatchEvent<?> event : watchKey.pollEvents()) { 
        if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { 
         System.out.println("Created: " + event.context()); 
        } else if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) { 
         System.out.println("Deleted: " + event.context()); 
        } else if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { 
         System.out.println("Modified :" + event.context()); 
        } 
       } 
       if (!watchKey.reset()) { 
        break; 
       } 
      } 
     } 
    } catch (Exception ignored) { 
    } 
} 

답변

0

어떤 종류의 REST 기반 라이브러리를 사용한다.

어쨌든 코드는 절대로 작동하지 않습니다. 왜냐하면 기본적으로 질문에 대답하는 스레드를보고 스레드로 돌리므로 결코 그 일을하지 않을 것이기 때문입니다. {

public class HotFolder implements Runnable{ 
    private static HotFolder instance = null; 

    public static HotFolder getInstance(){ 
     if(instance == null) 
      instance = new HotFolder(); 
     return instance; 
    } 

    private boolean running = false; 
    private Thread t = null 
    private HotFolder(){ 
    } 

    public setRunning(boolean running){ 
     this.running = running; 
     if(running && t == null){ 
      t = new Thread(this); 
      t.start() 
     }else if(!running && t!= null){ 
      t = null; 
     } 
    } 

    public boolean getRunning(){ 
     return running; 
    } 

    public void run(){ 
     try (WatchService service = FileSystems.getDefault().newWatchService()) { 
      Map<WatchKey, Path> keyMap = new HashMap<>(); 
      Path path = Paths.get("E:\\TestingWatch"); 
      keyMap.put(path.register(service, StandardWatchEventKinds.ENTRY_CREATE), path); 
      WatchKey watchKey; 
      watchKey = service.take(); 
      do{ 
       for (WatchEvent<?> event : watchKey.pollEvents()) { 
        if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { 
         System.out.println("Created: " + event.context()); 
        } else if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) { 
         System.out.println("Deleted: " + event.context()); 
        } else if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { 
         System.out.println("Modified :" + event.context()); 
        } 
       } 
      }while(running && watchKey.reset()); 
     } catch (Exception ignored) { 
     } 
    } 
} 

을 그리고 당신은 내가 공공 무효 setRunning (부울 실행)에서 java.lang.IllegalThreadStateException을 얻고있다

//to activate 
HotFolder.getInstance().setRunning(true) 
//to stop it 
HotFolder.getInstance().setRunning(false) 
+0

처럼 전화 : I는 Singleto 패턴을 제안,이처럼 HotFolder 클래스를 작성합니다 \t \t this.running = running; \t \t 경우 (실행) { \t \t \t this.start(); \t \t \t} – user7076183

+0

좋아요. 스레드를 여러 개 이상 시작할 수없는 것 같습니다. 실행 파일을 사용하도록 코드를 변경하겠습니다. – bracco23

+0

아직 운이 없다 : (일부 스레드가 null이되는 .. 그리고 몇 번이나 .. 내가 HotFolder.getInstance(). setRunning (false) 메소드를 호출하고있는 중지 버튼을 클릭하더라도 여전히 폴더를보고 ..) 여전히 폴더에 생성 된 새 파일을 로깅합니다.) – user7076183

관련 문제