Spring JMS - доступ к необработанному сообщению перед преобразованием сообщения
Я использовал конвертер сообщений для преобразования XML-сообщения из очереди в Java-объект, и он отлично работает.
Так как мой JMSMessageListener получает POJO напрямую, я хотел бы знать, есть ли какой-нибудь способ получить доступ к необработанному XML, который изначально был помещен в очередь.
Как часть отслеживания сообщений, мне нужно сохранить копию необработанного XML-сообщения.
Есть ли какой-нибудь обратный вызов в весеннем jms, чтобы я мог сохранить сообщение xml до его преобразования в POJO?
Мое приложение - весенняя загрузка, и я настраиваю конвертер сообщений в следующем коде
@Configuration
@EnableJms
public class JMSConfig {
@Bean
public JmsListenerContainerFactory<?> myFactory(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 MarshallingMessageConverter createMarshallingMessageConverter(final Jaxb2Marshaller jaxb2Marshaller) {
return new MarshallingMessageConverter(jaxb2Marshaller);
}
@Bean
public Jaxb2Marshaller createJaxb2Marshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setPackagesToScan("com.mypackage.messageconsumer.dto");
Map<String, Object> properties = new HashMap<>();
properties.put(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxb2Marshaller.setMarshallerProperties(properties);
return jaxb2Marshaller;
}
}
Это код слушателя
@Component
public class NotificationReader {
@JmsListener(destination = "myAppQ")
public void receiveMessage(NotificationMessage notificationMessage) {
System.out.println("Received <" + notificationMessage.getStaffNumber() + ">");
// how to get access to the raw xml recieved by sender ?
persistNotification(notificationMessage);
}
1 ответ
Решение
Как-то так должно работать...
@Bean
public MarshallingMessageConverter createMarshallingMessageConverter(final Jaxb2Marshaller jaxb2Marshaller) {
return new MarshallingMessageConverter(jaxb2Marshaller) {
@Override
public Object fromMessage(Message message) throws JMSException, MessageConversionException {
Object object = super.fromMessage(message);
((MyObject) object).setSourceXML(((TextMessage) message).getText());
return object;
}
}
}
... но вы должны добавить больше проверок (например, проверять типы перед приведением).