Go SDK¶
The Go SDK provides publisher and consumer packages for interacting with SlackMQ.
Installation¶
Publishing¶
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/garysassano/slackmq/pkg/publisher"
"github.com/slack-go/slack"
)
func main() {
client := slack.New(os.Getenv("SLACK_BOT_TOKEN"))
pub, err := publisher.NewPublisher(client, os.Getenv("SMQ_TOPIC_CHANNEL"))
if err != nil {
log.Fatal(err)
}
ts, err := pub.Publish(context.Background(), "Order ORD-9042 confirmed")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Published: ts=%s topic=%s\n", ts, pub.TopicID())
}
Consuming¶
package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"github.com/garysassano/slackmq/pkg/consumer"
"github.com/slack-go/slack"
)
func main() {
client := slack.New(os.Getenv("SLACK_BOT_TOKEN"))
cons, err := consumer.NewConsumer(client, os.Getenv("SMQ_QUEUE_CHANNEL"))
if err != nil {
log.Fatal(err)
}
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer cancel()
err = cons.Consume(ctx, func(ctx context.Context, d *consumer.Delivery) error {
fmt.Printf("Received: %s (attempt %d)\n", d.Text, d.Attempt)
return d.Ack(ctx)
})
if err != nil && err != context.Canceled {
log.Fatal(err)
}
}
Key Types¶
Publisher¶
NewPublisher(client *slack.Client, channel string) (*Publisher, error)— create a publisher for a topic channelPublish(ctx context.Context, text string) (string, error)— post a message, returns the Slack timestampTopicID() string— returns the resolved channel ID
Consumer¶
NewConsumer(client *slack.Client, channel string) (*Consumer, error)— create a consumer for a queue channelConsume(ctx context.Context, handler func(ctx, *Delivery) error) error— start consuming messagesQueueID() string— returns the resolved channel ID
Delivery¶
Text string— the message contentAttempt int— current delivery attempt numberTopicChannel string— the originating topic channelAck(ctx context.Context) error— acknowledge successful processingNack(ctx context.Context) error— signal processing failure