Логгирование JMS сообщений

Логгирование JMS сообщений

Различные способы логгирования JMS сообщений: 1. Логгирование внутри конвертора (Плюс в том, что будет логгироваться тело сообщения как есть. Если сообщение невозможно распарстить, то оно тоже залоггируется (если конечно это TextMessage)): 2. Логгирование внутри jmsTemplate при отправке (Тоже тело сообщения как есть): 3. Логгирование внутри @JmsListener’а (Тоже тело сообщения как есть): 4. Установка уровня логгирования для входящих сообщений (Минус в том, что логгируется объект Message целиком, и тело сообщения может просто не влезть в максимальную длину записи лога):

JPA Criteria API

JPA Criteria API

Выборка записей с максимальной датой в разрезе значений определённого поля На SQL выражение выглядит так (записи с максимальным create_timestamp у каждого sender’а): Но т.к. criteria api поддерживает подзапросы полько в секции where, то можно реализовать только такой запрос (будет делать то же самое): Если реализовать интерфейс Specification, то он будет выглядеть так: При этом, это поля из модели, сгенерированные maven-плагином: Выборка записей с максимальной датой На SQL выражение выглядит так (записи с максимальным create_timestamp): Если реализовать интерфейс Specification, то он…

Читать далее Читать далее

Открыть файл — предупреждение системы безопасности как отключить

Открыть файл — предупреждение системы безопасности как отключить

Такая вот ерунда просто вымогает при каждом запуске вполне легитимных приложений: В интернете полно статей как отключить защиту Defender, поправить групповые политики, изменить настройки конфиденциальности, разблокировать приложение… Всё это шляпа. Оказалось, что если запускать непосредственно сам exe-шник, то запускается сразу без этих дурацких вопросов. Значит дело в ярлыке. Но не понятно что с ним не так. Проблему удалось решить случайно, итак: На exe-шнике жмём правой кнопкой — Создать ярлык, вылезет окошко с предложением создать его на рабочем столе — жмём…

Читать далее Читать далее

Spring data jdbc: one-to-one, one-to-many relations

Spring data jdbc: one-to-one, one-to-many relations

Т.к. в Spring Data JDBC нет стандартных хибернейтовских аннотаций типа @OneToOne, @OneToMany и @JoinColumn, то для меня было проблематично понять можно ли там вообще организовать отношения и использовать их при получении или сохранении объектов. Оказалось это делается так: One-To-One При такой реализации объект Operation без проблем вычитывается из БД уже с смапленным внутрь TaxInfo. Так же без проблем работает сохранение нового Operation с заполненным TaxInfo (корректно заполняются поля id и operationId. One-To-Many Несколько проблематично отношение один ко многим. Здесь сложность…

Читать далее Читать далее

Логгирование обращений к базе данных в Spring Boot

Логгирование обращений к базе данных в Spring Boot

Чтобы логгировать SQL-запросы к базе данных — нужно добавить следующие свойства: Ещё есть вариант использовать библиотеку p6spy, которая будет писать в лог настоящие запросы:

Задержка принятия следующего Jms сообщения после ошибки

Задержка принятия следующего Jms сообщения после ошибки

Вариант реализации JmsListenerContainerFactory (на основе DefaultJmsListenerContainerFactory) для задержки принятия следующего jms сообщения, если был выброшен необработанный эксепшен: Инициализация выглядит следующим образом

9.Транзакционность в JMS

9.Транзакционность в JMS

Транзакционность используется для возвращения сообщения обратно в очередь, в случае возникновения исключения при его обработке. Для настройки транзакционности, нужно указать ContainerFactory бину — бин PlatformTransactionManager. Пример настроек JMS: Для того, чтобы rollback сообщения сработал, достаточно чтобы из метода помеченного @JmsListener выбросилось необработанное исключение. Таким образом, исходное сообщение снова появится в очереди и его хэадер JMSXDeliveryCount увеличится на 1. Но здесь есть сайд-эффект, т.к. это сообщение через секунду снова залетит в приложение. Таким образом, если исключение будет постоянно появляться — мы…

Читать далее Читать далее

Кастомная Jackson десериализация/сериализация

Кастомная Jackson десериализация/сериализация

Допустим, имеем такую DTO: А нам нужно десериализовать из такого json: То используем над полем аннотацию @JsonDeserialize(using = ProductDtoDeserializer.class) и делаем десериализатор А теперь сделаем так, чтобы строковое поле сериализовывалось в UpperCase