簡體   English   中英

在運行時設置 Dapr @Topic 字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM