Android inappropriate blocking method call

Ошибка Inappropriate blocking method call при http запросе в Kotlin. В чем проблема?

Изучаю корутины и возник вопрос. Набросал простую функцию для получения данных из сети. Но в Intelij IDEA выделяет желтым URL(url).openConnection() и выводит предупреждение «Inappropriate blocking method call»

Пробовал вызывать так

Ставил модификатор suspend для fun main — один фиг выделяет. В чем ошибка?

Насколько я понял, HttpUrlconnection вызывается блокирующе и может бросить исключение в виде IOException. По ходу вся суть использования корутин тогда сходит на нет, но это не точно.

  • Вопрос задан 23 янв.
  • 529 просмотров

Если по каким-то причинам нет возможности заменить блокирующий код неблокирующим аналогом (например, драйвер БД, для которого асинхронной версии просто не успели ещё написать), то можно использовать такое решение:
1. Создаёте отдельный тредпул
2. Все вызовы блокирующего кода оборачиваете в блок

3. Внутри этого блока создаёте Runnable , который и будет выполнять ваш блокирующий код. После выполнения блокирующего кода вызываете либо continuation.resume(result) , либо continuation.resumeWithException(e)
4. Скармливаете полученный Runnable тредпулу.

Это приведёт к тому, что оригинальная корутина засаспендится, блокирующий код будет выполняться в отдельных потоках, не мешая* остальным корутинам, и когда блокирующий код завершится, корутина будет разбужена с готовым результатом.

* — В котлине по умолчанию используется диспатчер Dispatcher.Default , количество потоков в котором равно количеству ядер CPU (но не меньше двух), поэтому добавление отдельного тредпула под блокирующие задачи приведёт к увеличению количества тредов, что в экстремальных случаях может привести к общей деградации производительности. Но в если у вас не высоконагруженное приложение, то этим можно пренебречь. Правда не уверен как с этим обстоят дела на мобильных платформах, возможно там количество тредов более критично.

Из очевидных минусов:

  • количество потоков больше, чем ядер CPU
  • количество одновременно выполняемых блокирующих методов = количеству потоков в этом тредпуле
  • следите за тем, что бы этот тредпул был ограничен сверху

.

Насколько я помню, еще

1.5 года назад примерно такая схема применялась в котлиновских обёртках над спринговыми драйверами то ли к монго, то ли к редису (там было 3 версии драйвера — блокирующая, реактивная, и блокирующая, но обёрнутая в отдельный тредпул, как я описал). Как сейчас — не знаю.

Читайте также:  Whatsapp premium для андроид

Сергей, нет под рукой котлина, что бы набросать пример, но можете посмотреть вот тут (методы callStringDetail и callByteArrayDetail ).

OkHttpClient все запросы выполняет в своём собственном тредпуле. В приведённом коде создаётся новый Request и отправляется в очередь на выполнение. Вместе с запросом дополнительно передаётся коллбек, который будет вызван, когда запрос завершится. В случае ошибки корутина будет возоблена с эксепшеном ConnectionException , а в случае успеха, она будет возоблена с полученным HttpResponse

Источник

Inappropriate blocking method call for serialization #313

Comments

jonahseguin commented Mar 28, 2020

Similar to issue #221 :
when using readValue() we use the extension function from Extensions.kt to fix this inspection warning:

I’m wondering if there’s a workaround for this inspection error (within a suspend function) for the write() functions in objectMapper?

I looked through the ExtensionsKt file and couldn’t find any writing functions. Maybe I’m missing something obvious here?

The text was updated successfully, but these errors were encountered:

jonahseguin commented Mar 28, 2020

Potential fix would be to add this extension function:

inline fun ObjectMapper.writeValueAsString(value: T): String = writeValueAsString(value)

dinomite commented Apr 6, 2020

Hmm, when I add that to Extensions.kt IntelliJ tells me that it’s shadowed, which matches what the Kotlin docs say:

If a class has a member function, and an extension function is defined which has the same receiver type, the same name, and is applicable to given arguments, the member always wins.

Maybe we need a slightly more complicated solution, most notably not overloading an existing method. See also: #315

dodalovic commented Apr 27, 2021 •

Interestingly enough, this warning seems to be coming from IntelliJ plugin, rather than kotlin compiler, since I get no warnings when I compile the project using gradle in the command line? 🤔

It may be the case that @Suppress(«BlockingMethodInNonBlockingContext») might be the way to go?

johnowl commented May 31, 2021

Any updates on this issue? I’m having the same problem with a Micronaut Application.

cowtowncoder commented Jun 1, 2021

@johnowl Maybe you can explain what do you think is an issue here? I am tempted to close this because all I see are vague warnings that seem to call out non-existent problems. In particular, your stack trace is for something that is deep within JDK and not in any way related to Jackson doing anything.

It seems rather that this is something to bring up to Micronaut folks, perhaps they can make sense out of seemingly irrelevant warnings.

davinkevin commented Jul 5, 2021

The problem from @johnowl & @jonahseguin seems to be related to the usage of ObjectMapper::writeValueAsString within a reactive context. In reactive world, blocking call should be avoided because Reactive implementation (rxjava, reactor…) rely on very few threads.

@johnowl used BlockHound, a java agent able to detect and crash if a blocking call is made inside a Reactor context.

Читайте также:  Android слежение за пользователями

I have the problem too on my projects. The solution would be to move to a method on ObjectMapper doing no blocking call… but does it exist ?

cowtowncoder commented Jul 5, 2021

@davinkevin Jackson will internally use either Writer or OutputStream abstraction for all generation code paths, so code that only looks at APIs may deduce there is a chance of blocking.
But what specifically happens is that implementation for writeValueAsString() will use StringWriter (or equivalent) which never blocks and that is safe; there is no blocking or chance of it.

So whatever is «detecting» blocking is probably just assuming potential of blockage.

So whoever is affected by this problem should probably figure out logic of this warning instead of coming to ask here for a fix: Jackson does not handle this detection logic and has no control over it.
Whatever controls it might be able to figure out ways to avoid this false positive case.

davinkevin commented Jul 6, 2021

Thank for the answer @cowtowncoder.

However, the stack trace presented by @johnowl states that method is using a blocking code. Blockhound isn’t working like IDEA, on a static list of blocking call (which can be outdated) but instrument the JVM to detect call to blocking method. This solution is really better.

But, in your case @johnowl, it seems to be related to the ObjectMapper::findModules method and especially the part of the code looking for jackson modules in every jar of the classpath… leading to this error.

This kind of code ( ObjectMapper::findModules ) are usually initialized outside of Reactor context. Is it something possible for you?

cowtowncoder commented Jul 6, 2021 •

@davinkevin interesting! That makes more sense based on your explanation.

In general, I think users would be better of avoiding use of findModules() anyway: while it was added (despite my misgivings) that can lead to unexpected issues when something somewhere adds something to classpath — potentially including security concerns.

zakaoai commented Oct 26, 2021

Hello there, I’ve got same problem in my code and did add
ObjectMapper#readerFor to the allowBlockingCallsInside

Is it the way to go now or did I do something wrong ?
Also I confirm that my problem still occur in 2.13.0

languanghao commented Nov 25, 2021

Still get this problem in kotin suspend function

Источник

«Inappropriate thread-blocking method call» inspection does not handle flowOn() declaration #1503

Comments

severn-everett commented Sep 4, 2019

This is a cross-posting of KT-33532 — as the issue got no traction there, I figured that maybe it needs to be posted here due to it being related to the Coroutines library:

For the Kotlin Coroutine library, the Inappropriate thread-blocking method call code inspection for blocking code in a coroutine can be addressed by placing the blocking code in a withContext(Dispatchers.IO) <> call. Per the documentation for the new Flow functionality, switching between contexts is not allowed within a flow code block; instead, the IDE suggests that the context be specified via a flowOn() call tacked onto the end of the flow <> code block. However, the IDE is still flagging the blocking code as violating the proscribed standard workflow. The code inspector should be updated to reflect that flowOn() is used for Kotlin Flow to manage context for blocking code.

Читайте также:  Proxy server для андроид

Found in: Kotlin 1.3.50, Kotlin-Coroutine 1.3.0



The text was updated successfully, but these errors were encountered:

Источник

Inappropriate blocking method call for serialization (2) #315

Comments

cj848 commented Mar 29, 2020 •

I found an inappropriate blocking call during testing using blockhound.
More details are in the github source I attached.
If you remove the dependency of jackson-module-kotlin from the source I attached, the test of the code passes.

If you uncomment line 12 of the LoggingBlockHoundIntegration class
The exact cause below appears.

I am very uncomfortable with this situation. Because I am using data class very much. please fix this issue. Thank you for always.

=========================================================
java.lang.Exception: java.io.RandomAccessFile#readBytes
at kr.co.kcd.example.LoggingBlockHoundIntegration$applyTo$1.accept(LoggingBlockHoundIntegration.kt:11)
at kr.co.kcd.example.LoggingBlockHoundIntegration$applyTo$1.accept(LoggingBlockHoundIntegration.kt:8)
at reactor.blockhound.BlockHound$Builder.lambda$install$8(BlockHound.java:383)
at reactor.blockhound.BlockHoundRuntime.checkBlocking(BlockHoundRuntime.java:89)
at java.base/java.io.RandomAccessFile.readBytes(RandomAccessFile.java)
at java.base/java.io.RandomAccessFile.read(RandomAccessFile.java:408)
at java.base/java.util.zip.ZipFile$Source.readAt(ZipFile.java:1252)
at java.base/java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:958)
at java.base/java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:460)
at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:159)
at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:123)
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:83)
at java.base/java.io.DataInputStream.readInt(DataInputStream.java:392)
at kotlin.reflect.jvm.internal.impl.metadata.builtins.BuiltInsBinaryVersion$Companion.readFrom(BuiltInsBinaryVersion.kt:29)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins.BuiltInsPackageFragmentImpl$Companion.create(BuiltInsPackageFragmentImpl.kt:38)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltInsPackageFragmentProvider.findPackage(JvmBuiltInsPackageFragmentProvider.kt:58)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.AbstractDeserializedPackageFragmentProvider$fragments$1.invoke(AbstractDeserializedPackageFragmentProvider.kt:34)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.AbstractDeserializedPackageFragmentProvider$fragments$1.invoke(AbstractDeserializedPackageFragmentProvider.kt:26)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:512)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.AbstractDeserializedPackageFragmentProvider.getPackageFragments(AbstractDeserializedPackageFragmentProvider.kt:41)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.CompositePackageFragmentProvider.getPackageFragments(CompositePackageFragmentProvider.kt:31)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.CompositePackageFragmentProvider.getPackageFragments(CompositePackageFragmentProvider.kt:31)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl$fragments$2.invoke(LazyPackageViewDescriptorImpl.kt:37)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl$fragments$2.invoke(LazyPackageViewDescriptorImpl.kt:30)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:355)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:474)
at kotlin.reflect.jvm.internal.impl.storage.StorageKt.getValue(storage.kt:42)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl.getFragments(LazyPackageViewDescriptorImpl.kt)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl$memberScope$1.invoke(LazyPackageViewDescriptorImpl.kt:41)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl$memberScope$1.invoke(LazyPackageViewDescriptorImpl.kt:30)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:355)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:474)
at kotlin.reflect.jvm.internal.impl.resolve.scopes.LazyScopeAdapter.getWorkerScope(LazyScopeAdapter.kt:23)
at kotlin.reflect.jvm.internal.impl.resolve.scopes.AbstractScopeAdapter.getContributedClassifier(AbstractScopeAdapter.kt:44)
at kotlin.reflect.jvm.internal.impl.descriptors.FindClassInModuleKt.findClassifierAcrossModuleDependencies(findClassInModule.kt:25)
at kotlin.reflect.jvm.internal.impl.descriptors.FindClassInModuleKt.findClassAcrossModuleDependencies(findClassInModule.kt:40)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.computeClassDescriptor(TypeDeserializer.kt:221)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.access$computeClassDescriptor(TypeDeserializer.kt:23)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer$classDescriptors$1.invoke(TypeDeserializer.kt:32)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer$classDescriptors$1.invoke(TypeDeserializer.kt:23)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:512)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.typeConstructor(TypeDeserializer.kt:113)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.simpleType(TypeDeserializer.kt:75)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.type(TypeDeserializer.kt:63)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.MemberDeserializer.valueParameters(MemberDeserializer.kt:417)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.MemberDeserializer.loadConstructor(MemberDeserializer.kt:342)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor.computePrimaryConstructor(DeserializedClassDescriptor.kt:122)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor.access$computePrimaryConstructor(DeserializedClassDescriptor.kt:34)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$primaryConstructor$1.invoke(DeserializedClassDescriptor.kt:65)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$primaryConstructor$1.invoke(DeserializedClassDescriptor.kt:34)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:355)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor.getUnsubstitutedPrimaryConstructor(DeserializedClassDescriptor.kt:126)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor.computeConstructors(DeserializedClassDescriptor.kt:129)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor.access$computeConstructors(DeserializedClassDescriptor.kt:34)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$constructors$1.invoke(DeserializedClassDescriptor.kt:66)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$constructors$1.invoke(DeserializedClassDescriptor.kt:34)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:355)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:474)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor.getConstructors(DeserializedClassDescriptor.kt:137)
at kotlin.reflect.jvm.internal.KClassImpl.getConstructorDescriptors(KClassImpl.kt:200)
at kotlin.reflect.jvm.internal.KClassImpl$Data$constructors$2.invoke(KClassImpl.kt:91)
at kotlin.reflect.jvm.internal.KClassImpl$Data$constructors$2.invoke(KClassImpl.kt:44)
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
at kotlin.reflect.jvm.internal.KClassImpl$Data.getConstructors(KClassImpl.kt)
at kotlin.reflect.jvm.internal.KClassImpl.getConstructors(KClassImpl.kt:235)
at kotlin.reflect.jvm.ReflectJvmMapping.getKotlinFunction(ReflectJvmMapping.kt:144)
at com.fasterxml.jackson.module.kotlin.KotlinNamesAnnotationIntrospector.findKotlinParameterName(KotlinNamesAnnotationIntrospector.kt:115)
at com.fasterxml.jackson.module.kotlin.KotlinNamesAnnotationIntrospector.findImplicitPropertyName(KotlinNamesAnnotationIntrospector.kt:31)
at com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair.findImplicitPropertyName(AnnotationIntrospectorPair.java:490)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addCreatorParam(POJOPropertiesCollector.java:485)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addCreators(POJOPropertiesCollector.java:465)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:313)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getJsonValueAccessor(POJOPropertiesCollector.java:196)
at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findJsonValueAccessor(BasicBeanDescription.java:252)
at com.fasterxml.jackson.databind.ser.BasicSerializerFactory.findSerializerByAnnotations(BasicSerializerFactory.java:346)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:216)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:165)
at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:1388)
at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1336)
at com.fasterxml.jackson.databind.SerializerProvider._findExplicitUntypedSerializer(SerializerProvider.java:1305)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.hasSerializerFor(DefaultSerializerProvider.java:260)
at com.fasterxml.jackson.databind.ObjectMapper.canSerialize(ObjectMapper.java:3005)
at org.springframework.http.codec.json.AbstractJackson2Encoder.canEncode(AbstractJackson2Encoder.java:107)
at org.springframework.http.codec.EncoderHttpMessageWriter.canWrite(EncoderHttpMessageWriter.java:107)
at org.springframework.web.reactive.function.BodyInserters.lambda$writeWithMessageWriters$9(BodyInserters.java:377)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1598)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543)
at org.springframework.web.reactive.function.BodyInserters.writeWithMessageWriters(BodyInserters.java:378)
at org.springframework.web.reactive.function.BodyInserters.lambda$fromValue$1(BodyInserters.java:98)
at org.springframework.web.reactive.function.client.DefaultClientRequestBuilder$BodyInserterRequest.writeTo(DefaultClientRequestBuilder.java:249)
at org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction.lambda$exchange$1(ExchangeFunctions.java:104)
at org.springframework.http.client.reactive.ReactorClientHttpConnector.lambda$connect$2(ReactorClientHttpConnector.java:110)
at reactor.netty.http.client.HttpClientConnect$HttpClientHandler.requestWithBody(HttpClientConnect.java:607)
at reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.lambda$onStateChange$0(HttpClientConnect.java:434)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)
at reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.onStateChange(HttpClientConnect.java:435)
at reactor.netty.ReactorNetty$CompositeConnectionObserver.onStateChange(ReactorNetty.java:514)
at reactor.netty.resources.PooledConnectionProvider$DisposableAcquire.onStateChange(PooledConnectionProvider.java:523)
at reactor.netty.resources.PooledConnectionProvider$PooledConnection.onStateChange(PooledConnectionProvider.java:429)
at reactor.netty.channel.ChannelOperationsHandler.channelActive(ChannelOperationsHandler.java:60)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:230)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:216)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:209)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelActive(CombinedChannelDuplexHandler.java:412)
at io.netty.channel.ChannelInboundHandlerAdapter.channelActive(ChannelInboundHandlerAdapter.java:69)
at io.netty.channel.CombinedChannelDuplexHandler.channelActive(CombinedChannelDuplexHandler.java:211)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:230)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:216)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:209)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelActive(DefaultChannelPipeline.java:1398)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:230)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:216)
at io.netty.channel.DefaultChannelPipeline.fireChannelActive(DefaultChannelPipeline.java:895)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:305)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:335)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702)
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.base/java.lang.Thread.run(Thread.java:830)

The text was updated successfully, but these errors were encountered:

Источник

Оцените статью