これらのような同様の質問を探していましたが、私の要件には特別なものが必要だと思います。詳しく説明します。
まず、以前はこのように機能していたシステムを移行する必要があります。
- ServerPool(Thread) というクラスは、メイン クラスで初期化されます。
- この ServerPool は、ソケットを受信するためのキューと、ワーカー スレッドを管理するためのベクトルを作成します (S.
したがって、プールのコードには次のものがあります。
public class ServerPool extends Thread {
private LinkedBlockingQueue<SearchQuery> workQueue; //SearchQuery is a Class I defined which can handle two type of processes (for sockets and for single Strings)
private Vector<SearchThread> workers;
private final int NTHREADS = 10;
private int typeOfQuery;
public ServerPool() {
workers = new Vector<SearchThread>(NUM_THREAD);
workQueue = new LinkedBlockingQueue<SearchQuery>();
this.typeOfQuery = typeOfQuery;
SearchThread search = new SearchThread(workQueue);
search.start();
workers.add(search);
}
public void run() {
while(true){
SearchQuery client = null;
if (typeOfQuery == 1) {
client = new SocketQuery(....);
} else if (typeOfQuery == 2) {
client = new StringQuery(...);
}
workQueue.put(client);
}
}
プロセスを実行する SearchThread の場合:
public class SearchThread extends Thread {
private LinkedBlockingQueue<SearchQuery> workQueue = null;
private SearchQuery request = null;
public SearchThread(LinkedBlockingQueue<SearchQuery> workSource) {
workQueue = workSource;
}
public void run() {
request = workQueue.take();
//Here I process the request
//And use a PrintWriter to give a "response"
}
}
これは以前はソケットでtelnetを使って動いていたのですが、今はWebサービスに変換してほしいと依頼されたので、Webサービスとしては値を返すはずなので、Callable、Future、Thread Poolsを使うことを考えていますが、まったく同じ動作を再現できないため、これを実装してみました:
public class NewServerPool {
private final int NTHREADS = 10;
private ExecutorService executor;
private LinkedBlockingQueue<SearchQuery> workQueue;
private Vector<Future<String>> futures;
private boolean end = true;
public NewServerPool(int port, SearchQuery typeOfQuery) {
executor = Executors.newFixedThreadPool(NTHREADS);
workQueue = new LinkedBlockingQueue<SearchQuery>();
futures = new Vector<Future<String>>();
}
}
そして、今では Callable になっている検索スレッドの場合
public class NewSearchThread implements Callable<String>{
private SearchQuery searchQuery;
public NewSearchThread(SearchQuery searchQuery) {
this.searchQuery = searchQuery;
}
@Override
public String call() throws Exception {
String xmlResponse = null;
if (searchQuery == null) {
throw new InvalidSearchQueryException("The search query is not valid or has null value: " + searchQuery);
}
if (searchQuery instanceof SocketTimed) {
System.out.println("It is socket timed query type");
} else if (searchQuery instanceof WebServiceQuery) {
System.out.println("It is a web service query type");
}
xmlResponse = searchQuery.manageResponse();
return xmlResponse;
}
この場合、WebService がサーバー プール (NewServerPool) の新しいインスタンスを呼び出すと仮定すると、サーバー プールでスタックしてしまいました。どうすればこれを続行できますか? 誰かが私を助けてくれれば、本当に感謝します。よろしくお願いします。