【发布时间】:2020-09-08 09:05:04
【问题描述】:
如果JMS接收器由于数据库连接失败等原因失败,则JMS消息将丢失。任何人都可以建议我避免使用 Spring Boot 应用程序丢失 JMS 消息的常见解决方案是什么
如果在接收端处理消息时出现错误,我是否应该将消息重新发送回它起源的队列?
这是我的场景源代码。
@SpringBootApplication
public class MainApp {
public static void main(String[] args) {
SpringApplication.run(MainApp.class, args);
}
@Bean
public JmsListenerContainerFactory<?> sdbFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
// This provides all boot's default to this factory, including the message converter
configurer.configure(factory, connectionFactory);
// You could still override some of Boot's default if necessary.
return factory;
}
@Bean
public Queue queue() {
return new ActiveMQQueue("sdb.orderQueue");
}
@Bean
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
@Bean
public ModelMapper mapper() {
ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
return mapper;
}
}
制片人
@RestController
@RequestMapping("/transaction")
public class OrderTransactionController {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
private static final Logger LOGGER =
LoggerFactory.getLogger(OrderTransactionController.class);
@PostMapping("/send")
public void send(@RequestBody OrderDTO order) {
LOGGER.info("Sending a transaction."+ order);
jmsMessagingTemplate.convertAndSend("sdb.orderQueue", order);
}
}
消费者
@Component
public class OrderMessageReceiver {
@Autowired
OrderService service;
@Autowired
ModelMapper modelMapper;
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
private static final Logger LOGGER =
LoggerFactory.getLogger(OrderMessageReceiver.class);
@JmsListener(destination = "sdb.orderQueue", containerFactory = "sdbFactory")
public void receiveQueue(OrderDTO order) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ModelMapper modelMapper = new ModelMapper();
OrderEntity orderEntity = modelMapper.map(order, OrderEntity.class);
try {
service.createOrder(orderEntity);
} catch (Exception e) {
LOGGER.error("Error happend while trying to persist order : {} error is : {}",order, e);
}
}
}
【问题讨论】:
-
在处理完成之前不要确认消息,这样如果处理失败,消息仍会在队列中,稍后可以传递给另一个消费者。
-
我是否可以控制确认,如果可以,我该如何在 Spring Boot 中进行操作以避免在处理成功完成之前确认发件人
标签: spring-boot jms message-queue spring-jms