Spring Boot – Redis ile Mesaj İletimi

Ne Geliştireceğiz?

Merhaba,

Bu projemizde StringRedisTemplate ile String mesaj iletimi sağlayan ve MessageListenerAdapter ile de bu mesajları dinleyen bir servis geliştireceğiz.

Neler Gerekiyor?

  • IntelliJ IDEA (Ben bu IDE’yi kullanacağım)
  • Java 1.8 ya da üzeri JDK
  • Maven 3.2 ya da üzeri

Bağımlıklıkların Tanımlanması

Bağımlılık olarak Spring Data Redis seçmemiz yeterli. Bu durumda da pom.xml dosyamız bu şekilde olacaktır:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/>
    </parent>
    <groupId>com.codingbytime</groupId>
    <artifactId>redis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>redis</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Docker ile Redis Container Oluşturalım

docker run --name my-redis -9 6379:6379 -d redis redis-server

Bu komut ile docker ortamında redis server ayağa kaldırmış olduk. Terminalimizden docker ps yazarak redis container’ın çalıştığını kontrol edelim.

 

Redis Message Reciever’ını Oluşturalım

Message Reciver adınad bir java sınıfı oluşturalım ve @Component olarak tanımlayalım. Daha sonrasında çıktılar için Logger tanımlayalım ve mesajlarımızı dinleyecek bir metod oluşturalım. Burada metod ismimiz önemli çünkü bu bizim defaultListener metodumuz olacak.

package com.codingbytime.redis;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicInteger;

@Component
public class MessageReceiver {
    private AtomicInteger counter = new AtomicInteger();
    private static final Logger LOGGER = LoggerFactory.getLogger(MessageReceiver.class);

    public void receiveMessage(String message) {
        LOGGER.info("Mesaj geldi >" + message + ">");
        counter.incrementAndGet();
    }
}

Sınıf tanımlamamızı bu şekilde yaptıktan sonra şimdi mesajlarımızı gönderecek kısma gelelim. Burası biraz karışık olabilir dikkatli okuyunuz.

Redis ile Mesaj Gönderme

Burada ilk yapacağımız iş RedisMessageListenerContainer, MessageListenerAdapter, StringRedisTemplate olmak üzere 3 adet @Bean tanımı yapmak.

İlgini çekebilir:  Spring Data ElasticSearch

StringRedisTemplate ile mesaj iletimi yapacağız. Bunun içinde tanımlayacağımız bean bu şekilde olmalı:

@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
    return new StringRedisTemplate(connectionFactory);
}

MessageListenerAdapter ile gönderilen mesajları dinleyecek olan metodumuzu belirleceğiz. Verdiğimiz metod isminin MessageReciever ile aynı olduğundan emin olun. Mevcut durumda bean de bu şekilde olmalı:

@Bean
MessageListenerAdapter listenerAdapter(MessageReceiver messageReceiver) {
    return new MessageListenerAdapter(messageReceiver, "receiveMessage");
}

RedisMessageListenerContainer ise mesajın dinleneceği kanalı ve bazı ayrıntıları yönetir. Bean bu şekilde olmalı:

@Bean
RedisMessageListenerContainer container(
        RedisConnectionFactory connectionFactory,
        MessageListenerAdapter listenerAdapter) {

    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.addMessageListener(listenerAdapter, new PatternTopic("mesaj"));

    return container;
}

Ve son olarak 2 saniyede bir defa mesaj gönderecek bir döngü oluşturalım.

public static void main(String[] args) throws InterruptedException {
    ApplicationContext ctx = SpringApplication.run(RedisApplication.class, args);
    StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class);

    while (true) {
        LOGGER.info("Mesaj İletiliyor....");
        template.convertAndSend("mesaj", "Merhaba Redis!");
        Thread.sleep(2000);
    }
}

Kodumuzun tamamı da bu şekilde oldu:

package com.codingbytime.redis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;

@SpringBootApplication
public class RedisApplication {
    private static final Logger LOGGER = LoggerFactory.getLogger(RedisApplication.class);

    @Bean
    RedisMessageListenerContainer container(
            RedisConnectionFactory connectionFactory,
            MessageListenerAdapter listenerAdapter) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic("mesaj"));

        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(MessageReceiver messageReceiver) {
        return new MessageListenerAdapter(messageReceiver, "receiveMessage");
    }

    @Bean
    StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }

    public static void main(String[] args) throws InterruptedException {
        ApplicationContext ctx = SpringApplication.run(RedisApplication.class, args);
        StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class);

        while (true) {
            LOGGER.info("Mesaj İletiliyor....");
            template.convertAndSend("mesaj", "Merhaba Redis!");
            Thread.sleep(2000);
        }
    }

}

 

Çalıştıralım

. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.0)

2020-11-25 22:06:35.288 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : Starting RedisApplication using Java 1.8.0_265
2020-11-25 22:06:35.293 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : No active profile set, falling back to default profiles: default
2020-11-25 22:06:35.867 INFO 7612 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2020-11-25 22:06:35.871 INFO 7612 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2020-11-25 22:06:35.911 INFO 7612 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 10 ms. Found 0 Redis repository interfaces.
2020-11-25 22:06:37.871 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : Started RedisApplication in 3.105 seconds (JVM running for 4.208)
2020-11-25 22:06:37.876 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : Mesaj İletiliyor....
2020-11-25 22:06:37.893 INFO 7612 --- [ container-2] com.codingbytime.redis.MessageReceiver : Mesaj geldi >Merhaba Redis!>
2020-11-25 22:06:39.892 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : Mesaj İletiliyor....
2020-11-25 22:06:39.895 INFO 7612 --- [ container-3] com.codingbytime.redis.MessageReceiver : Mesaj geldi >Merhaba Redis!>
2020-11-25 22:06:41.895 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : Mesaj İletiliyor....
2020-11-25 22:06:41.898 INFO 7612 --- [ container-4] com.codingbytime.redis.MessageReceiver : Mesaj geldi >Merhaba Redis!>
2020-11-25 22:06:43.898 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : Mesaj İletiliyor....
2020-11-25 22:06:43.902 INFO 7612 --- [ container-5] com.codingbytime.redis.MessageReceiver : Mesaj geldi >Merhaba Redis!>
2020-11-25 22:06:45.902 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : Mesaj İletiliyor....
2020-11-25 22:06:45.906 INFO 7612 --- [ container-6] com.codingbytime.redis.MessageReceiver : Mesaj geldi >Merhaba Redis!>
2020-11-25 22:06:47.905 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : Mesaj İletiliyor....
2020-11-25 22:06:47.909 INFO 7612 --- [ container-7] com.codingbytime.redis.MessageReceiver : Mesaj geldi >Merhaba Redis!>
2020-11-25 22:06:49.909 INFO 7612 --- [ main] com.codingbytime.redis.RedisApplication : Mesaj İletiliyor....
2020-11-25 22:06:49.912 INFO 7612 --- [ container-8] com.codingbytime.redis.MessageReceiver : Mesaj geldi >Merhaba Redis!>

More Reading

Post navigation