Spring: ‘request’ scoped beans into the background thread

It is known that there no way to deal with request-scoped beans outside of request thread. But sometimes it is required to check such beans for existence, because the algorithm should works whether is it a request context or not. The wondering thing is that such bean is not null even in background thread. So we need something more than bean != null.

The working way to do that is:

@Autowired(required = false)
private RequestScopedBean requestScopedBean;

private RequestScopedBean getRequestScopedBean() {
    if (AopUtils.isAopProxy(requestScopedBean) && 
        requestScopedBean instanceof Advised) {
        try {
            Advised advised = (Advised) this.requestScopedBean;
            TargetSource targetSource = context.getTargetSource();
            Object target = targetSource.getTarget();
            return (RequestScopedBean)target;
        } catch (Exception e) {
            // do nothing
        }
    }
    return null;
}

Looking for conventional approach…

Spring: ‘request’ scoped beans into the background thread

MemoryMeter & RamUsageEstimator

There are two tools working in the different ways but giving the same result.

https://github.com/jbellis/jamm and https://github.com/dweiss/java-sizeof

The first one is using a java.lang.instrument.Instrumentation, the second one do it in the old-fashioned way (based on types info).

In case you are using MemoryMeter:

-javaagent:/Users/nikolay/.m2/repository/com/github/jbellis/jamm/0.3.1/jamm-0.3.1.jar

should be passed to VM options

 

MemoryMeter & RamUsageEstimator

Liquibase + JPA DDL autoupdate

It is obvious how things going to when there are some ddl changes in entity and in the same time some Liquibase executables need to be applied.

The order of exec:

  1. liquibase
  2. JPA

PS in my mind this is the best practice when schema managing with sql scripts: main script describes whole schema and patches containing all the changes. Liquibase is also good but it is hard to use together with

hibernate.hbm2ddl.auto=update
Liquibase + JPA DDL autoupdate

Выделение памяти для Java-приложений

Иногда нужно устанавливать не только максимальный размер хипа но и минимальный (стартовый).
Если выставить -Xms512M -Xmx1024 то это заставит GC работать в более агрессивном режиме, и в отсутствие активного выделения памяти размер хипа будет стремиться к стартовому значению.
Если выставить только -Xmx то размер занимаемой памяти программой будет постепенно увеличиваться, пока не достигнет указанного значения.
Есть подозрение, что jvm не проверяет наличие реально доступной памяти в системе, если написать слишком большое число, jvm в рамках этого числа будет просить у OS все большее пространство до тех пор, пока память не закончится, и при очередном невыполнимом запросе OS просто остановит jvm.
Таким образом, если просто выставить размер хипа очень большим, это не гарантирует бесперебойной работы программы.
Нужно подбирать параметры -Xmx и -Xms для каждого конкретного случая.

Выделение памяти для Java-приложений

Простота

«Простота — это главная составляющая того, чтобы быть умным, делать что-то с умом, да и вообще ума. …

Если ты умен, то делаешь вещь как можно более простой, но не проще того. Все что делается, должно делаться с умом. Если это архитектура, нужно моделировать как можно меньше, но но столько, сколько необходимо. Если не моделировать, потратишь массу сил на то, чтобы описать, что ты хочешь сделать, и не получишь необходимого общего представления.»

Ivar Jacobson, major contributor to UML

Простота

How to add dependent maven project as sources in Intellij Idea

Note: this project was added previously as a maven dependency, so now we need to add it as a sources.

Project Structure -> Modules -> [+] -> Import Module

go through the wizard…

After that go to maven tab, then select grey root nodes, right click, choose ‘Unignore Projects’

Maybe you need to reopen IDE.

UPD: also you need to reload cashes. I did it by:

  1. change version of the adding library to one of previous
  2. click ‘Import Changes’ on the ‘Maven projects need to be imported’ tooltip
  3. change it back
  4. again click ‘Import Changes’ on the ‘Maven projects need to be imported’ tooltip
How to add dependent maven project as sources in Intellij Idea