Проблема с преобразованием объекта Rabbitmq в Java SpringJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблема с преобразованием объекта Rabbitmq в Java Spring

Сообщение Anonymous »

Я пытаюсь интегрировать потоки Rabbitmq в свое приложение Java Spring. Проблема заключается в преобразовании объекта моего пользовательского класса в прослушивателе:

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

@Component
public class Runner implements CommandLineRunner {

private final RabbitStreamTemplate rabbitStreamTemplate;

public Runner(RabbitStreamTemplate rabbitStreamTemplate) {
this.rabbitStreamTemplate = rabbitStreamTemplate;
}

@Override
public void run(String...  args) throws Exception {
System.out.println("Sending message");

UserMessage um = new UserMessage("John", "Smith");

rabbitStreamTemplate.convertAndSend(um);

System.out.println("Hello from my command line runner");
}

}

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

package com.ts.travelSensei.rabbitmq;

import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.Message;
import com.rabbitmq.stream.MessageHandler;
import com.rabbitmq.stream.OffsetSpecification;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.rabbit.stream.config.StreamRabbitListenerContainerFactory;
import org.springframework.rabbit.stream.listener.StreamListenerContainer;
import org.springframework.rabbit.stream.producer.RabbitStreamTemplate;
import org.springframework.rabbit.stream.support.StreamAdmin;
import org.springframework.rabbit.stream.support.converter.StreamMessageConverter;

import java.time.Duration;

@Configuration
public class RabbitMQConfig {

@Bean
StreamAdmin streamAdmin(Environment env) {
return new StreamAdmin(env, sc -> {
sc.stream("stream.queue1").maxAge(Duration.ofHours(2)).create();
});
}

@Bean
RabbitStreamTemplate streamTemplate(Environment env, MessageConverter messageConverter) {
RabbitStreamTemplate template = new RabbitStreamTemplate(env, "stream.queue1");
template.setProducerCustomizer((name, builder) -> builder.name("test"));
template.setMessageConverter(messageConverter);
return template;
}

@Bean
RabbitListenerContainerFactory rabbitListenerContainerFactory(Environment env) {
return new StreamRabbitListenerContainerFactory(env);
}

@RabbitListener(queues = "stream.queue1")
void listen(String in) {
System.out.println("the message is received : " + in);
}

@RabbitListener(queues = "stream.queue1")
void anotherListen(UserMessage in) {
System.out.println("the message is received 2 : " + in.toString());
}

@Bean
RabbitListenerContainerFactory nativeFactory(Environment env) {
StreamRabbitListenerContainerFactory factory = new StreamRabbitListenerContainerFactory(env);
factory.setConsumerCustomizer((id, builder) ->  {
builder.name("myConsumer")
.offset(OffsetSpecification.first())
.autoTrackingStrategy();
});
return factory;
}

@Bean
MessageConverter jackson2MessageConverter() {
return new Jackson2JsonMessageConverter();
}

}

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

package com.ts.travelSensei.rabbitmq;

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

@Setter
@Getter
public class UserMessage implements Serializable {

private String name;

private String surname;

public UserMessage(String name, String surname) {
this.name = name;
this.surname = surname;
}

}
И вот какая ошибка:

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

Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [com.ts.travelSensei.rabbitmq.UserMessage] for GenericMessage [payload=byte[33], headers={amqp_expiration=0, amqp_contentEncoding=UTF-8, id=f6bacd4d-1160-fc81-6114-64767eb651ac, amqp_lastInBatch=false, contentType=application/json, __TypeId__=com.ts.travelSensei.rabbitmq.UserMessage, timestamp=1729684342210}], failedMessage=GenericMessage [payload=byte[33], headers={amqp_expiration=0, amqp_contentEncoding=UTF-8, id=f6bacd4d-1160-fc81-6114-64767eb651ac, amqp_lastInBatch=false, contentType=application/json, __TypeId__=com.ts.travelSensei.rabbitmq.UserMessage, timestamp=1729684342210}]
at org.springframework.messaging.handler.annotation.support.PayloadMethodArgumentResolver.resolveArgument(PayloadMethodArgumentResolver.java:151)
at org.springframework.amqp.rabbit.listener.adapter.AmqpMessageHandlerMethodFactory$OptionalEmptyAwarePayloadArgumentResolver.resolveArgument(AmqpMessageHandlerMethodFactory.java:99)
at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:118)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:147)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:115)
at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:75)
at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:278)
... 17 more`
В конце концов, я хочу, чтобы слушатели принимали мои пользовательские классы, а не строки. На данный момент прослушиватель, который ожидает String, работает нормально, но тот, который ожидает мой пользовательский класс (UserMessage), приводит к исключению.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ava-spring
Ответить

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

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

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

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

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