2014-11-28 15:16:49 -06:00
package bus
import (
2016-10-03 02:38:03 -05:00
"context"
2018-04-27 06:41:58 -05:00
"errors"
2020-11-17 04:27:45 -06:00
"fmt"
2014-11-28 15:16:49 -06:00
"reflect"
2020-11-27 07:58:45 -06:00
2021-07-15 07:33:38 -05:00
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/setting"
2020-11-27 07:58:45 -06:00
"github.com/opentracing/opentracing-go"
2014-11-28 15:16:49 -06:00
)
2019-06-04 15:00:05 -05:00
// HandlerFunc defines a handler function interface.
2014-12-16 09:45:07 -06:00
type HandlerFunc interface { }
2019-06-04 15:00:05 -05:00
// Msg defines a message interface.
2014-12-16 09:45:07 -06:00
type Msg interface { }
2014-11-28 15:16:49 -06:00
2019-06-04 15:00:05 -05:00
// ErrHandlerNotFound defines an error if a handler is not found
2018-04-27 06:41:58 -05:00
var ErrHandlerNotFound = errors . New ( "handler not found" )
2019-06-04 15:00:05 -05:00
// TransactionManager defines a transaction interface
2018-06-07 14:54:36 -05:00
type TransactionManager interface {
InTransaction ( ctx context . Context , fn func ( ctx context . Context ) error ) error
2018-06-05 14:13:53 -05:00
}
2019-06-04 15:00:05 -05:00
// Bus type defines the bus interface structure
2014-12-01 10:56:03 -06:00
type Bus interface {
2014-12-16 09:45:07 -06:00
Dispatch ( msg Msg ) error
2016-10-03 02:38:03 -05:00
DispatchCtx ( ctx context . Context , msg Msg ) error
2015-01-09 09:36:23 -06:00
Publish ( msg Msg ) error
2021-11-19 06:56:42 -06:00
PublishCtx ( ctx context . Context , msg Msg ) error
2015-02-04 08:37:26 -06:00
2018-06-05 14:13:53 -05:00
// InTransaction starts a transaction and store it in the context.
// The caller can then pass a function with multiple DispatchCtx calls that
// all will be executed in the same transaction. InTransaction will rollback if the
2018-06-07 11:02:28 -05:00
// callback returns an error.
2018-06-05 14:13:53 -05:00
InTransaction ( ctx context . Context , fn func ( ctx context . Context ) error ) error
2014-12-16 09:45:07 -06:00
AddHandler ( handler HandlerFunc )
2018-06-07 15:03:27 -05:00
AddHandlerCtx ( handler HandlerFunc )
2015-01-09 09:36:23 -06:00
AddEventListener ( handler HandlerFunc )
2021-11-19 06:56:42 -06:00
AddEventListenerCtx ( handler HandlerFunc )
2018-06-05 14:13:53 -05:00
// SetTransactionManager allows the user to replace the internal
2020-06-01 10:11:25 -05:00
// noop TransactionManager that is responsible for managing
2018-06-05 14:13:53 -05:00
// transactions in `InTransaction`
2018-06-07 14:54:36 -05:00
SetTransactionManager ( tm TransactionManager )
2018-06-05 14:13:53 -05:00
}
2019-06-04 15:00:05 -05:00
// InProcBus defines the bus structure
2014-12-01 10:56:03 -06:00
type InProcBus struct {
2021-11-19 06:56:42 -06:00
logger log . Logger
handlers map [ string ] HandlerFunc
handlersWithCtx map [ string ] HandlerFunc
listeners map [ string ] [ ] HandlerFunc
listenersWithCtx map [ string ] [ ] HandlerFunc
txMng TransactionManager
2014-12-01 10:56:03 -06:00
}
2014-11-28 15:16:49 -06:00
2021-08-25 08:11:22 -05:00
func ProvideBus ( ) * InProcBus {
return globalBus
}
// InTransaction defines an in transaction function
func ( b * InProcBus ) InTransaction ( ctx context . Context , fn func ( ctx context . Context ) error ) error {
return b . txMng . InTransaction ( ctx , fn )
}
2014-12-16 05:04:08 -06:00
// temp stuff, not sure how to handle bus instance, and init yet
var globalBus = New ( )
2019-06-04 15:00:05 -05:00
// New initialize the bus
2021-08-25 08:11:22 -05:00
func New ( ) * InProcBus {
return & InProcBus {
2021-11-19 06:56:42 -06:00
logger : log . New ( "bus" ) ,
handlers : make ( map [ string ] HandlerFunc ) ,
handlersWithCtx : make ( map [ string ] HandlerFunc ) ,
listeners : make ( map [ string ] [ ] HandlerFunc ) ,
listenersWithCtx : make ( map [ string ] [ ] HandlerFunc ) ,
txMng : & noopTransactionManager { } ,
2021-07-15 07:33:38 -05:00
}
2014-11-28 15:16:49 -06:00
}
2018-04-27 06:41:58 -05:00
// Want to get rid of global bus
func GetBus ( ) Bus {
return globalBus
}
2019-06-04 15:00:05 -05:00
// SetTransactionManager function assign a transaction manager to the bus.
2018-06-07 14:54:36 -05:00
func ( b * InProcBus ) SetTransactionManager ( tm TransactionManager ) {
b . txMng = tm
2018-06-05 14:13:53 -05:00
}
2019-06-04 15:00:05 -05:00
// DispatchCtx function dispatch a message to the bus context.
2016-10-03 02:38:03 -05:00
func ( b * InProcBus ) DispatchCtx ( ctx context . Context , msg Msg ) error {
var msgName = reflect . TypeOf ( msg ) . Elem ( ) . Name ( )
2020-11-27 07:58:45 -06:00
span , ctx := opentracing . StartSpanFromContext ( ctx , "bus - " + msgName )
defer span . Finish ( )
span . SetTag ( "msg" , msgName )
2021-07-15 07:33:38 -05:00
withCtx := true
2018-06-08 03:51:27 -05:00
var handler = b . handlersWithCtx [ msgName ]
2016-10-03 02:38:03 -05:00
if handler == nil {
2021-07-15 07:33:38 -05:00
withCtx = false
handler = b . handlers [ msgName ]
if handler == nil {
return ErrHandlerNotFound
}
2016-10-03 02:38:03 -05:00
}
2018-06-08 03:51:27 -05:00
var params = [ ] reflect . Value { }
2021-07-15 07:33:38 -05:00
if withCtx {
params = append ( params , reflect . ValueOf ( ctx ) )
} else if setting . Env == setting . Dev {
b . logger . Warn ( "DispatchCtx called with message handler registered using AddHandler and should be changed to use AddHandlerCtx" , "msgName" , msgName )
}
2018-06-08 03:51:27 -05:00
params = append ( params , reflect . ValueOf ( msg ) )
2016-10-03 02:38:03 -05:00
ret := reflect . ValueOf ( handler ) . Call ( params )
err := ret [ 0 ] . Interface ( )
if err == nil {
return nil
}
Outdent code after if block that ends with return (golint)
This commit fixes the following golint warnings:
pkg/bus/bus.go:64:9: if block ends with a return statement, so drop this else and outdent its block
pkg/bus/bus.go:84:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:137:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:177:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:183:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:199:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:208:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/components/dynmap/dynmap.go:236:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:242:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:257:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:263:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:278:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:284:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:299:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:331:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:350:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:356:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:366:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:390:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:396:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:405:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:427:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:433:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:442:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:459:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:465:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:474:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:491:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:497:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:506:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:523:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:529:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:538:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:555:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:561:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:570:12: if block ends with a return statement, so drop this else and outdent its block
pkg/login/ldap.go:55:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/login/ldap_test.go:372:10: if block ends with a return statement, so drop this else and outdent its block
pkg/middleware/middleware_test.go:213:12: if block ends with a return statement, so drop this else and outdent its block
pkg/plugins/dashboard_importer.go:153:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/plugins/dashboards_updater.go:39:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/plugins/dashboards_updater.go:121:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/plugins/plugins.go:210:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/plugins/plugins.go:235:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/eval_context.go:111:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/notifier.go:92:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/notifier.go:98:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/notifier.go:122:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/rule.go:108:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/rule.go:118:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/rule.go:121:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/notifiers/telegram.go:94:10: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/annotation.go:34:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/sqlstore/annotation.go:99:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/sqlstore/dashboard_test.go:107:13: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/plugin_setting.go:78:10: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/preferences.go:91:10: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/user.go:50:10: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/migrator/migrator.go:106:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/sqlstore/migrator/postgres_dialect.go:48:10: if block ends with a return statement, so drop this else and outdent its block
pkg/tsdb/time_range.go:59:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/tsdb/time_range.go:67:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/tsdb/cloudwatch/metric_find_query.go:225:9: if block ends with a return statement, so drop this else and outdent its block
pkg/util/filepath.go:68:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
2018-04-27 15:42:49 -05:00
return err . ( error )
2016-10-03 02:38:03 -05:00
}
2019-06-04 15:00:05 -05:00
// Dispatch function dispatch a message to the bus.
2014-12-16 09:45:07 -06:00
func ( b * InProcBus ) Dispatch ( msg Msg ) error {
var msgName = reflect . TypeOf ( msg ) . Elem ( ) . Name ( )
2014-11-28 15:16:49 -06:00
2018-06-13 02:18:53 -05:00
withCtx := true
2020-12-14 08:51:59 -06:00
handler := b . handlersWithCtx [ msgName ]
2018-06-13 02:18:53 -05:00
if handler == nil {
withCtx = false
handler = b . handlers [ msgName ]
2020-12-14 08:51:59 -06:00
if handler == nil {
return ErrHandlerNotFound
}
2014-11-28 15:16:49 -06:00
}
2014-12-16 09:45:07 -06:00
2018-06-13 02:18:53 -05:00
var params = [ ] reflect . Value { }
if withCtx {
2021-07-15 07:33:38 -05:00
if setting . Env == setting . Dev {
b . logger . Warn ( "Dispatch called with message handler registered using AddHandlerCtx and should be changed to use DispatchCtx" , "msgName" , msgName )
}
2018-06-13 02:18:53 -05:00
params = append ( params , reflect . ValueOf ( context . Background ( ) ) )
}
params = append ( params , reflect . ValueOf ( msg ) )
2014-11-28 15:16:49 -06:00
ret := reflect . ValueOf ( handler ) . Call ( params )
err := ret [ 0 ] . Interface ( )
if err == nil {
return nil
}
Outdent code after if block that ends with return (golint)
This commit fixes the following golint warnings:
pkg/bus/bus.go:64:9: if block ends with a return statement, so drop this else and outdent its block
pkg/bus/bus.go:84:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:137:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:177:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:183:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:199:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:208:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/components/dynmap/dynmap.go:236:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:242:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:257:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:263:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:278:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:284:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:299:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:331:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:350:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:356:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:366:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:390:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:396:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:405:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:427:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:433:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:442:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:459:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:465:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:474:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:491:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:497:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:506:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:523:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:529:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:538:12: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:555:9: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:561:10: if block ends with a return statement, so drop this else and outdent its block
pkg/components/dynmap/dynmap.go:570:12: if block ends with a return statement, so drop this else and outdent its block
pkg/login/ldap.go:55:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/login/ldap_test.go:372:10: if block ends with a return statement, so drop this else and outdent its block
pkg/middleware/middleware_test.go:213:12: if block ends with a return statement, so drop this else and outdent its block
pkg/plugins/dashboard_importer.go:153:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/plugins/dashboards_updater.go:39:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/plugins/dashboards_updater.go:121:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/plugins/plugins.go:210:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/plugins/plugins.go:235:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/eval_context.go:111:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/notifier.go:92:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/notifier.go:98:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/notifier.go:122:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/rule.go:108:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/rule.go:118:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/rule.go:121:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/alerting/notifiers/telegram.go:94:10: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/annotation.go:34:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/sqlstore/annotation.go:99:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/sqlstore/dashboard_test.go:107:13: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/plugin_setting.go:78:10: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/preferences.go:91:10: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/user.go:50:10: if block ends with a return statement, so drop this else and outdent its block
pkg/services/sqlstore/migrator/migrator.go:106:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/services/sqlstore/migrator/postgres_dialect.go:48:10: if block ends with a return statement, so drop this else and outdent its block
pkg/tsdb/time_range.go:59:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/tsdb/time_range.go:67:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
pkg/tsdb/cloudwatch/metric_find_query.go:225:9: if block ends with a return statement, so drop this else and outdent its block
pkg/util/filepath.go:68:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
2018-04-27 15:42:49 -05:00
return err . ( error )
2014-11-28 15:16:49 -06:00
}
2021-11-19 06:56:42 -06:00
// PublishCtx function publish a message to the bus listener.
func ( b * InProcBus ) PublishCtx ( ctx context . Context , msg Msg ) error {
var msgName = reflect . TypeOf ( msg ) . Elem ( ) . Name ( )
var params = [ ] reflect . Value { }
if listeners , exists := b . listenersWithCtx [ msgName ] ; exists {
params = append ( params , reflect . ValueOf ( ctx ) )
params = append ( params , reflect . ValueOf ( msg ) )
2021-11-19 07:32:14 -06:00
if err := callListeners ( listeners , params ) ; err != nil {
2021-11-19 06:56:42 -06:00
return err
}
}
if listeners , exists := b . listeners [ msgName ] ; exists {
params = append ( params , reflect . ValueOf ( msg ) )
if setting . Env == setting . Dev {
b . logger . Warn ( "PublishCtx called with message listener registered using AddEventListener and should be changed to use AddEventListenerCtx" , "msgName" , msgName )
}
2021-11-19 07:32:14 -06:00
if err := callListeners ( listeners , params ) ; err != nil {
2021-11-19 06:56:42 -06:00
return err
}
}
span , _ := opentracing . StartSpanFromContext ( ctx , "bus - " + msgName )
defer span . Finish ( )
span . SetTag ( "msg" , msgName )
return nil
}
2019-06-04 15:00:05 -05:00
// Publish function publish a message to the bus listener.
2015-01-09 09:36:23 -06:00
func ( b * InProcBus ) Publish ( msg Msg ) error {
var msgName = reflect . TypeOf ( msg ) . Elem ( ) . Name ( )
2021-11-19 06:56:42 -06:00
var params = [ ] reflect . Value { }
if listeners , exists := b . listenersWithCtx [ msgName ] ; exists {
params = append ( params , reflect . ValueOf ( context . Background ( ) ) )
params = append ( params , reflect . ValueOf ( msg ) )
if setting . Env == setting . Dev {
b . logger . Warn ( "Publish called with message handler registered using AddEventHandlerCtx and should be changed to use PublishCtx" , "msgName" , msgName )
}
2021-11-19 07:32:14 -06:00
if err := callListeners ( listeners , params ) ; err != nil {
2021-11-19 06:56:42 -06:00
return err
}
}
2015-01-09 09:36:23 -06:00
2021-11-19 06:56:42 -06:00
if listeners , exists := b . listeners [ msgName ] ; exists {
params = append ( params , reflect . ValueOf ( msg ) )
2021-11-19 07:32:14 -06:00
if err := callListeners ( listeners , params ) ; err != nil {
2021-11-19 06:56:42 -06:00
return err
}
}
2015-01-09 09:36:23 -06:00
2021-11-19 06:56:42 -06:00
return nil
}
2021-11-19 07:32:14 -06:00
func callListeners ( listeners [ ] HandlerFunc , params [ ] reflect . Value ) error {
2015-02-03 09:57:42 -06:00
for _ , listenerHandler := range listeners {
2015-01-09 09:36:23 -06:00
ret := reflect . ValueOf ( listenerHandler ) . Call ( params )
2020-11-17 04:27:45 -06:00
e := ret [ 0 ] . Interface ( )
if e != nil {
err , ok := e . ( error )
if ok {
return err
}
return fmt . Errorf ( "expected listener to return an error, got '%T'" , e )
2015-01-09 09:36:23 -06:00
}
}
return nil
}
2014-12-16 09:45:07 -06:00
func ( b * InProcBus ) AddHandler ( handler HandlerFunc ) {
2014-11-28 15:16:49 -06:00
handlerType := reflect . TypeOf ( handler )
queryTypeName := handlerType . In ( 0 ) . Elem ( ) . Name ( )
2014-12-16 09:45:07 -06:00
b . handlers [ queryTypeName ] = handler
2014-11-28 15:16:49 -06:00
}
2014-12-16 05:04:08 -06:00
2018-06-07 15:03:27 -05:00
func ( b * InProcBus ) AddHandlerCtx ( handler HandlerFunc ) {
2016-10-03 02:38:03 -05:00
handlerType := reflect . TypeOf ( handler )
queryTypeName := handlerType . In ( 1 ) . Elem ( ) . Name ( )
2018-06-08 03:51:27 -05:00
b . handlersWithCtx [ queryTypeName ] = handler
2016-10-03 02:38:03 -05:00
}
2021-06-24 10:01:29 -05:00
// GetHandlerCtx returns the handler function for the given struct name.
func ( b * InProcBus ) GetHandlerCtx ( name string ) HandlerFunc {
return b . handlersWithCtx [ name ]
}
2015-01-09 09:36:23 -06:00
func ( b * InProcBus ) AddEventListener ( handler HandlerFunc ) {
handlerType := reflect . TypeOf ( handler )
eventName := handlerType . In ( 0 ) . Elem ( ) . Name ( )
2015-02-03 09:57:42 -06:00
_ , exists := b . listeners [ eventName ]
2015-01-09 09:36:23 -06:00
if ! exists {
2015-02-03 09:57:42 -06:00
b . listeners [ eventName ] = make ( [ ] HandlerFunc , 0 )
2015-01-09 09:36:23 -06:00
}
2015-02-03 09:57:42 -06:00
b . listeners [ eventName ] = append ( b . listeners [ eventName ] , handler )
2015-01-09 09:36:23 -06:00
}
2021-11-19 06:56:42 -06:00
func ( b * InProcBus ) AddEventListenerCtx ( handler HandlerFunc ) {
handlerType := reflect . TypeOf ( handler )
eventName := handlerType . In ( 1 ) . Elem ( ) . Name ( )
_ , exists := b . listenersWithCtx [ eventName ]
if ! exists {
b . listenersWithCtx [ eventName ] = make ( [ ] HandlerFunc , 0 )
}
b . listenersWithCtx [ eventName ] = append ( b . listenersWithCtx [ eventName ] , handler )
}
2020-06-17 11:43:16 -05:00
// AddHandler attaches a handler function to the global bus.
// Package level function.
2014-12-16 09:45:07 -06:00
func AddHandler ( implName string , handler HandlerFunc ) {
globalBus . AddHandler ( handler )
2014-12-16 05:04:08 -06:00
}
2020-06-17 11:43:16 -05:00
// AddHandlerCtx attaches a handler function to the global bus context.
// Package level function.
2018-06-07 15:03:27 -05:00
func AddHandlerCtx ( implName string , handler HandlerFunc ) {
globalBus . AddHandlerCtx ( handler )
2016-10-03 02:38:03 -05:00
}
2020-06-17 11:43:16 -05:00
// AddEventListener attaches a handler function to the event listener.
// Package level function.
2015-01-09 09:36:23 -06:00
func AddEventListener ( handler HandlerFunc ) {
globalBus . AddEventListener ( handler )
}
2021-11-19 06:56:42 -06:00
// AddEventListenerCtx attaches a handler function to the event listener.
// Package level function.
func AddEventListenerCtx ( handler HandlerFunc ) {
globalBus . AddEventListenerCtx ( handler )
}
2014-12-16 09:45:07 -06:00
func Dispatch ( msg Msg ) error {
return globalBus . Dispatch ( msg )
2014-12-16 05:04:08 -06:00
}
2015-02-03 09:57:42 -06:00
2016-10-03 02:38:03 -05:00
func DispatchCtx ( ctx context . Context , msg Msg ) error {
return globalBus . DispatchCtx ( ctx , msg )
}
2015-02-03 09:57:42 -06:00
func Publish ( msg Msg ) error {
return globalBus . Publish ( msg )
2015-02-04 08:37:26 -06:00
}
2015-05-02 02:24:56 -05:00
2021-11-19 06:56:42 -06:00
func PublishCtx ( msg Msg ) error {
return globalBus . Publish ( msg )
}
2021-06-24 10:01:29 -05:00
func GetHandlerCtx ( name string ) HandlerFunc {
2021-08-25 08:11:22 -05:00
return globalBus . GetHandlerCtx ( name )
2021-06-24 10:01:29 -05:00
}
2015-05-02 02:24:56 -05:00
func ClearBusHandlers ( ) {
globalBus = New ( )
}
2018-06-05 14:13:53 -05:00
2018-06-07 11:02:28 -05:00
type noopTransactionManager struct { }
2018-06-05 14:13:53 -05:00
2018-06-07 14:54:36 -05:00
func ( * noopTransactionManager ) InTransaction ( ctx context . Context , fn func ( ctx context . Context ) error ) error {
2018-06-14 02:59:52 -05:00
return fn ( ctx )
2018-06-07 11:02:28 -05:00
}