|
@@ -93,6 +93,26 @@ public class KernelAdapter extends Thread
|
|
|
server.connectionClosed(p);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Note on threading for those writing their own server
|
|
|
+ * or adapter implementations. The rule that a single connection be
|
|
|
+ * processed by only one thread at a time is more about ensuring that
|
|
|
+ * the messages are delivered in the order that they are received
|
|
|
+ * than for any user-code safety. 99% of the time the user code should
|
|
|
+ * be writing for multithreaded access anyway.
|
|
|
+ *
|
|
|
+ * <p>The issue with the messages is that if a an implementation is
|
|
|
+ * using a general thread pool then it would be possible for a
|
|
|
+ * naive implementation to have one thread grab an Envelope from
|
|
|
+ * connection 1's and another grab the next Envelope. Since an Envelope
|
|
|
+ * may contain several messages, delivering the second thread's messages
|
|
|
+ * before or during the first's would be really confusing and hard
|
|
|
+ * to code for in user code.</p>
|
|
|
+ *
|
|
|
+ * <p>And that's why this note is here. DefaultServer does a rudimentary
|
|
|
+ * per-connection locking but it couldn't possibly guard against
|
|
|
+ * out of order Envelope processing.</p>
|
|
|
+ */
|
|
|
protected void dispatch( Endpoint p, Message m )
|
|
|
{
|
|
|
// Because this class is the only one with the information
|