簡體   English   中英

Spring Boot:在 Runnable 靜態線程中訪問 Autowired 組件

[英]Spring Boot: accessing Autowired component in Runnable static Thread

我需要在單獨的線程中訪問 @Component (TerminalLogHolder),該線程在靜態方法中啟動。 單獨線程中的組件沒有注入,所以我開始尋找解決方案並單獨找到了一種在靜態方法中訪問@Autowired組件的方法和一種使用applicationContext注入bean的方法,但是我無法制作它們一起工作。

這是代碼:

public class CommandExecutor {

    private static void printLog(Process process, String processLog) {
        ReadStream s1 = new ReadStream("stdin", process.getInputStream ());
        s1.start ();
    }

    public static class ReadStream implements Runnable {
        private String name;
        private String cmdId;
        private InputStream is;
        private Thread thread;

        @Autowired
        private TerminalLogHolder terminalLogHolder;

        public ReadStream(String name, InputStream is, String cmdId) {
            this.name = name;
            this.is = is;
            this.cmdId = cmdId;
        }

        public void start () {
            thread = new Thread (this);
            thread.start ();
        }

        public void saveLog(String s) {
            terminalLogHolder.addLog(cmdId, "[" + name + "] " + s);
        }

        public void run () {
            try {
                InputStreamReader isr = new InputStreamReader (is);
                BufferedReader br = new BufferedReader (isr);
                while (true) {
                    String s = br.readLine ();
                    if (s == null) break;
                    saveLog(s);
                }
                is.close ();
            } catch (Exception ex) {
                System.out.println ("Problem reading stream " + name + "... :" + ex);
                ex.printStackTrace ();
            }
        }
    }

}

我感謝您的幫助!

正如 chrylis -onstrike- 所建議的,解決方案是簡單的構造函數注入。

傳遞給其他地方的靜態方法對象 Autowired 就足夠了:

printLog(Process process, String processLog, TerminalLogHolder logHolder){
    ReadStream s1 = new ReadStream("stdin", process.getInputStream (), logHolder);
    s1.start ();
}

public static class ReadStream implements Runnable {
    private String name;
    private String cmdId;
    private InputStream is;
    private Thread thread;

    private TerminalLogHolder terminalLogHolder;

    public ReadStream(String name, InputStream is, String cmdId, TerminalLogHolder logHolder) {
        this.name = name;
        this.is = is;
        this.cmdId = cmdId;
        this.terminalLogHolder = logHolder;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM