Блоки переноса трубы при записи объекта с небольшим размером трубы - PullRequest
0 голосов
/ 12 марта 2010

У меня небольшая проблема с примером, который я сейчас тестирую. По какой-то причине выполнение блокируется при записи в oos.writeObject(new SimpleObject());, несмотря на тот факт, что канал должен передавать данные через, даже (я бы предположил), если он должен был делать это в меньших операциях из-за небольшого размера канала. В любом случае, пример завершается успешно, когда размер трубы больше, чем объект, и завершается неудачей, когда размер трубы меньше, чем объект. Если бы кто-нибудь мог пролить свет на это, это было бы очень ценно.

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.nio.ByteBuffer;

import org.apache.mina.filter.codec.serialization.ObjectSerializationInputStream;
import org.apache.mina.filter.codec.serialization.ObjectSerializationOutputStream;

public class ObjTest4 {
 public static void main(String[] args) {
  System.out.println("exec1");
  int objectsToSend = 10;
  int objectsRecvd = 0;

  try {
   System.out.println("exec2");

   PipedOutputStream pos = new PipedOutputStream();
   ObjectSerializationOutputStream oos = new ObjectSerializationOutputStream(pos);

   PipedInputStream pis = new PipedInputStream(pos, 500);
   ObjectSerializationInputStream ois = new ObjectSerializationInputStream(pis);

   oos.setMaxObjectSize(2000);
   ois.setMaxObjectSize(2000);

   while (objectsRecvd < objectsToSend) {
    System.out.println("exec3");

    oos.writeObject(new SimpleObject());

    System.out.println("exec3.1");

    oos.flush();

    System.out.println("exec3.2");

    System.out.println("oisavail: " + ois.available());

    Object o = ois.readObject();
    if (o != null) {
     objectsRecvd++;
     System.out.println("o: " + o);
    } else {
     System.out.println("recvd null");
    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
}

и класс для сериализуемого объекта:

package objtest;

import java.io.Serializable;
import java.util.EnumSet;

public class SimpleObject implements Serializable {
 /**
  * 
  */
 private static final long serialVersionUID = 1L;

 public String moo = "moo";
 public EnumSet<EnumTest> set = EnumSet.of(EnumTest.Test);
 public String moo2 = "moo2";
 public String moo3 = "moo3";
 public String moo4 = "moo4_";

 {
  for (int i = 0; i < 8; i++) {
   moo4 += moo4;
  }
 }

 /**
  * 
  */
 public SimpleObject() {
 // TODO Auto-generated constructor stub
 }

 /**
  * @return the moo
  */
 public String getMoo() {
  return moo;
 }

 /**
  * @param moo the moo to set
  */
 public void setMoo(String moo) {
  this.moo = moo;
 }
}

Приветствия
Chris

1 Ответ

0 голосов
/ 12 марта 2010

Извините, я обнаружил проблему - в документации Java написано не использовать потоковые потоки из одного потока, так как это может заблокировать поток :

Попытка использовать оба объекта из не рекомендуется использовать один поток, так как это может заблокировать поток.

...