[英]Setting Dapr @Topic fields at runtime
堆棧:Java Jakarta EE10 Wildfly27 Docker Dapr
問題是主題的動態配置。 我有幾個環境 TEST/DEV/PROD,我想為不同的環境使用不同的主題,但使用相同的圖像。 理想情況下,我想通過環境變量設置主題。
那么為什么不做這個聲明呢? 好吧,當我在 Azure 容器服務(ACA)上運行 Dapr 時,它不(!)支持聲明式配置(!)
所以在我的訂戶中執行此操作的方法是通過注釋@Topic
像這樣@Topic(name = "cache_update", pubsubName = "${myAppProperty:messagebus}")
在上面的示例中,“messagebus”是默認值,“myAppProperty”是應用程序屬性的名稱。
如果我使用 Spring 這會有效,但我們使用的是在 Wildfly 27 上運行的 Jakarta EE10
我到底怎樣才能讓它發揮作用?
Dapr Java SDK 只為Spring Boot提供原生集成; 其中處理特定於 Dapr 的注釋(例如Topic
)並將它們的配置合成到相應的操作中,同時考慮到屬性解析,在您的情況下,這將是主題訂閱創建。
要針對配置有線主題值動態創建訂閱,您可以使用 Dapr SDK 以編程方式通過在/dapr/subscribe
端點上公開路由來創建訂閱主題:
@Path("/dapr")
public class DaprController {
private static final DefaultObjectSerializer SERIALIZER = new DefaultObjectSerializer();
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/subscribe")
public Response subscribeTopics() {
String topic = "TOPIC_NAME"; // you can resolve this value out of environment variables, system properties or MicroProfile config is you are using Wildfly-extras
String pubsub = "PUBSUB"; // resolve this values as well through any external meaning
TopicConfig config = new TopicConfig(pubsub, topic, "/handleTopicRoute", Collections.emptyList());
return Response.ok(SERIALIZER.serialize(Collections.singleton(config))).build();
}
}
下面是 Topic 配置模板(靈感來自 Spring Boot integration DaprTopicConfiguration):
public class TopicConfig {
private final String pubsubName;
private final String topic;
private final String route;
private final Map<String, String> metadata;
public TopicConfig(String pubsubName, String topic, String route, Map<String, String> metadata) {
this.pubsubName = pubsubName;
this.topic = topic;
this.route = route;
this.metadata = Collections.unmodifiableMap(metadata);
}
public String getPubsubName() {
return pubsubName;
}
public String getTopic() {
return topic;
}
public String getRoute() {
return route;
}
public Map<String, String> getMetadata() {
return metadata;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.