2

我有一个 Web 应用程序,我可以从中启动另一个 Java 应用程序中的相应测试过程。我正在使用 Socket Programming 在 Web 应用程序和 Java 应用程序之间进行通信。

当我从 Web 应用程序请求特定进程时,来自 Java 应用程序的 SocketServer 会听到请求并启动一个线程进行测试进程。测试过程将初始化 FirefoxDriver 并启动浏览器并进行进一步的测试过程。

我的问题是,当我请求另一个进程名称不同的进程时,它会再次创建第二个线程并启动 firefox 浏览器,但这次它不考虑我的第二个进程,它开始执行第一个线程具有的相同进程。

我不明白该怎么做...对于每个进程,我都创建了一个新线程,但它会进一步执行相同的进程。我的输入在 Java 应用程序中被正确接收。请帮助我如何进行并发线程安全处理?我正在使用 GWT、Java、Seleniun FirefoxDriver。

这是在后台运行并侦听客户端请求的服务器代码:

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

得到了解决方案:我使用newSingleThreadExecutor() 而不是newCachedThreadPool()创建了ExecutorService ,并且还为每个新创建的 ServerThread 设置了 setDeamon(True)。 这是执行器文档

于 2012-10-12T13:24:40.890 回答
0

我能想到的两件事之一可能正在发生。

  1. 您正在将参数传递给您的 run() 函数,该函数链接回初始线程或...

  2. 您正在使用所有线程都可以访问的共享变量,并且该变量未正确更新或根本未更新。

如果您可以包含 SSCCE,这将有助于我们确定问题的真正所在。

于 2012-10-11T13:08:56.190 回答