Always update "last sequence" when we get it back from change server, even if nothing has changed. That way we will never get the change server upset because our changes are too old.
This core plugin for apid connects to the Apigee Change Agent and publishes the data changes events onto the apid Event service. It also coordinates DB initialization for plugins on startup.
| name | description |
|---|---|
| apigeesync_poll_interval | int. seconds. default: 5 |
| apigeesync_organization | string. name. required. |
| apigeesync_proxy_server_base | string. url. required. |
| apigeesync_consumer_key | string. required. |
| apigeesync_consumer_secret | string. required. |
ToDo: ApigeeSync currently only receives a new snapshot during startup, so step #4 only happens once. However, it will eventually receive snapshots over time and the sub-steps should be followed at that time. Plugins depending on ApigeeSync for data should assume that it can happen at any time and follow the heuristic below.
Example plugin code:
var (
log apid.LogService // set in initPlugin
data apid.DataService
unsafeDB apid.DB
dbMux sync.RWMutex
)
func init() {
apid.RegisterPlugin(initPlugin)
}
func initPlugin(services apid.Services) error {
log = services.Log().ForModule("examplePlugin")
log.Debug("start init")
data = services.Data()
return nil
}
// always use getDB() to safely access current DB
func getDB() apid.DB {
dbMux.RLock()
db := unsafeDB
dbMux.RUnlock()
return db
}
func setDB(db apid.DB) {
dbMux.Lock()
if unsafeDB == nil { // init API on DB initialization (optional)
go initAPI()
}
unsafeDB = db
dbMux.Unlock()
}
func processSnapshot(snapshot *common.Snapshot) {
log.Debugf("Snapshot received. Switching to DB version: %s", snapshot.SnapshotInfo)
db, err := data.DBVersion(snapshot.SnapshotInfo)
if err != nil {
log.Panicf("Unable to access database: %v", err)
}
// init DB as needed (note: DB may exist, use 'CREATE TABLE IF NOT EXISTS' if not explicitly checking)
initDB(db)
for _, table := range snapshot.Tables {
// populate tables from snapshot...
}
// switch to new database
setDB(db)
log.Debug("Snapshot processed")
}