我有一个 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 浏览器并启动进程。每次包含输入的客户端都是新的。