-
Notifications
You must be signed in to change notification settings - Fork 29
router registry和distributed在同一个进程异常启动 #42
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,29 +16,28 @@ | |
|
|
||
| package com.alibaba.cloud.ai.autoconfigure.mcp.discovery.client; | ||
|
|
||
| import java.util.ArrayList; | ||
| import java.util.List; | ||
| import java.util.Map; | ||
|
|
||
| import com.alibaba.cloud.ai.mcp.discovery.client.transport.DistributedAsyncMcpClient; | ||
| import com.alibaba.cloud.ai.mcp.discovery.client.transport.DistributedSyncMcpClient; | ||
| import com.alibaba.cloud.ai.mcp.discovery.client.transport.sse.SseWebFluxDistributedAsyncMcpClient; | ||
| import com.alibaba.cloud.ai.mcp.discovery.client.transport.sse.SseWebFluxDistributedSyncMcpClient; | ||
| import com.alibaba.cloud.ai.mcp.nacos.NacosMcpClientProperties; | ||
| import com.alibaba.cloud.ai.mcp.nacos.service.NacosMcpOperationService; | ||
| import com.alibaba.cloud.ai.mcp.nacos.NacosMcpSseClientProperties; | ||
| import org.springframework.beans.factory.ObjectProvider; | ||
| import com.alibaba.cloud.ai.mcp.nacos.service.NacosMcpOperationService; | ||
| import org.springframework.boot.autoconfigure.AutoConfiguration; | ||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||
| import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||
| import org.springframework.context.ApplicationContext; | ||
| import org.springframework.context.annotation.Bean; | ||
|
|
||
| import java.util.ArrayList; | ||
| import java.util.List; | ||
| import java.util.Map; | ||
|
|
||
| /** | ||
| * @author yingzi | ||
| * @since 2025/10/28 | ||
| */ | ||
| @AutoConfiguration(after = { NacosMcpAutoConfiguration.class }) | ||
| @AutoConfiguration | ||
|
||
| @EnableConfigurationProperties({ NacosMcpSseClientProperties.class, NacosMcpClientProperties.class}) | ||
| @ConditionalOnProperty(prefix = "spring.ai.alibaba.mcp.nacos.client", name = { "enabled" }, havingValue = "true", | ||
| matchIfMissing = false) | ||
|
|
@@ -48,11 +47,9 @@ public class NacosMcpSseClientAutoConfiguration { | |
| @ConditionalOnProperty(prefix = "spring.ai.mcp.client", name = { "type" }, havingValue = "SYNC", | ||
| matchIfMissing = true) | ||
| public List<DistributedSyncMcpClient> sseWebFluxDistributedSyncClients( | ||
| ObjectProvider<Map<String, NacosMcpOperationService>> nacosMcpOperationServiceMapProvider, | ||
| Map<String, NacosMcpOperationService> nacosMcpOperationServiceMap, | ||
|
||
| NacosMcpSseClientProperties nacosMcpSseClientProperties, ApplicationContext applicationContext) { | ||
| Map<String, NacosMcpOperationService> nacosMcpOperationServiceMap = nacosMcpOperationServiceMapProvider.getObject(); | ||
| List<DistributedSyncMcpClient> clients = new ArrayList<>(); | ||
|
|
||
| nacosMcpSseClientProperties.getConnections().forEach((name, nacosSseParameters) -> { | ||
| SseWebFluxDistributedSyncMcpClient client = SseWebFluxDistributedSyncMcpClient.builder() | ||
| .serverName(nacosSseParameters.serviceName()) | ||
|
|
@@ -63,7 +60,6 @@ public List<DistributedSyncMcpClient> sseWebFluxDistributedSyncClients( | |
| client.init(); | ||
| client.subscribe(); | ||
| clients.add(client); | ||
|
|
||
| }); | ||
| return clients; | ||
| } | ||
|
|
@@ -72,11 +68,9 @@ public List<DistributedSyncMcpClient> sseWebFluxDistributedSyncClients( | |
| @ConditionalOnProperty(prefix = "spring.ai.mcp.client", name = { "type" }, havingValue = "ASYNC", | ||
| matchIfMissing = true) | ||
| public List<DistributedAsyncMcpClient> sseWebFluxDistributedAsyncClients( | ||
| ObjectProvider<Map<String, NacosMcpOperationService>> nacosMcpOperationServiceMapProvider, | ||
| Map<String, NacosMcpOperationService> nacosMcpOperationServiceMap, | ||
|
||
| NacosMcpSseClientProperties nacosMcpSseClientProperties, ApplicationContext applicationContext) { | ||
| Map<String, NacosMcpOperationService> nacosMcpOperationServiceMap = nacosMcpOperationServiceMapProvider.getObject(); | ||
| List<DistributedAsyncMcpClient> clients = new ArrayList<>(); | ||
|
|
||
| nacosMcpSseClientProperties.getConnections().forEach((name, nacosSseParameters) -> { | ||
| SseWebFluxDistributedAsyncMcpClient client = SseWebFluxDistributedAsyncMcpClient.builder() | ||
| .serverName(nacosSseParameters.serviceName()) | ||
|
|
@@ -86,7 +80,6 @@ public List<DistributedAsyncMcpClient> sseWebFluxDistributedAsyncClients( | |
| .build(); | ||
| client.init(); | ||
| client.subscribe(); | ||
|
|
||
| clients.add(client); | ||
| }); | ||
| return clients; | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -16,29 +16,28 @@ | |||||
|
|
||||||
| package com.alibaba.cloud.ai.autoconfigure.mcp.discovery.client; | ||||||
|
|
||||||
| import java.util.ArrayList; | ||||||
| import java.util.List; | ||||||
| import java.util.Map; | ||||||
|
|
||||||
| import com.alibaba.cloud.ai.mcp.discovery.client.transport.DistributedAsyncMcpClient; | ||||||
| import com.alibaba.cloud.ai.mcp.discovery.client.transport.DistributedSyncMcpClient; | ||||||
| import com.alibaba.cloud.ai.mcp.discovery.client.transport.streamable.StreamWebFluxDistributedAsyncMcpClient; | ||||||
| import com.alibaba.cloud.ai.mcp.discovery.client.transport.streamable.StreamWebFluxDistributedSyncMcpClient; | ||||||
| import com.alibaba.cloud.ai.mcp.nacos.NacosMcpClientProperties; | ||||||
| import com.alibaba.cloud.ai.mcp.nacos.service.NacosMcpOperationService; | ||||||
| import com.alibaba.cloud.ai.mcp.nacos.NacosMcpStreamableClientProperties; | ||||||
| import org.springframework.beans.factory.ObjectProvider; | ||||||
| import com.alibaba.cloud.ai.mcp.nacos.service.NacosMcpOperationService; | ||||||
| import org.springframework.boot.autoconfigure.AutoConfiguration; | ||||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||||
| import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||||||
| import org.springframework.context.ApplicationContext; | ||||||
| import org.springframework.context.annotation.Bean; | ||||||
|
|
||||||
| import java.util.ArrayList; | ||||||
| import java.util.List; | ||||||
| import java.util.Map; | ||||||
|
|
||||||
| /** | ||||||
| * @author yingzi | ||||||
| * @since 2025/10/28 | ||||||
| */ | ||||||
| @AutoConfiguration(after = { NacosMcpAutoConfiguration.class }) | ||||||
| @AutoConfiguration | ||||||
|
||||||
| @AutoConfiguration | |
| @AutoConfiguration(after = { com.alibaba.cloud.ai.autoconfigure.mcp.nacos.NacosMcpAutoConfiguration.class }) |
Copilot
AI
Nov 24, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Directly injecting Map<String, NacosMcpOperationService> instead of using ObjectProvider removes the lazy resolution capability. The original ObjectProvider approach allowed the bean to be resolved at method execution time, which was safer when dealing with potential circular dependencies or when the map bean might not always be available. If NacosMcpAutoConfiguration is not loaded in certain scenarios, this will cause a bean creation failure instead of gracefully handling the absence.
Copilot
AI
Nov 24, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Directly injecting Map<String, NacosMcpOperationService> instead of using ObjectProvider removes the lazy resolution capability. The original ObjectProvider approach allowed the bean to be resolved at method execution time, which was safer when dealing with potential circular dependencies or when the map bean might not always be available. If NacosMcpAutoConfiguration is not loaded in certain scenarios, this will cause a bean creation failure instead of gracefully handling the absence.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The hardcoded key "nacosMcpOperationService" will not match the connection names used in client configurations. When client configurations call
nacosMcpOperationServiceMap.get(name)(wherenamecomes fromgetConnections()), it will return null if the connection name is not "nacosMcpOperationService".Consider either: