[jboss-dev-forums] [Design of Messaging on JBoss (Messaging/JBoss)] - JBoss 2.0 Thread model

timfox do-not-reply at jboss.com
Tue Apr 1 12:48:41 EDT 2008


OOOPS! Sorry I accidentally deleted this thread while doing some forum housekeeping! :)

Here it is in an ugly form I'm afraid:

jmesnil said:
anonymous wrote : 
  | JBM 2 is using MINA as its remoting API.
  | All JMS connections and their children (session, producer, consumer) to the same JMS server use a single MINA NioSocketConnector (i.e. one single TCP socket).
  | This means that all the JMS resources associated to the same JMS server share the same MINA IoSession.
  | In turn, this means that the messages sent by 2 JMS Sessions created from the same JMS Connection are ordered globally. This is a performance-killer and less than optimal : order must be ensured at the JMS Session level only.
  | 
  | One potential solution is to use 1 MINA IoSession per JMS Session + 1 MINA IoSession for each JMS connection. 
  | This solution is simple to implement.
  | However this means having many TCP sockets open between a JMS client and a server...
  | 
  | The other solution is to introduce a customized ExecutorFilter to process MINA messages in other threads than the I/O process thread and still  ensure that messages associated to a JMS Session and its children are treated by the same thread.
  | 
  | How to implement this ExecutorFilter?
  | 
  | The filter will have a ThreadFactory.
  | When a MINA message is sent/received, we look for a thread associated to the message target (AbstractPacket.targetID).
  | We need to correlate the session ID based on this targetID (the target can be a JMS Producer or Consumer)
  | Once we got the JMS Session ID, we use it a key to look up in a Map to get a Thread in return.
  | If there is such a thread, we use it.
  | Otherwise, we get a new thread and associate it to the JMS Session ID.
  | We can use a WeakValueHashmap (from jboss-common) with the targetID as the key and the thread as the weak value.
  | 
  | Thread life cycle
  | 
  | We get a new thread when we see a new JMS Session ID.
  | However, we do not know a priori when all messages targeted to a JMS Session have been send or received.
  | We can parse all the messages to find one corresponding to closing the JMS Session but is not a good idea to have to parse every message to identify this few messages.
  | Instead, the threads can have a keep alive time (e.g. 60 seconds) before being reclaimed (and thus being removed from the WeakValueHashmap).
  | If a thread associated to a JMS Session ID is reclaimed while the Session is still open, we create a new one next time we receive a message with this ID.
  | 
  | We also need to have threads to execute JMS Connection messages.
  | 
  | ID correlation
  | 
  | For now, each JMS resources has a random UUID.
  | We need to be able to deduce a JMS Session ID from one of its children ID (Producer, Consumer, QueueBrowser).
  | Their IDs could be prepended by a JMS Session ID (e.g. <session ID>/<resource ID>).
  | Or we can add a new attribute to the Packet interface (e.g. resourceID) which will be set either to a JMS Connection ID (for JMS Connections) or a JMS Session ID (for JMS Sessions, Producers, Consumers & QueueBrowsers).
  | This resourceID will be used as the key to the WeakValueHashMap.
  | This latest solution avoid parsing text for every message but adds a bit to the message size.
  | 
  | wdyt?
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4140634#4140634

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4140634



More information about the jboss-dev-forums mailing list