// NewChord creates Chord instance func NewChord(group *Group, callback *signatures.TaskSignature) *Chord { // Generate a UUID for the chord callback callback.UUID = fmt.Sprintf("chord_%v", uuid.New()) // Add a chord callback to all tasks for _, task := range group.Tasks { task.ChordCallback = callback } return &Chord{Group: group, Callback: callback} }
// Publish places a new message on the default queue func (amqpBroker *AMQPBroker) Publish(signature *signatures.TaskSignature) error { _, channel, _, confirmsChan, err := amqpBroker.open() defer channel.Close() if err != nil { return err } message, err := json.Marshal(signature) if err != nil { return fmt.Errorf("JSON Encode Message: %v", err) } signature.AdjustRoutingKey( amqpBroker.config.ExchangeType, amqpBroker.config.BindingKey, amqpBroker.config.DefaultQueue, ) if err := channel.Publish( amqpBroker.config.Exchange, // exchange signature.RoutingKey, // routing key false, // mandatory false, // immediate amqp.Publishing{ ContentType: "application/json", Body: message, DeliveryMode: amqp.Persistent, }, ); err != nil { return err } confirmed := <-confirmsChan if confirmed.Ack { return nil } return fmt.Errorf("Failed delivery of delivery tag: %v", confirmed.DeliveryTag) }
// SendTask publishes a task to the default queue func (server *Server) SendTask(signature *signatures.TaskSignature) (*backends.AsyncResult, error) { // Make sure result backend is defined if server.backend == nil { return nil, errors.New("Result backend required") } // Auto generate a UUID if not set already if signature.UUID == "" { signature.UUID = fmt.Sprintf("task_%v", uuid.New()) } // Set initial task state to PENDING if err := server.backend.SetStatePending(signature); err != nil { return nil, fmt.Errorf("Set State Pending: %v", err) } if err := server.broker.Publish(signature); err != nil { return nil, fmt.Errorf("Publish Message: %v", err) } return backends.NewAsyncResult(signature, server.backend), nil }