Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

A message is just a record in a database table which has a timestamp (which determines the ordering), and other fields.

...

  • Queues can be sent to directly or from topics
  • A queue can shouldnt have the same name as a topic.  If there is a topic with that name it will supercede the queue when messages are sent
  • There is a built in folder for queues in grouper: <ATTRIBUTE_ROOT_STEM_CONFIGURED_NAME>:grouperMessageQueues.  
  • A queue is a permission resource in that folder of attributeDef <ATTRIBUTE_ROOT_STEM_CONFIGURED_NAME>:messages:grouperMessageQueueDef
  • The action to send to a topic is "send_to_queue", grant that to a subject who is allowed to send messages to the queue
  • The action to receive from a queue is "receive", grant that to a subject who is allowed to pull messages off the queue
Code Block
grouperSession = GrouperSession.startRootSession();
  
GrouperBuiltinMessagingSystem.createQueue("abc"); 
GrouperBuiltinMessagingSystem.deleteQueue("abc");


// permissions on objects
GrouperBuiltinMessagingSystem.allowSendToQueue("abc", SubjectTestHelper.SUBJ0);
GrouperBuiltinMessagingSystem.allowReceiveFromQueue("abc", SubjectTestHelper.SUBJ0);
GrouperBuiltinMessagingSystem.disallowSendToQueue("abc", SubjectTestHelper.SUBJ0);
GrouperBuiltinMessagingSystem.disallowReceiveFromQueue("abc", SubjectTestHelper.SUBJ0);

 

Setup topics

  • There is a built in folder for topics in grouper: <ATTRIBUTE_ROOT_STEM_CONFIGURED_NAME>:grouperMessageTopics.  
  • A topic is a permission resource in that folder of attributeDef <ATTRIBUTE_ROOT_STEM_CONFIGURED_NAME>:messages:grouperMessageTopicDef
  • The action to send to a topic is "send_to_topic", grant that to a subject who is allowed to send messages to the topic
  • You cannot read from a topic, the topic will send to queues, and you can grant that on queues
  • To setup the relationship between a topic and queue(s), setup a permission resource implied relationship between the topic and the queues
Code Block
grouperSession = GrouperSession.startRootSession();
  
GrouperBuiltinMessagingSystem.createTopic("def");
GrouperBuiltinMessagingSystem.deleteTopic("def");
 
// permissions on objects
GrouperBuiltinMessagingSystem.allowSendToTopic("abc", SubjectTestHelper.SUBJ0);
GrouperBuiltinMessagingSystem.disallowSendToTopic("abc", SubjectTestHelper.SUBJ0);

Performance

  • This system (with local HSQL database) can process (send / receive / acknowledge) 
    • 125 messages per second in one thread
    • 312 messages per second in 10 threads

...

Column nameDescriptionIndexForeign key
 IDdb uuid for this row  
HIBERNATE_VERSION_NUMBERincrementing number so two updates dont occur at once (optimistic locking)  
SENT_TIME_MICROSmicroseconds since 1970 this message was sent (note this is unique for one jvm, this is probably unique across jvms, but not necessarily)  
GET_ATTEMPT_TIME_MILLISmilliseconds that the message was attempted to be received. If the message is not confirmed in a certain amount of time, the state will be set back to IN_QUEUE to try again  
GET_ATTEMPT_COUNThow many times this message has been attempted to be retrieved  
STATEstate of this message: IN_QUEUE, GET_ATTEMPTED, PROCESSED  
GET_TIME_MILLISmillis since 1970 that this message was successfully received  
FROM_MEMBER_IDmember id of user who sent the message foreign key to grouper_members.id
QUEUE_NAMEqueue name for the message that it is delivered to (note, topics can send to multiple queues, which will duplicate the message)  
MESSAGE_BODYmessage body  
ATTEMPT_TIME_EXPIRES_MILLISmillis since 1970 that this attempt will expire before it is acknowledged. After it expires it will be delivered again when receive() is called  


See Also:

Grouper Messaging System

...