rkrisanoff / micro-data-base-service

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Как подключить Redis

Первичная конфигурация

Пишем в 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. :("
    }
}

About


Languages

Language:Kotlin 100.0%