如何使用 convertSendAndReceive() 方法反序列化訊息?NullPointerException由于無法在另一個包中找到反序列化所需的類,它給了我。包在代碼中標記。
Listener 正常接收和發送訊息
package org.dneversky.user;
@EnableRabbit
@Component
public class TestListener {
private static final Logger logger = LoggerFactory.getLogger(TestListener.class);
@Autowired
private RabbitTemplate rabbitTemplate;
@RabbitListener(queues = RabbitMQConfig.RECEIVE_QUEUE)
public void doGet(UserReplyMessage message) {
logger.info("Received message: {}", message);
UserReplyMessage response = new UserReplyMessage();
logger.info("Sending message: {}", response);
rabbitTemplate.convertSendAndReceive(RabbitMQConfig.RPC_EXCHANGE,
RabbitMQConfig.REPLY_QUEUE, response);
}
}
監聽器的配置
package org.dneversky.user.config;
@Configuration
public class RabbitMQConfig {
public static final String RECEIVE_QUEUE = "rpc_queue";
public static final String REPLY_QUEUE = "reply_queue";
public static final String RPC_EXCHANGE = "rpc_exchange";
@Bean
public TopicExchange rpcExchange() {
return new TopicExchange(RPC_EXCHANGE);
}
@Bean
public Queue receiveQueue() {
return new Queue(RECEIVE_QUEUE);
}
@Bean
public Queue replyQueue() {
return new Queue(REPLY_QUEUE);
}
@Bean
public Binding receiveBinding() {
return BindingBuilder.bind(receiveQueue()).to(rpcExchange()).with(RECEIVE_QUEUE);
}
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
}
發件人正常發送訊息,但無法反序列化回傳的訊息
package org.dneversky.gateway.servie.impl;
@Service
public class UserServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
private RabbitTemplate rabbitTemplate;
public UserPrincipal getUserByUsername(String username) {
UserResponse message = new UserResponse(username);
logger.info("Sending created message: {}", message);
UserResponse result = (UserResponse) rabbitTemplate.convertSendAndReceive(RabbitMQConfig.RPC_EXCHANGE, RabbitMQConfig.RPC_QUEUE, message);
logger.info("Getting response: {}", result);
return null;
}
}
發送器的配置
package org.dneversky.gateway.config;
@Configuration
public class RabbitMQConfig {
public static final String RPC_QUEUE = "rpc_queue";
public static final String REPLY_QUEUE = "reply_queue";
public static final String RPC_EXCHANGE = "rpc_exchange";
@Bean
public Queue rpcQueue() {
return new Queue(RPC_QUEUE);
}
@Bean
public Queue replyQueue() {
return new Queue(REPLY_QUEUE);
}
@Bean
public TopicExchange rpcExchange() {
return new TopicExchange(RPC_EXCHANGE);
}
@Bean
public Binding binding() {
return BindingBuilder.bind(replyQueue()).to(rpcExchange()).with(REPLY_QUEUE);
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setExchange(RPC_EXCHANGE);
rabbitTemplate.setReplyAddress(REPLY_QUEUE);
rabbitTemplate.setReplyTimeout(6000);
rabbitTemplate.setMessageConverter(messageConverter());
return rabbitTemplate;
}
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
@Bean
public SimpleMessageListenerContainer replyContainer(ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(REPLY_QUEUE);
container.setMessageListener(rabbitTemplate(connectionFactory));
return container;
}
}
錯誤日志
2022-05-22 17:12:31.344 錯誤 16920 --- [nio-8080-exec-1] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于 servlet [dispatcherServlet] path [] 拋出例外 [請求處理失敗;嵌套例外是 org.springframework.amqp.support.converter.MessageConversionException:決議類名失敗。找不到類 [org.dneversky.user.model.UserReplyMessage]] 根本原因
java.lang.ClassNotFoundException: org.dneversky.user.model.UserReplyMessage
uj5u.com熱心網友回復:
在你里面replyContainer我看不到你的messageConverter豆子。默認情況下,它使用 java 物件來發送和接收訊息,而不將它們轉換為人類可讀的 json。
@Bean
public SimpleRabbitListenerContainerFactory customListenerContainerFactory(ConnectionFactory connectionFactory,
MessageConverter jsonMessageConverter) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(jsonMessageConverter);
return factory;
}
為您的消費者;
@RabbitListener(queues = RabbitConstants.YOUR_QUEUE_NAME, containerFactory = "customListenerContainerFactory")
public void onMessage(@Valid YourEvent YourEvent){
//your code
}
uj5u.com熱心網友回復:
默認情況下,生產者將_TypeID_標頭設定為用于物件序列化的類名
然后消費者使用_TypeID_標頭來知道應該用來將 JSON 轉換為 java 實體的類
您使用兩個不同的類來序列化和反序列化物件,并且您必須配置轉換器
uj5u.com熱心網友回復:
在 Listener 類中,您需要添加此行來系結您的訊息轉換器
@Bean
public SimpleRabbitListenerContainerFactory jsaFactory(ConnectionFactory connectionFactory,
SimpleRabbitListenerContainerFactoryConfigurer configurer) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
factory.setMessageConverter(jsonMessageConverter());
return factory;
}
此外,在 TestListener 類中,您應該替換此行
@RabbitListener(queues = RabbitMQConfig.RECEIVE_QUEUE)
有了這個
@RabbitListener(queues = RabbitMQConfig.RECEIVE_QUEUE,containerFactory="jsaFactory")
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480011.html
上一篇:FirebaseFunctionsv2:為functionX啟動的實體能否接收functionY的流量?
下一篇:為什么在受AzureAD保護的SpringBootApp中將其稱為“APPROLE_Admin”而不是“Admin”
