2

別のJavaアプリにあるそれぞれのテストプロセスを開始できるWebアプリケーションが1つあります。WebアプリとJavaアプリ間の通信にソケットプログラミングを使用しています。

Webアプリから特定のプロセスをリクエストすると、JavaアプリのSocketServerがリクエストを聞き、テストプロセス用に1つのスレッドを開始します。テストプロセスはFirefoxDriverを初期化し、ブラウザを起動し、さらにテストプロセスを実行します。

私の問題は、別のプロセス名で別のプロセスを要求すると、再び2番目のスレッドが作成され、Firefoxブラウザーが起動しますが、今回は2番目のプロセスを考慮せず、最初のスレッドと同じプロセスを実行し始めました。

何をすべきかわかりません...すべてのプロセスに対して新しいスレッドを作成しましたが、さらに同じプロセスを実行します。私の入力はJavaアプリで正しく受信されます。助けてください並行スレッドセーフ処理を行うにはどうすればよいですか?私はGWT、Java、SeleniunFirefoxDriverを使用しています。

これは、バックグラウンドで実行され、クライアント要求をリッスンするサーバーコードです。

static final int PORT = 6789;

    public static void main(String args[]) {
        ServerSocket serverSocket = null;
        Socket socket = null;
            try {
            InitializeApplication application = new InitializeApplication();
            application.initialize();

            serverSocket = new ServerSocket(PORT);
        } catch (Exception e) {
            log("Exception in SocketServerExecutor !!!",e);
        }
        while (true) {
            try {
                socket = serverSocket.accept();
            } catch (Exception e) {
                log("Exception in SocketServerExecutor !!!",e);
            }
            Thread thread = new Thread(new SocketServerThread(socket));
            thread.start();
        }
    }

これはプロセスを開始するスレッドです:

 private Socket client;

        public SocketServerThread(Socket serverSocket) {
            this.client = serverSocket;
        }

        /**
         * Starts appropriate process depending on process name from input.
         * Input string contains:
         * process name
         */
        public void run() {
            DataOutputStream outputStream = null;
            String param = null; 

            try{
                log("Just connected to "+ client.getRemoteSocketAddress());
                    try {
                        while ((param = in.readUTF()) != null){
                            log("got parameteres from client (i.e. from web app): "+param);
                            break;
                        }
                    } catch (Exception e) { }
                    if(param!=null && !param.isEmpty()){
                        String process = params[0];

                        ProcessManager manager = new ProcessManager();
                        if(process.equals("testUser"))
                            manager.startUserProcess(process);
                        else if(process.equals("testCustomer"))
                            manager.startCustomerProcess(process);

                    }
            }catch(Exception exc){
                if(exc instanceof SocketTimeoutException)
                    log("Socket timed out! [SocketServerThread]",exc);
                else if(exc instanceof BindException)
                    log("BindException in SocketServerThread !!!",exc);
                log(Level.SEVERE, "Exception in SocketServerThread !!!",exc);
            }
        }

これはProcessManagerです。

public void starUserProcess(String siteName) {
        ExecutorService executerService = null;
        try{
            Callable<Object> callable = new ProcessThread(siteName);
            executerService = Executors.newCachedThreadPool();
            Future<Object> future = executerService.submit(callable);
            future.get();

            log("[ProcessManager] Process completed for "+process);  
            System.exit(0);
        }catch (Exception e) {
            log("[ProcessManager]::Exception");
            log(ex);
        }
    }

ProcessThreadは、必要なすべてのものとFirefoxブラウザーを初期化し、プロセスを開始します。クライアントは、入力を含むたびに新しいものです。

4

2 に答える 2

0

頭のてっぺんからできることの2つのうちの1つが起こっている可能性があります。

  1. 最初のスレッドにリンクするrun()関数にパラメーターを渡しているか...

  2. すべてのスレッドにアクセスできる共有変数を使用していて、変数が適切に更新されていないか、まったく更新されていません。

SSCCEを含めることができれば、問題が本当にどこにあるのかを判断するのに役立ちます。

于 2012-10-11T13:08:56.190 に答える
0

解決策を得ました:newCachedThreadPool() の代わりにnewSingleThreadExecutor( )を使用してExecutorServiceを作成し、新しく作成されたすべてのServerThreadに対してsetDeamon(True)も作成しました。 これがエグゼキュータのドキュメントです

于 2012-10-12T13:24:40.890 に答える