Opublikowany

I’ve interested in Jetty web server couple years ago,
it has nice slogan „Don’t deploy your application in Jetty, deploy Jetty in your application!”.

I know that Spring Boot is fancy nowadays, but do we really need to create own stuff in fancy technologies?
Maybe we should choose good solution instead easy one?
Well I’m not telling that Spring Boot is not good, in fact I like it and use it sometimes, but it not fit to all cases.

OK if You are lazy and approve Spring stack You can use Spring Boot to all cases ;)
But I’m not and would like to have small ride with Jetty 9.

Let’s create hello world using that server.

What is Jetty, all should know – it is embedded web server which enable all including HTTP 2 capabilities to application.
Where could I get it – of course from maven central repository. I’m using Gradle and 9.4.x version in this hello ride.


compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.2.v20170220'


Basic setup is quite easy

public static void main(final String... args) throws Exception {
        Server server = new Server(8080);
        server.setHandler(new IndexHandler());
        server.start();
        server.join();
}


Just create jetty server object in main method and start it. Interesting thing is being done in setHandler method.
Well first we need to explain what really handlers are in Jetty?

I treat handlers as methods for operating on requests to produce response. Simple nothing more.

So if I would like to present hello world application above IndexHandler would look like that
public class IndexHandler extends AbstractHandler {
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        response.setContentType("text/html; charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        final PrintWriter out = response.getWriter();
        out.println("Hello from Jetty 9");
        baseRequest.setHandled(true);
    }
}

Form the official Jetty documentation [ Link ] passed parameters are:

  • baseRequest – the Jetty mutable request object, which is always unwrapped.
  • request – the immutable request object, which may have been wrapped by a filter or servlet.
  • response – the response, which may have been wrapped by a filter or servlet.

So for sure Spring Boot Hello World would be faster and containing less code, but Jetty 9 give You more freedom of choosing technology stack.

Autor
Kategorie DSP2017, Java

Opublikowany

Wstęp

Jakiś czas temu wpadłem na stronę konkursu „Daj się poznać”, fajna sprawa od jakiegoś czasu prowadzę bloga i stwierdziłem że może dzięki tej inicjatywie uda mi się bardziej systematycznie dodawać do niego treści.
Wielkie dzięki dla organizatora :+1: :D

Jednak nie o tym ma być dzisiejszy wpis.
W ramach konkursu jak i na użytek własny stworzyłem projekt open source pod zacnym tytułem own phone private backup [ Github: https://github.com/tjancz/ownPhonePrivateBackup ]. Idea jest prosta – robić backup istotnych rzeczy zapisanych na własnym telefonie.
Często łapię się na tym że kasuję wątki sms/mms, zdjęcia, pobrane pliki które ktoś mi wysłał bez zastanowienia, a później jednak okazuje się że były potrzebne. :)
Więc czemu by ich nie wrzucać na własny serwer i trzymać pewien czas zanim znikną bezpowrotnie?
Więc będąc zmotywowany do samorozwoju, mając cel przed oczyma zabieram się do pracy.

Analiza problemu

Pierwszym krokiem który każdy, hmm – „programista” powinien zrobić to przeanalizować problem.
Więc i ja to zrobię.
Cel Główny: Mieć backup istotnych danych zapisanych w moim ukochanym androidzie.
Założenia:
- Backup musi być absolutnie prywatny, żadnych publicznych chmur!
- Urządzeniem które backupuje jest mój android phone
- Serwer na który robię backup musi mieć stos technologiczny (fajne słowo) Javy – bo kocham Javę i już :D
- Backup musi się wykonywać w tle samoistnie ( inaczej już po tygodniu zapomnę by go robić )
- Dane z serwera ulatniają się po określonym w konfiguracji terminie

I to chyba wszystko jak na początek.

Fajnie wiem co chcę zrobić teraz wystarczy wymyślić jak i tu pojawia się magiczne słowo

Architektura

Jak dinozaur od razu pomyślałem: „Dla tego problemu idealnie sprawdzi się Klient-Serwer.”
Czemu, gdyż projekt w swym założeniu ma tworzyć backup jednego urządzenia w jednym miejscu.
Jednak czym naprawdę jest architektura klient-serwer?
Wikipedia [ https://en.wikipedia.org/wiki/Client%E2%80%93server_model ] definiuje architekturę klient serwer jako klienta który żąda zasobów i serwer który owe zasoby udostępnia.
Hmm i tu strzał w stopę w moim przypadku to serwer żąda zasobów od klienta, chyba że klient jest serwerem a serwer klientem (?) ;)
A może jak to zwykle w życiu bywa rzeczywistość jest bardziej skomplikowana?

Na pewno mam do czynienia z dwoma modułami, aplikacją androida – moduł 1 i aplikacją Java – moduł 2.

Analizując pobieżnie funkcjonalności mogę stwierdzić że
moduł 1:
- wysyła dane do modułu 2
- żąda odpowiedzi czy dane przechowywane są aktualne
moduł 2:
- pobiera dane
- odpowiada informacją o aktualności danych

Wygląda to trochę jakby jednak oba moduły były czasem klientami a czasem serwerami. Natomiast istotą jest tu kwestia inicjatora operacji. To moduł 1 inicjuje żądania a moduł 2 wykonuje na rzecz modułu 1 operacje i dostarcza wyniki.
Nawet jeśli przeanalizujemy przypadek wysyłania backupu to jednak moduł 1 inicjuje wysyłkę danych oraz oczekuję informacji zwrotnej o powodzeniu ich zapisu po stronie modułu 2.

Czyli jednak mam do czynienia z Client – Server :)

Ciąg dalszy nastąpi…

Pozdrawiam
TJ

Autor
Kategorie DSP2017

Opublikowany

Google Guice is commonly perceived as more light solution that Spring. That’s why some applications which do not want to have Spring / Spring Boot use it.
More about guice could be found at guice wiki page – https://github.com/google/guice/wiki
One of the cool features that guice provide to developers are interceptors. They are officially called AOP in Guice documentation, which in fact is true You can create aspects oriented programming using interceptors in guice.

Base approach contains following steps
Creation of annotation to mark method that we would like to intercept
Mark method with annotation
Creation of method interceptor
Binding interceptor in module

So if we would like to create interceptor that logs method execution time it should look like that

Annotation
Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD)
public @interface FullyLogged {
}

Method mark
@ FullyLogged
public void someMethod() { … }

Interceptor
public class LoggingInterceptor implements MethodInterceptor { private final static Logger LOGGER = LoggerFactory.getLogger(LoggingInterceptor.class);

@Override public Object invoke(final MethodInvocation invocation) throws Throwable { final Stopwatch stopwatch = Stopwatch.createStarted(); final Object returnedObject = invocation.proceed(); LOGGER.info(„Response time from method: „ + invocation.getMethod().getName() + „ of class: „ + invocation.getMethod().getDeclaringClass().getName() +” is: „ + stopwatch.stop().toString()); return returnedObject; } }

Binding
public class MyModule extends AbstractModule {

bindInterceptor(Matchers.any(), Matchers.annotatedWith(FullyLogged.class), new LoggingInterceptor()); }

In my opinion interceptors could make developers life easier but like all AOP should be used wise.
Typical for security or logging.

Best regards
TJ

Autor
Kategorie Java

Opublikowany

Recently for my private project I was forced to use HTTP GET request from my android application to HTTP server.
After some tries with HTTPUrlConnection which is OK but is hard to implement more complicated logic I’ve discovered project OkHttp (http://square.github.io/okhttp/).
It has all I needed out of the box.
Just added Gradle dependency in project build file.
compile «com.squareup.okhttp3:okhttp:3.5.0»

Simple HTTP GET looks like that:

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder().url(url).build(); Response response = client.newCall(request).execute(); return response.body().string();

Where:
client – is only one instance which is needed for multiple HTTP GET calls
request – represents current call
url – is the instance of URL class where in my case I had concatenated all parameters as ? … & with Base64 encoding
response – represent response data from the server

What surprised me is out of the box support for 302 response headers and easy cooperation with different servers.

Best regards
TJ

Autor

Opublikowany

Some time ago I read article about Scala and Java comparison (see link link ) and started to think about performance.
Both languages are executed at JVM but are they have the same statistics, for example with simple operations on big arrays?
To check that I prepared simple one class Java and Scala program and executed it on my laptop.
To be honest I was surprised that Java 8 is much more faster than Scala.
The code You could see at my github: Java vs Scala performance comparison code ( link )
The results are presented below:

Maybe Scala is good choice while You think about thread safety but for fast simple business logic processing application java 8 is better.

Best regards
TJ

Autor
Kategorie Java