Не могу обработать сообщение от NATS в моем приложении Java/KotlinJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Не могу обработать сообщение от NATS в моем приложении Java/Kotlin

Сообщение Anonymous »

У меня есть класс, в котором мне нужно отправить сообщение в тему NATS, получить ответ и затем обработать его. Вот метод обслуживания моего приложения Java Spring:

Код: Выделить всё

public CreateRenewRsEvent getOrderCreationResponse(CreateRenewRqEvent createRenewRqEvent) {
try {
log.info("Sending  order.create event: {}", objectMapper.writeValueAsString(createRenewRqEvent));
final Message response = natsConnection.request(
natsProperties.getSendTopic(),
objectMapper.writeValueAsBytes(createRenewRqEvent),
natsProperties.getTimeout()
);
log.info("Received  order.create response: {}", new String(response.getData(), StandardCharsets.UTF_8));
response.ack();
return objectMapper.readValue(response.getData(), CreateRenewRsEvent.class);
} catch (Exception e) {
log.warn("Error sending  order.create message", e);
}
return null;
}
Я запускаю этот сервер локально в Docker, поэтому есть другой метод компонента, который должен обрабатывать сообщение:

Код: Выделить всё

@PostConstruct
fun setUp() {
natsConnection.createDispatcher { handleMessage(it) }
.subscribe(natsProperties.sendTopic)
}

private fun handleMessage(msg: Message) {
val receivedMessage = String(msg.data, StandardCharsets.UTF_8)
val jsonNode = objectMapper.readTree(receivedMessage)
if (!jsonNode.has("response") || !jsonNode.has("err")) {
logger.info("Received order.create message: $receivedMessage")
val responseEvent = getOrderCreateResponse(receivedMessage)
natsConnection.publish(
natsProperties.sendTopic,
objectMapper.writeValueAsBytes(responseEvent)
)
logger.info("Sending order.create response: $responseEvent")
}
}
Проблема в том, что когда я пытаюсь прочитать сообщение в своем первом методе, я получаю NPE — сообщение равно нулю, как и его тело.
Я попробовал использовать диспетчер с методом nextMessage(), и это сработало, но что мне действительно нужно, так это метод request() - это интеграция с внешней системой.
Что я делаю не так?
P.S. Еще несколько фактов:
  • Соединение открывается, поэтому и отправитель, и получатель подключаются к локальному серверу.
  • Во время отладки. mode отправляю сообщение, вижу, что на сервере только одна тема, это order.create. Но после обработки сообщения появляется еще одно — «_INBOX.rel468mZPCUYu9tUu48JRa.rel468mZPCUYu9tUu48JhC». Это значение поля msg.replyTo(), но отправка моего ответа в него тоже не помогает:(


Подробнее здесь: https://stackoverflow.com/questions/788 ... kotlin-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»