lifetime.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package plugin_manager
  2. import (
  3. "time"
  4. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  5. "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
  6. )
  7. func (p *PluginManager) AddPluginRegisterHandler(handler func(r plugin_entities.PluginLifetime) error) {
  8. p.pluginRegisters = append(p.pluginRegisters, handler)
  9. }
  10. func (p *PluginManager) fullDuplexLifetime(r plugin_entities.PluginFullDuplexLifetime) {
  11. configuration := r.Configuration()
  12. log.Info("new plugin logged in: %s", configuration.Identity())
  13. defer log.Info("plugin %s has exited", configuration.Identity())
  14. // cleanup plugin runtime state and working directory
  15. defer r.Cleanup()
  16. // stop plugin when the plugin reaches the end of its lifetime
  17. defer r.Stop()
  18. // register plugin
  19. for _, reg := range p.pluginRegisters {
  20. err := reg(r)
  21. if err != nil {
  22. log.Error("add plugin to cluster failed: %s", err.Error())
  23. return
  24. }
  25. }
  26. // add plugin to manager
  27. err := p.Add(r)
  28. if err != nil {
  29. log.Error("add plugin to manager failed: %s", err.Error())
  30. return
  31. }
  32. start_failed_times := 0
  33. // remove lifetime state after plugin if it has been stopped
  34. defer r.TriggerStop()
  35. for !r.Stopped() {
  36. if err := r.InitEnvironment(); err != nil {
  37. log.Error("init environment failed: %s, retry in 30s", err.Error())
  38. time.Sleep(30 * time.Second)
  39. if start_failed_times == 3 {
  40. log.Error(
  41. "init environment failed 3 times, plugin %s has been stopped",
  42. configuration.Identity(),
  43. )
  44. break
  45. }
  46. start_failed_times++
  47. continue
  48. }
  49. start_failed_times = 0
  50. // start plugin
  51. if err := r.StartPlugin(); err != nil {
  52. if r.Stopped() {
  53. break
  54. }
  55. log.Error("start plugin failed: %s, retry in 30s", err.Error())
  56. time.Sleep(30 * time.Second)
  57. if start_failed_times == 3 {
  58. log.Error(
  59. "start plugin failed 3 times, plugin %s has been stopped",
  60. configuration.Identity(),
  61. )
  62. break
  63. }
  64. start_failed_times++
  65. continue
  66. }
  67. // wait for plugin to stop
  68. c, err := r.Wait()
  69. if err == nil {
  70. <-c
  71. }
  72. // restart plugin in 5s
  73. time.Sleep(5 * time.Second)
  74. // add restart times
  75. r.AddRestarts()
  76. }
  77. }