TCPソケットを介した接続をリッスンするトランザクションサーバーであるJava(1.6)でサーバーアプリケーションを開発しています。新しい接続ごとに、接続が閉じられるまで存続する新しいスレッドが作成されます。各クライアントは、処理されるトランザクションをサーバーに送信し、応答がクライアントに返されます。
これはうまくいきます。同じソケットを介して多くの非同期トランザクション (またはメッセージ) を送信したい場合に問題が発生します。各トランザクション間に 10 ミリ秒の間隔で 1000 トランザクションを送信する小さなアプリケーションを作成しました。アプリケーションは非同期であるため、メッセージが送信され、応答が途中で返されます。
これは、着信メッセージを処理し、別のコンポーネントに送信して処理する部分のコードです (このコンポーネントにはスレッド プールがあります)。
public void run() {
...
...
socketBuf = new BufferedInputStream(input);
baos = new ByteArrayOutputStream();
while ((bytes_read = socketBuf.read(buffer)) != -1) {
if (bytes_read < 0) {
log.error("Tried to read from socket, read() returned < 0, Closing socket.");
return;
}
baos.write(buffer, 0, bytes_read);
break;
}
if (bytes_read >= 0) {
baos.flush();
byte data[] = baos.toByteArray();
if (data.length > 0) {
GWTranData tData = posMessage.decode(data, false);
if (tData.getMessageType() > 0) {
// Send to the Pre-Online Manager to be processed
PreOnlineJob newJob = new PreOnlineJob(tData);
newJob.addJobStatusListener(this);
GWServer.getPreOnlineInstance().addJob(newJob);
}
}
}
else {
clientSocket.close();
break;
}
} while(true);
}
短時間に多くのトランザクションを送信するときに直面する問題は、一部のメッセージが失われ、サーバーに到達しないことです。詳細な分析を行うと、メッセージの送信が速すぎると、バッファーに複数のメッセージが存在することがわかりました。そのため、data[] には 2 つ以上のメッセージがありますが、実行されるメッセージは 1 つだけです。送信されるメッセージのサイズは 200 バイトなので、512 のバッファで十分です。
ソケット読み取りを実装した方法に問題はありますか? より良い方法はありますか?
みんなありがとう。