首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Netflix DGS订阅

Netflix DGS订阅
EN

Stack Overflow用户
提问于 2021-04-20 18:56:22
回答 1查看 542关注 0票数 1

我正在遵循DGS subscriptions的文档,我没有得到任何错误,但也没有得到任何数据。

设置非常简单。在schema.graphqls文件中,我定义了订阅:

代码语言:javascript
复制
type Subscription {
    ratings: Rating
}

type Rating {
    stars: Int
}

Java代码如下:

代码语言:javascript
复制
@DgsComponent
public class SubscriptionDataFetcher {
    @DgsData(parentType = "Subscription", field = "ratings")
    public Publisher<Rating> ratings() {
        return Flux.interval(Duration.ofSeconds(1)).map(t -> new Rating(4));
    }
}

如果我现在连接一个websocket到我的后端,它连接得很好,但是没有像预期的那样得到任何数据(不管我怎么做,我也试过使用JavaScript,也连接得很好,但是没有得到任何数据)。

例如,使用curl连接(但使用JavaScript的结果是相同的,连接但没有数据):

代码语言:javascript
复制
curl -o - --http1.1 \
    --include \
    --no-buffer \
    --header "Connection: Upgrade" \
    --header "Upgrade: websocket" \
    --header "Host: localhost:8443" \
    --header "Origin: https://localhost:8443" \
    --header "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==" \
    --header "Sec-WebSocket-Version: 13" \
    https://localhost:8443/subscriptions\?query\=ewoicXVlcnkiOiAic3Vic2NyaXB0aW9uIHsgIHN0b2NrcyB7bmFtZX0gfSIKfQ==

我也尝试过通过Graphiql接口进行连接,但出现了一个错误:

代码语言:javascript
复制
subscription {
  ratings {
    stars
  }
}

错误消息:

代码语言:javascript
复制
{
  "message": "response is not defined",
  "stack": "ReferenceError: response is not defined\n    at https://localhost:8443/graphiql:46:35\n    at async Object.onRun (https://unpkg.com/graphiql/graphiql.min.js:1:540500)"
}

从链接中的示例中,我还不清楚的另一个问题是如何实际管理订阅。例如,假设我想在发生突变时发布通知。任何关于如何使用Netflix DGS框架来做到这一点的建议也将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-09 05:45:38

不幸的是,DGS 附带的 graphiql 界面似乎无法正确处理订阅 - 如果您将 playground-spring-boot-starter 添加到项目中,/playground 将提供更完善的工具,它完全支持订阅。 如果您在那里尝试订阅,它应该可以工作(假设您已经按照文档添加了 graphql-dgs-subscriptions-websockets-autoconfigure)。

关于你的第二个问题,如果发生突变,如何发布通知--不幸的是,文档中没有这个问题,但examples repo中有一个示例。

我在这里对这个例子做了一些简化。如果您想要支持如下的订阅和突变:

代码语言:javascript
复制
@DgsSubscription
public Publisher<Review> reviewAdded() {
    return reviewsService.getReviewsPublisher();
}

@DgsMutation
public Review addReview(@InputArgument SubmittedReview review) {
    return reviewsService.saveReview(review);
}

在您的服务中,您将创建Flux (以返回给订阅者),并保留对其发射器的引用,以便每当发生突变时都可以调用next。

代码语言:javascript
复制
@Service
public class ReviewsService {

    private FluxSink<Review> reviewsStream;
    private ConnectableFlux<Review> reviewsPublisher;

    @PostConstruct
    public void init() {
        Flux<Review> publisher = Flux.create(emitter -> {
            reviewsStream = emitter;
        });

        reviewsPublisher = publisher.publish();
        reviewsPublisher.connect();
    }

    public Review saveReview(SubmittedReview reviewInput) {
        Review review = Review.newBuilder()
                .username(reviewInput.getUsername())
                .starScore(reviewInput.getStarScore())
                .submittedDate(OffsetDateTime.now()).build();

        // Save to the database, etc.

        reviewsStream.next(review); // publishes the review to subscribers
        return review;
    }

    public Publisher<Review> getReviewsPublisher() {
        return reviewsPublisher;
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67177519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档