#spring #spring-boot #kotlin #discord-jda
#весна #spring-boot #kotlin #discord-jda
Вопрос:
Я пытаюсь создать командную среду для бота Discord, используя Spring Boot с Kotlin. Я отлично справился с Javacord, но недавно я решил переключиться на JDA и столкнулся с проблемой. Структура команд, которую я создаю, также передает все события Discord в систему событий Spring, и то, что я сейчас делаю, — это получение общего прослушивателя событий (https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/core/hooks/EventListener.html ) и отправка всего в Spring, используя автоматическое подключение ApplicationEventPublisher
. Однако приложение Spring, похоже, зависает на этой строке, и после отладки с некоторыми точками останова кажется, что оно застревает на этой конкретной строке (https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java#L190). Есть идеи, почему это происходит? Я видел это (https://github.com/spring-projects/spring-framework/issues/20904 ) но я не уверен, что делать…
SpringGenericEventPublisher.kt
@Component
class SpringGenericEventPublisher : EventListener {
@Autowired
private lateinit var context: ApplicationEventPublisher
override fun onEvent(event: Event) = context.publishEvent(event)
}
BotConfiguration.kt
(где у меня есть компонент, который создает экземпляр JDA)
@Bean
fun bot(config: BotProperties): Bot = JDABuilder() // [Bot] is a typealias for [JDA]
//.setCallbackPool(Executors.newSingleThreadExecutor()) // I've tried this because of the issue I linked above, but I got the same result
.setToken(config.token)
.addEventListener(springGenericEventPublisher)
.build()
Тогда у меня есть простой слушатель, просто для тестирования
@Component
class FooComponent {
@EventListener(Event::class)
fun onFoo(event: Event) {
println("Reached `onFoo`")
}
}
Есть идеи?
Заранее спасибо
PS: Я должен добавить, что я также использую Spring Data Redis и Spring Data MongoDB, и что оба запускаются с успехом до этого, и что реестр команд должен запускаться после этого, просто не запускается. Экземпляр JDA отлично регистрируется, поскольку, если я просто напечатаю что-то на экране вместо публикации события SpingGenericEventPublisher
, оно будет успешным.