Versions Compared

Key

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

...

PlantUML
skinparam dpi 80

@startuml
hide empty members
title Server to Client Queues - Class Diagram
class CacheClientNotifier {
  Singleton for a Cache.
}
class CacheClientProxy {
  One for each client.
  Keeps track of a the subscriptions for the client.
}
class MessageDispatcher {
  Thread that reads events from the queue.
}
class HARegionQueue {
  Holds the list of events to
  dispatch to a single client.
}
class HAContainerMap {
  Holds the actual values for events to dispatch.
  Used to store only a single copy of each value
  across all queues.
}
interface HAContainerMap
CacheClientNotifier "1   " o-- "*" CacheClientProxy
CacheClientProxy o-- MessageDispatcher
CacheClientNotifier o-- HAContainerMap
MessageDispatcher o-- HARegionQueue
HARegionQueue "*" --> "1" HAContainerMap
HARegionQueue o-- HARegion
@enduml


This next diagram focuses on cardinality:

  • between HARegionQueue and DACE (DispatchedAndCurrentEvents) objects (through the mis-named HARegionQueue.eventsMap)
  • between HARegion and the two kinds of entries it holds: <Position,Conflatable>, and <ThreadIdentifier,SequenceID>

The diagram introduces two types not actually present in the Java code. Both are depicted as subtypes of Long: SequenceID to stand for an event's sequence id; and Position to stand for a position in a queue. In the source code these are both just Longs.


PlantUML
@startuml

title HARegionQueue—Class Diagram\nHARegion and DACE Cardinalities

class SequenceID <<design class>>
Long <|-- SequenceID
class Position <<design class>>
Long <|-- Position

class HARegionQueue {
  Position tailKey
}

class DispatchedAndCurrentEvents {
 SequenceID lastDispatchedSequenceID
}

' these are together because I want to highlight the similarity (potential subtype relationship)
together {

  ' putting this first causes it to be layed out to the right of ThreadIdentifier, making the
  ' association (line) from Conflatable shorter
  class EventID {
    byte[]     membershipId
    long       threadId
    SequenceID sequenceId
    int        bucketId
  }

  class ThreadIdentifier {
    byte[]     membershipId
    long       threadId
  }
}

interface Conflatable

' these subtypes of Conflatable are grouped together
together {
  interface ClientMessage
  class HAEventWrapper
  class ConflatableObject
}

Conflatable <|-- HAEventWrapper

Conflatable <|-- ConflatableObject

Conflatable <|-- ClientMessage

interface ClientUpdateMessage

ClientMessage <|-- ClientUpdateMessage
ClientUpdateMessage <|-- ClientUpdateMessageImpl
ClientUpdateMessageImpl <|-- ClientInstantiatorMessage


ClientMessage <|-- ClientMarkerMessageImpl

Conflatable --> EventID

interface RegionQueue
RegionQueue <|-- HARegionQueue
HARegionQueue <|-- BlockingHARegionQueue
BlockingHARegionQueue <|-- DurableHARegionQueue
DistributedRegion <|-- HARegion

' while method signatures in HARegionQueue take Object, there's downcasting to Conflatable
HARegion "*" *-- "0..1 per Position" Conflatable

HARegion "*" *-- "0..1 per ThreadIdentifier" SequenceID

HARegionQueue *-- HARegion

HARegionQueue "1" *-- "0..1 per ThreadIdentifier" DispatchedAndCurrentEvents

DispatchedAndCurrentEvents "1" *-- "0..1 per Position" Position

' this hidden assoc changes layout such that cardinality text on SequenceID and Position isn't overlapping as much
ConflatableObject -[hidden]- HARegion

@enduml

...