-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexample_test.go
84 lines (64 loc) · 1.86 KB
/
example_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package observation_test
import (
"fmt"
"time"
"github.com/AsynkronIT/protoactor-go/actor"
"github.com/artyomturkin/protoactor-go-observation"
)
//ExampleObservableActor simple observable actor for tests
type ExampleObservableActor struct {
observation.Mixin
data string
}
func (o *ExampleObservableActor) CurrentObservation() interface{} {
return o.data
}
// ensure ObservableActor implements observation.Observable interface
var _ observation.Observable = (*ExampleObservableActor)(nil)
func (o *ExampleObservableActor) Receive(ctx actor.Context) {
switch m := ctx.Message().(type) {
case string:
o.data = m
o.Notify(o.data)
}
}
//Printer
type Printer struct{}
func (p *Printer) Receive(ctx actor.Context) {
if m, ok := ctx.Message().(*observation.Observation); ok {
fmt.Printf("received observation with value %v\n", m)
}
}
func ExampleObservable() {
observableProps := actor.
FromProducer(func() actor.Actor { return &ExampleObservableActor{} }).
WithMiddleware(observation.Middleware)
printerProps := actor.
FromProducer(func() actor.Actor { return &Printer{} })
observable, err := actor.SpawnNamed(observableProps, "example.observable.actor")
if err != nil {
fmt.Printf("failed to spawn observable actor: %v\n", err)
panic(err)
}
printer, err := actor.SpawnNamed(printerProps, "printer")
if err != nil {
fmt.Printf("failed to spawn observer actor: %v\n", err)
panic(err)
}
observable.Tell(&observation.Subscribe{
PID: printer,
})
observable.Tell("hello")
observable.Tell(&observation.Unsubscribe{
PID: printer,
})
observable.Tell("hello again")
//wait for async events to complete
time.Sleep(1 * time.Millisecond)
//stop all actors
observable.GracefulStop()
printer.GracefulStop()
//Output:
//received observation with value &{example.observable.actor }
//received observation with value &{example.observable.actor hello}
}