Ошибка создания компонента с именем 'enableRedisKeyspaceNotificationsInitializer' - PullRequest
3 голосов
/ 19 февраля 2020

Я могу подключиться к Azure Кэш для Redis со следующей конфигурацией Spring Session:

<bean id="redisPassword" class="org.springframework.data.redis.connection.RedisPassword">
    <constructor-arg index="0" value="xxxxxxxxxxxxxxxx"/>
</bean>

<bean id="redisStandaloneConfiguration" class="org.springframework.data.redis.connection.RedisStandaloneConfiguration">
    <property name="hostName" value="acmedev.redis.cache.windows.net"/>
    <property name="port" value="6380"/>
    <property name="password" ref="redisPassword"/>
</bean>

<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>

<bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory">
    <constructor-arg index="0" ref="redisStandaloneConfiguration"/>
</bean>

Мое приложение успешно подключается:

[lettuce-nioEventLoop-4-1] DEBUG io.lettuce.core.RedisClient - Connecting to Redis at acmedev.redis.cache.windows.net:6380: Success

Затем приложение зависает для некоторое время, и я в конечном итоге получаю эту ошибку

11:22:54.712 [lettuce-nioEventLoop-4-1] DEBUG io.lettuce.core.protocol.CommandHandler - [channel=0xcf902cd8, /10.1.200.58:53533 -> acmedev.redis.cache.windows.net/52.240.141.200:6380, chid=0x1] Storing exception in connectionError
2020-02-19 11:22:54,713  WARN (org.springframework.context.support.AbstractApplicationContext:558) || - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to acmedev.redis.cache.windows.net:6380
11:22:54.719 [RMI TCP Connection(3)-127.0.0.1] DEBUG io.lettuce.core.RedisClient - Initiate shutdown (100, 100, MILLISECONDS)


[lettuce-nioEventLoop-4-1] DEBUG io.lettuce.core.protocol.CommandHandler - [channel=0xcf902cd8, /10.1.200.58:53533 -> acmedev.redis.cache.windows.net/52.240.141.200:6380, chid=0x1] Unexpected exception during request: java.io.IOException: An existing connection was forcibly closed by the remote host
java.io.IOException: An existing connection was forcibly closed by the remote host
    at sun.nio.ch.SocketDispatcher.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
    at sun.nio.ch.IOUtil.read(IOUtil.java:192)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
    at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1133)
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:745)

Эти же бины прекрасно работают, когда я использую redis на localhost.

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Прежде всего RedisHttpSessionConfiguration try (по умолчанию) enable уведомления пространства клавиш. Но это работает только для незащищенных экземпляров.

Класс формы документов ConfigureNotifyKeyspaceEventsAction объяснить, почему это работает только на локальном хосте:

Эта стратегия не будет работать, если экземпляр Redis был должным образом защищен. Вместо этого экземпляр Redis должен быть настроен извне, и должен быть предоставлен компонент типа ConfigureRedisAction # NO_OP.

А также объяснить, как его следует настроить для работы с защищенным экземпляром Redis.

Просто используйте метод: RedisHttpSessionConfiguration#setConfigureRedisAction, чтобы установить ConfigureRedisAction#NO_OP, а затем, например, при вызове экземпляра Redis: config set notify-keyspace-events Egx

...