Пишем в application.properties
spring.data.redis.host=localhost
spring.data.redis.port=6379
Добавляем в зависимости gradle:
dependencies {
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
implementation("org.springframework.boot:spring-boot-starter-data-redis")
}
Добавляем в главный класс @ConfigurationPropertiesScan
Полностью копируем package redisConfig
Пишем классы ( лучше всего разместить в package listeners )
Переопределяем метод onMessage
Например:
@Component
class MessageListerExample : MessageListener {
override fun onMessage(message: Message, bytes: ByteArray?) {
println("Examples:")
println("Message from channel `${String(message.channel)}` received: ${String(message.body)}")
}
}
Затем переходим в MessageListenersConfiguration и добавляем
@Bean
fun messageListenerExampleAdapter():MessageListenerAdapter{
return wrapInAdapter(MessageListerExample())
}
В RedisBrokerMessageConfig добавляем в метод
Не забываем в качестве второго аргумента передать имя канала, который наш метод будет прослушивать
@Bean
fun redisMessageListenerContainer(
redisConnectionFactory: RedisConnectionFactory,
// связываем
messageListenerExampleAdapter: MessageListenerAdapter,
): RedisMessageListenerContainer {
val container = RedisMessageListenerContainer()
container.setConnectionFactory(redisConnectionFactory)
// добавляем слушатель в контейнер
container.addMessageListener(messageListenerExampleAdapter, ChannelTopic("example-channel-name"))
return container
}
Тут всё просто - добавляем RedisMessageService и пользуемся методом publishAndPop
. Если нужно просто отправить сообщение в канал и не ждать ответа - используем метод publish
.
Например, так
@RestController
class ExampleController @Autowired constructor(
val redisMessageService: RedisMessageService,
) {
private val defaultTimeout = Duration.ofSeconds(100)
@GetMapping("/api/hello")
fun hello(@RequestParam message: String): String {
return redisMessageService.publishAndPop(
"input",
message,
"output",
defaultTimeout
) ?: "Message sent, but no response received yet. :("
}
}