blob: 93f275bfac8ddcc6517fccbf272d75dffae1ca66 [file] [log] [blame]
package electron_test
import (
"fmt"
"net"
"qpid.apache.org/amqp"
"qpid.apache.org/electron"
)
// Print errors
func check(msg string, err error) bool {
if err != nil {
fmt.Printf("%s: %s\n", msg, err)
}
return err == nil
}
func runServer(cont electron.Container, l net.Listener) {
for c, err := cont.Accept(l); check("accept connection", err); c, err = cont.Accept(l) {
go func() { // Process connections concurrently, accepting AMQP endpoints
for in := range c.Incoming() {
ep := in.Accept() // Accept all endpoints
go func() { // Process endpoints concurrently
switch ep := ep.(type) {
case electron.Sender:
m := amqp.NewMessageWith("hello yourself")
fmt.Printf("server %q sending %q\n", ep.Source(), m.Body())
ep.SendForget(m) // One-way send, client does not need to Accept.
case electron.Receiver:
if rm, err := ep.Receive(); check("server receive", err) {
fmt.Printf("server %q received %q\n", ep.Target(), rm.Message.Body())
err := rm.Accept() // Client is waiting for Accept.
check("accept message", err)
}
}
}()
}
}()
}
}
func startServer() (addr net.Addr) {
cont := electron.NewContainer("server")
if l, err := net.Listen("tcp", ""); check("listen", err) {
addr = l.Addr()
go runServer(cont, l)
}
return addr
}
// Connect to addr and send/receive a message.
func client(addr net.Addr) {
if c, err := electron.Dial(addr.Network(), addr.String()); check("dial", err) {
defer c.Close(nil)
if s, err := c.Sender(electron.Target("target")); check("sender", err) {
fmt.Printf("client sending\n")
s.SendSync(amqp.NewMessageWith("hello")) // Send and wait for server to Accept()
}
if r, err := c.Receiver(electron.Source("source")); check("receiver", err) {
if rm, err := r.Receive(); err == nil {
fmt.Printf("client received %q\n", rm.Message.Body())
}
}
}
}
// Example client and server communicating via AMQP over a TCP/IP connection.
//
// Normally client and server would be separate processes.
// For more realistic examples:
// https://github.com/apache/qpid-proton/blob/master/examples/go/README.md
//
func Example_clientServer() {
addr := startServer()
client(addr)
// Output:
// client sending
// server "target" received "hello"
// server "source" sending "hello yourself"
// client received "hello yourself"
}