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