Simple $system.Event examples
The attached file contains two $system.Event examples that processes work asynchronously using persistent queues:
- Events_Simple.prj.xml
- Events_PubSub.prj.xml - updated this example has been published on https://github.com/intersystems-ib/cache-iat-pubsub
Events_Simple
This is a very basic example that creates some worker processes and then enqueue messages to them using $system.Event.
; create shared resource, create worker jobs. USER>do ##class(IAT.S04.Event.Test).Setup() ; enqueue some messages to workers and see what happens USER>do ##class(IAT.S04.Event.Test).Run() Show log? no/[yes]: ^Samples.Log=10 ^Samples.Log(1)="[2016-02-19 09:43:14] Enqueuing 1" ^Samples.Log(2)="[2016-02-19 09:43:14] Worker 8168 grabs: 1" ^Samples.Log(3)="[2016-02-19 09:43:14] Enqueuing 2" ^Samples.Log(4)="[2016-02-19 09:43:14] Worker 18184 grabs: 2" ^Samples.Log(5)="[2016-02-19 09:43:14] Enqueuing 3" ^Samples.Log(6)="[2016-02-19 09:43:14] Worker 8168 grabs: 3" ^Samples.Log(7)="[2016-02-19 09:43:14] Enqueuing 4" ^Samples.Log(8)="[2016-02-19 09:43:14] Worker 18184 grabs: 4" ^Samples.Log(9)="[2016-02-19 09:43:14] Enqueuing 5" ^Samples.Log(10)="[2016-02-19 09:43:14] Worker 8168 grabs: 5" ; we are done. we could enqueue more messages or just kill worker jobs. write $system.Process.Terminate(8168) 1 write $system.Process.Terminate(18184) 1
Classes:
- Manager - methods to create shared resources and workers as well as to enqueue messages to workers.
- Queue - simple persistent class used to store messages
- Worker - worker class that waits for an event and processes the received message
Events_PubSub
This example is based on the same foundations as Events_Simple.
The goal here is building a simple Publisher-Subscriber model.
There are two subscribers:
- SubPatient which handles Patient related messages.
- SubDummy which handles dummy messages.
; create events and subscriber jobs do ##class(IAT.S05.PubSub.Example.Main).Setup() ; send some messages to channels do ##class(IAT.S05.PubSub.Example.Main).Run() ; show log zw ^PubSub.Log
Main classes:
Example classes:
Log: