Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Failed to submit a listener notification task. Event loop shut down? #5710

Closed
Charles7c opened this issue Mar 24, 2024 · 5 comments
Closed
Milestone

Comments

@Charles7c
Copy link

Charles7c commented Mar 24, 2024

Expected behavior

When restarting the project in IntelliJ IDEA, there are no errors and it can be restarted normally.

Actual behavior

2024-03-24 10:39:34 ERROR [SpringApplicationShutdownHook] i.n.u.concurrent.DefaultPromise.rejectedExecution - Failed to submit a listener notification task. Event loop shut down?
java.util.concurrent.RejectedExecutionException: event executor terminated
	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:934)
	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:351)
	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:344)
	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:836)
	at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:827)
	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:817)
	at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:862)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:500)
	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:185)
	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
	at org.redisson.client.RedisPubSubConnection.unsubscribe(RedisPubSubConnection.java:143)
	at org.redisson.pubsub.PubSubConnectionEntry.unsubscribe(PubSubConnectionEntry.java:251)
	at org.redisson.pubsub.PublishSubscribeService.unsubscribeLocked(PublishSubscribeService.java:684)
	at org.redisson.pubsub.PublishSubscribeService.lambda$removeListenerAsync$54(PublishSubscribeService.java:953)
	at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
	at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309)
	at org.redisson.pubsub.PublishSubscribeService.removeListenerAsync(PublishSubscribeService.java:940)
	at org.redisson.pubsub.PublishSubscribeService.removeListenerAsync(PublishSubscribeService.java:921)
	at org.redisson.RedissonTopic.removeListenerAsync(RedissonTopic.java:171)
	at org.redisson.RedissonTopic.removeListener(RedissonTopic.java:177)
	at com.alicp.jetcache.redisson.RedissonBroadcastManager.close(RedissonBroadcastManager.java:60)
	at com.alicp.jetcache.SimpleCacheManager.lambda$close$0(SimpleCacheManager.java:44)
	at java.base/java.util.concurrent.ConcurrentHashMap.forEach(ConcurrentHashMap.java:1603)
	at com.alicp.jetcache.SimpleCacheManager.close(SimpleCacheManager.java:42)
	at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:221)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:587)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:559)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:1189)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:520)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:1182)
	at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1117)
	at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1083)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.doClose(ServletWebServerApplicationContext.java:173)
	at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1034)
	at org.springframework.boot.SpringApplicationShutdownHook.closeAndWait(SpringApplicationShutdownHook.java:145)
	at java.base/java.lang.Iterable.forEach(Iterable.java:75)
	at org.springframework.boot.SpringApplicationShutdownHook.run(SpringApplicationShutdownHook.java:114)
	at java.base/java.lang.Thread.run(Thread.java:842)

Steps to reproduce or test case

https://github.com/charles7c/continew-admin
1.Start the project
2.Restart the project

Redis version

7.2.3

Redisson version

3.27.2

Redisson configuration

I don't have any extra configuration, I even directly reuse the existing Redis configuration.

Here is a snippet of my configuration:

    private void buildSingleModeConfig(Config config, String protocolPrefix) {
        SingleServerConfig singleServerConfig = config.useSingleServer();
        SingleServerConfig customSingleServerConfig = properties.getSingleServerConfig();
        if (null != customSingleServerConfig) {
            BeanUtil.copyProperties(properties.getSingleServerConfig(), singleServerConfig);
        }
        // 下方配置如果为空,则使用 Redis 的配置
        singleServerConfig.setDatabase(redisProperties.getDatabase());
        if (CharSequenceUtil.isBlank(singleServerConfig.getPassword())) {
            singleServerConfig.setPassword(redisProperties.getPassword());
        }
        if (CharSequenceUtil.isBlank(singleServerConfig.getAddress())) {
            singleServerConfig.setAddress(protocolPrefix + redisProperties
                .getHost() + StringConstants.COLON + redisProperties.getPort());
        }
    }
@mrniko mrniko added this to the 3.27.3 milestone Mar 24, 2024
@mrniko
Copy link
Member

mrniko commented Mar 25, 2024

The issue is that RedissonBroadcastManager calls topic listener removal after Redisson was shutdown.

@mrniko
Copy link
Member

mrniko commented Mar 25, 2024

Shutdown check added

@DolphaGo
Copy link

DolphaGo commented May 14, 2024

@mrniko

I upgraded to version 3.30 and still have the same issue?

2024-05-14 11:15:34,150 [main] [INFO ] [org.springframework.boot.web.embedded.tomcat.GracefulShutdown:shutDownGracefully:54] - Commencing graceful shutdown. Waiting for active requests to complete
2024-05-14 11:15:34,153 [tomcat-shutdown] [INFO ] [org.springframework.boot.web.embedded.tomcat.GracefulShutdown:doShutdown:76] - Graceful shutdown complete
2024-05-14 11:15:34,197 [redisson-netty-4-16] [ERROR] [io.netty.util.concurrent.DefaultPromise.rejectedExecution:safeExecute:864] - Failed to submit a listener notification task. Event loop shut down?
java.util.concurrent.RejectedExecutionException: event executor terminated
	at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:934)
	at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:351)
	at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:344)
	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:836)
	at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:827)
	at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:817)
	at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:862)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:500)
	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
	at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
	at io.netty.util.concurrent.DefaultPromise.setSuccess(DefaultPromise.java:97)
	at io.netty.channel.group.DefaultChannelGroupFuture.setSuccess0(DefaultChannelGroupFuture.java:200)
	at io.netty.channel.group.DefaultChannelGroupFuture.access$400(DefaultChannelGroupFuture.java:41)
	at io.netty.channel.group.DefaultChannelGroupFuture$1.operationComplete(DefaultChannelGroupFuture.java:75)
	at io.netty.channel.group.DefaultChannelGroupFuture$1.operationComplete(DefaultChannelGroupFuture.java:48)
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
	at io.netty.util.concurrent.DefaultPromise.access$200(DefaultPromise.java:35)
	at io.netty.util.concurrent.DefaultPromise$1.run(DefaultPromise.java:503)
	at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Unknown Source)

@mrniko
Copy link
Member

mrniko commented May 14, 2024

@DolphaGo

Is there any way to reproduce it?

@mrniko
Copy link
Member

mrniko commented May 14, 2024

resolved in #5795

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

3 participants