2011-01-10 4 views
1

自分のプロジェクトにjava NIOを使用する予定ですが、私の要件の1つは要求を構成可能に保つことです。つまり、クライアントは次の要求を選択できます。ノンブロッキングNIOで設定可能なブロッキングとノンブロッキング要求

同期でNIOを使用することは可能ですか?方法?私はそれが真作るとき、私はこのエラーを取得し、

SocketChannel socketChannel = SocketChannel.open(); 
socketChannel.configureBlocking(true); 

しかし:

があり、チャネルを作成し、クライアントコードでオプションです。

Thisは、this tutorialから使用しているクライアントコードです。

java.nio.channels.IllegalBlockingModeException 
    at java.nio.channels.spi.AbstractSelectableChannel.register(AbstractSelectableChannel.java:172) 
    at java.nio.channels.SelectableChannel.register(SelectableChannel.java:254) 
    at com.dds.client.DDSClient.run(DDSClient.java:77) 
    at java.lang.Thread.run(Thread.java:680) 

答えて

2

あなたがブロックモードであるチャネル上でメソッドを呼び出す場合、その例外スローされることregister(...)状態のjavadoc。セレクタは非ブロッキングチャネルのみを処理できます。

あなたはセマンティクスを遮断するとき、むしろregisterselectよりも、ブロック操作(例えばreadまたはwrite)を使用するようにコードを変更する必要があります。

+0

私はNIOを新しくしました。read()/ write()のコード変更の指針(クライアントコード上の変更はwrite()のみになります) – zengr

+0

@zengr:read()とwrite()の呼び出しは変更されません。私の答えを見てください。 – EJP

1

ブロックチャネルでselect()を使用することはできません。これはJavadocのように言えます。多かれ少なかれチャネルごとにスレッドのモデルを使用する必要があります。

この奇妙な要件の理由は何ですか?

+0

「奇妙な要求」があるのは間違いなくNIOです。対応するPOSIX関数にはこの制限はありません。ブロッキングソケットで 'select() 'を呼び出すことは完全に正当です。 – finnw

+0

@finnw:クライアントがブロッキングモードを選択するという奇妙な要件を指しています。使用しているWindows APIには、select()が非ブロックモードを必要とするのと同じ要件があります。 – EJP

+0

理由:クライアント側にAPIを提供する必要があります。データがあまり重要でない場合は、非ブロッキング(非同期)にする必要があり、永続化するデータが非常に重要な場合は、クライアントはデータが保存されたかどうかをACKで取得する必要があります。 NIOを正しく理解していますか?同じ類推:MDB対セッション? – zengr

関連する問題