marcus.wolsc...@googlemail.com wrote: > Hello, > > I am trying to use the EntityBuffer -class but seem to be doing something > wrong here. > > I did: > > XMReader task = new ... > EntityBuffer buffer = new EntityBuffer(BUFFERCAPACITY); > > task.setSink(buffer); > buffer.setSink(sink); > > buffer.run(); > task.run(); > > > It seems that this hangs indefinately waiting for entities to > come in from the buffer. > Do I need to call some special method or use a special > manager-class to make the buffer start it's Executor or Thread? > The key reason for using EntityBuffer is to separating processing into multiple threads. It is a key class implementing the --buffer task whose main reason for existing is to spread the pipeline execution across multiple threads and therefore CPU cores.
So, the reason you're having a problem is because the buffer.run() method must be run in a separate thread to the task feeding data into it. The input thread calling the process method will block when the buffer becomes full. Likewise, the buffer.run thread will block until data becomes available. If you call both from the same thread the first one will never complete. Internally there are actually three buffers. The first is unsynchronised and allows the input thread to accumulate a number of entities before gaining the main lock. The second is synchronised and is shared between the two threads. The third is unsynchronised and allows the output thread to retrieve a number of records from the second buffer reducing the number of times the lock has to be obtained. If all you want is a way of buffering data within a single thread then EntityBuffer isn't what you're looking for but I've never found a case where buffering without an additional thread improves performance, I've always had more like using file buffers, database transactions, multi-row inserts, etc to achieve that. There is a class called TaskRunner which is a Thread class that allows you to detect when errors occur within the thread, it might be useful for you. If you want an example of its use check out the ActiveTaskManager which is used to run all tasks requiring their own thread (ie. all reading tasks and some others), and the ChangeDownloader task which is used for concurrently reading and merging many files into a single change stream. Brett _______________________________________________ osmosis-dev mailing list osmosis-dev@openstreetmap.org http://lists.openstreetmap.org/listinfo/osmosis-dev