別の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ブラウザーを初期化し、プロセスを開始します。クライアントは、入力を含むたびに新しいものです。