mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-03-22 15:19:59 +07:00
IJPL-149248: Manually register NettyChannelProvider
GitOrigin-RevId: 32e564a031965dc974667ba019158deba91530de
This commit is contained in:
committed by
intellij-monorepo-bot
parent
6898adbc14
commit
5f2a9248fd
@@ -20,6 +20,7 @@
|
||||
<orderEntry type="module" module-name="intellij.platform.ide.util.io" />
|
||||
<orderEntry type="library" scope="TEST" name="JUnit5" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="jetbrains-annotations" level="project" />
|
||||
<orderEntry type="module" module-name="intellij.platform.testFramework.junit5" scope="TEST" />
|
||||
<orderEntry type="module-library">
|
||||
<library name="grpc-inprocess" type="repository">
|
||||
<properties include-transitive-deps="false" maven-id="io.grpc:grpc-inprocess:1.61.0">
|
||||
@@ -39,5 +40,6 @@
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module" module-name="intellij.libraries.grpc" />
|
||||
<orderEntry type="module" module-name="intellij.libraries.grpc.netty.shaded" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -4,12 +4,17 @@ package com.intellij.execution.process.mediator.client.launcher
|
||||
import com.intellij.execution.process.mediator.client.ProcessMediatorClient
|
||||
import com.intellij.execution.process.mediator.common.DaemonClientCredentials
|
||||
import com.intellij.execution.process.mediator.daemon.ProcessMediatorServerDaemon
|
||||
import com.intellij.openapi.Disposable
|
||||
import com.intellij.openapi.components.Service
|
||||
import com.intellij.openapi.components.service
|
||||
import com.intellij.util.io.MultiCloseable
|
||||
import com.intellij.util.io.runClosingOnFailure
|
||||
import io.grpc.ManagedChannel
|
||||
import io.grpc.ManagedChannelBuilder
|
||||
import io.grpc.ManagedChannelRegistry
|
||||
import io.grpc.inprocess.InProcessChannelBuilder
|
||||
import io.grpc.inprocess.InProcessServerBuilder
|
||||
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelProvider
|
||||
import io.grpc.stub.MetadataUtils
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import java.io.Closeable
|
||||
@@ -37,6 +42,7 @@ fun ProcessMediatorConnection.Companion.createDaemonConnection(
|
||||
processHandle?.let {
|
||||
registerCloseable { it.destroy() }
|
||||
}
|
||||
NettyChannelProviderRegistrationService.ensureChannelProviderRegistered()
|
||||
val channel = ManagedChannelBuilder.forAddress(LOOPBACK_IP, port)
|
||||
.usePlaintext()
|
||||
.build().also(::registerCloseable)
|
||||
@@ -76,3 +82,30 @@ private class ConnectionImpl(
|
||||
) : ProcessMediatorConnection, Closeable, AutoCloseable by cleanup {
|
||||
override fun toString(): String = "Connection(client=$client)"
|
||||
}
|
||||
|
||||
/**
|
||||
* [ManagedChannelRegistry.getDefaultRegistry] has the ability to discover available [io.grpc.ManagedChannelProvider] subclasses.
|
||||
* However, [ManagedChannelRegistry]
|
||||
* uses a classloader that has no access to [NettyChannelProvider],
|
||||
* because intellij.libraries.grpc module does not depend on intellij.libraries.grpc.netty.shaded,
|
||||
* so automatic discovery fails.
|
||||
*/
|
||||
@Service(Service.Level.APP)
|
||||
private class NettyChannelProviderRegistrationService : Disposable {
|
||||
private val registry = ManagedChannelRegistry.getDefaultRegistry()
|
||||
private val channelProvider = NettyChannelProvider()
|
||||
|
||||
init {
|
||||
registry.register(channelProvider)
|
||||
}
|
||||
|
||||
override fun dispose() {
|
||||
registry.deregister(channelProvider)
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun ensureChannelProviderRegistered() {
|
||||
service<NettyChannelProviderRegistrationService>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import com.intellij.execution.process.mediator.client.launcher.ProcessMediatorCo
|
||||
import com.intellij.execution.process.mediator.client.launcher.startInProcessServer
|
||||
import com.intellij.execution.process.mediator.client.rt.MediatedProcessTestMain
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import com.intellij.testFramework.junit5.TestApplication
|
||||
import kotlinx.coroutines.*
|
||||
import org.junit.jupiter.api.AfterEach
|
||||
import org.junit.jupiter.api.Assertions.*
|
||||
@@ -20,6 +21,7 @@ import java.util.concurrent.CancellationException
|
||||
import java.util.stream.Collectors
|
||||
import java.util.stream.Stream
|
||||
|
||||
@TestApplication
|
||||
open class ProcessMediatorTest {
|
||||
private val deferred = CompletableDeferred<Unit>()
|
||||
private val coroutineScope = CoroutineScope(deferred + CoroutineExceptionHandler { _, cause ->
|
||||
|
||||
Reference in New Issue
Block a user