私は2つのアプリケーションをTCP上でJSONベースのメッセージと通信させようとしています。そのために私はJacksonライブラリ(1.9.4)を使用しています。クライアント側はソケットを開き、サーバーからのすべての着信メッセージをリッスンします。Json over Jackson with
ObjectMapper mapper = new ObjectMapper().configure(
Feature.AUTO_CLOSE_SOURCE, false);
final ObjectReader reader = mapper.reader(Message.class);
Socket s = new Socket("192.168.1.102", 32000);
final Reader in = new InputStreamReader(socket.getInputStream());
while (true) {
Message message = reader.readValue(in);
process(message)
}
したがって、メッセージが解析されて処理されるまで、読み取りがブロックされて処理されるまで待機します。 私の問題は、時には読むときにいくつかのメッセージがスキップされることです。サーバーがmsg1
、msg
、およびmsg3
を送信する場合は、msg2
が失われても問題ありませんが、msg3
が問題なく読み取られます。
これを奇妙にするには、これは常に起こるわけではなく、約50%です。クライアントとサーバーの両方がスレッド化されているため、他の誰もソケットにアクセスできません。そして、メッセージが到着したという事実を知り、nc
でクライアントをシミュレートしようとしました。着信メッセージは常に正しいので、読んでいると分かります。
TCPソケットなので、到着順序が保証されているので、ObjectReader
は何も例外を投げずに静かに廃棄していると思われます。
誰かが何が起こっているのかという手がかりを持っていますか?どんな考えも歓迎です! :)
「リーダー」とは何ですか?また、「readValue()」とは何ですか? –
ReaderはJacksonライブラリーのObjectReaderです。着信メッセージを読み込んで解析する必要があります(これはreadValue()メソッドで行われます) – Chirlo