chore(examples/event): add memory and rename Message to Event (#1282)
* chore(examples/event): add memory and rename Message to Eventpull/1420/head
parent
de55281108
commit
1517321dd8
@ -0,0 +1,84 @@ |
||||
package memory |
||||
|
||||
import ( |
||||
"context" |
||||
"github.com/go-kratos/kratos/examples/event/event" |
||||
"log" |
||||
"sync" |
||||
) |
||||
|
||||
var _ event.Sender = (*memorySender)(nil) |
||||
var _ event.Receiver = (*memoryReceiver)(nil) |
||||
var _ event.Event = (*Message)(nil) |
||||
|
||||
var ( |
||||
chanMap = struct { |
||||
sync.RWMutex |
||||
cm map[string]chan *Message |
||||
}{} |
||||
ChanSize = 256 |
||||
) |
||||
|
||||
func init() { |
||||
chanMap.cm = make(map[string]chan *Message) |
||||
} |
||||
|
||||
type Message struct { |
||||
key string |
||||
value []byte |
||||
} |
||||
|
||||
func (m *Message) Key() string { |
||||
return m.key |
||||
} |
||||
|
||||
func (m *Message) Value() []byte { |
||||
return m.value |
||||
} |
||||
|
||||
type memorySender struct { |
||||
topic string |
||||
} |
||||
|
||||
func (m *memorySender) Send(ctx context.Context, msg event.Event) error { |
||||
chanMap.cm[m.topic] <- &Message{ |
||||
key: msg.Key(), |
||||
value: msg.Value(), |
||||
} |
||||
return nil |
||||
} |
||||
func (m *memorySender) Close() error { |
||||
return nil |
||||
} |
||||
|
||||
type memoryReceiver struct { |
||||
topic string |
||||
} |
||||
|
||||
func (m *memoryReceiver) Receive(ctx context.Context, handler event.Handler) error { |
||||
go func() { |
||||
for msg := range chanMap.cm[m.topic] { |
||||
err := handler(context.Background(), msg) |
||||
if err != nil { |
||||
log.Fatal("message handling exception:", err) |
||||
} |
||||
} |
||||
}() |
||||
return nil |
||||
} |
||||
|
||||
func (m *memoryReceiver) Close() error { |
||||
return nil |
||||
} |
||||
|
||||
func NewMemory(topic string) (event.Sender, event.Receiver) { |
||||
chanMap.RLock() |
||||
if _, ok := chanMap.cm[topic]; !ok { |
||||
//chanMap.Lock()
|
||||
chanMap.cm[topic] = make(chan *Message, ChanSize) |
||||
//chanMap.Unlock()
|
||||
} |
||||
defer chanMap.RUnlock() |
||||
|
||||
return &memorySender{topic: topic}, &memoryReceiver{topic: topic} |
||||
} |
@ -0,0 +1,33 @@ |
||||
package memory |
||||
|
||||
import ( |
||||
"context" |
||||
"fmt" |
||||
"github.com/go-kratos/kratos/examples/event/event" |
||||
"testing" |
||||
"time" |
||||
) |
||||
|
||||
func TestSendAndReceive(t *testing.T) { |
||||
send, receive := NewMemory("test") |
||||
err := receive.Receive(context.Background(), func(ctx context.Context, event event.Event) error { |
||||
t.Log(fmt.Sprintf("key:%s, value:%s\n", event.Key(), event.Value())) |
||||
return nil |
||||
}) |
||||
|
||||
if err != nil { |
||||
t.Error(err) |
||||
} |
||||
|
||||
for i := 0; i < 5; i++ { |
||||
err := send.Send(context.Background(), &Message{ |
||||
key: "kratos", |
||||
value: []byte("hello world"), |
||||
}) |
||||
if err != nil { |
||||
t.Error(err) |
||||
} |
||||
} |
||||
|
||||
time.Sleep(5 * time.Second) |
||||
} |
Loading…
Reference in new issue