Как заменить переменные в запросе GraphQL с помощью компонента Camel GraphQL

Я пытаюсь построить верблюжий маршрут, чтобы использовать сообщение из ActiveMQ, извлечь некоторые поля JSON и отправить извлеченную полезную нагрузку на сервер graphql. Я следил за документацией по компоненту graphql, однако не смог понять, как динамически получать значения переменных из биржи.

# bookByIdQuery.graphql
query($id : String!) {
  book(id :$id) {
    id
    name
  }
}

@BindToRegistry("bookByIdQueryVariables")
public JsonObject bookByIdQueryVariables() {
    JsonObject variables = new JsonObject();
    variables.put("id", "book-1");
    return variables;
}

from("direct:start")
    .to("graphql://http://example.com/graphql?queryFile=bookByIdQuery.graphql&variables=#bookByIdQueryVariables")

В приведенном выше примере я хочу получить значение переменной от биржи. Я имею в виду книгу-1, которую мне нужно получить на бирже. Для этого я сделал метод, который принимает обмен в качестве параметра, однако он не заменяет значения в запросе. Я попытался выполнить отладку и увидел, что обмен имеет значение null, а bean-компонент bookByIdQueryVariables найден в контексте. Похоже, что нет преобразователя для преобразования типа bookByIdQueryVariables в объект JSON. Пожалуйста, предложите, если есть проблема в запросе graphql или переменной bean. Любая помощь приветствуется


person javalearner    schedule 14.12.2020    source источник


Ответы (1)


Вы можете найти объект bookByIdQueryVariables в реестре, который можно получить из контекста верблюда, и заменить его телом сообщения обмена (или чем угодно):

from("direct:start")
    .process(exchange -> {
        String body = exchange.getIn().getBody(String.class);
        Registry registry = exchange.getContext().getRegistry();
        JsonObject variables = registry.lookupByNameAndType("bookByIdQueryVariables", JsonObject.class);
        variables.put("id", body);
    })
    .to("graphql://http://example.com/graphql?queryFile=bookByIdQuery.graphql&variables=#bookByIdQueryVariables")

РЕДАКТИРОВАТЬ:

как упомянул Чин Хуанг, в зависимости от контекста следовать этому подходу может быть небезопасно, поскольку мы изменяем общее значение в реестре. В контексте синхронных маршрутов это должно быть довольно безопасно, но если оно предназначено для использования в многопоточной/параллельной среде, то, скорее всего, это не будет хорошим решением.

person t3h_b0t    schedule 15.12.2020
comment
Если вы измените объект bookByIdQueryVariables в реестре, будут ли параллельно выполняемые обмены пытаться поместить разные значения в переменную id? Если в реестре есть один объект bookByIdQueryVariables, то шаг GraphQL может отправить неправильное значение id. На мой взгляд, компонент Camel GraphQL должен быть улучшен для динамического чтения этих переменных из тела сообщения или заголовков. - person Chin Huang; 15.12.2020
comment
@ChinHuang согласился, я отредактировал свой ответ. - person t3h_b0t; 15.12.2020
comment
@Чинхуанг. Ты прав. Теперь я столкнулся с ситуацией. Есть ли у вас какое-либо решение в случае многопоточности? - person javalearner; 08.01.2021