Статьи

Java EE пересматривает шаблоны проектирования: асинхронный

Хотя вы не можете найти вызовы асинхронных методов в качестве шаблона проектирования, я считаю, что стоит упомянуть. Итак, вот последний пост из моей серии шаблонов проектирования JavaEE Revisits.

Асинхронные вызовы методов — это не намного больше, чем многопоточность. В основном это относится к вызову метода, который будет выполняться в отдельном потоке, поэтому основной (вызывающий) поток не должен ждать результата выполнения вызванного метода. В эпоху веб-программирования разработчики в основном делегируют проблемы с потоками работающему серверу, и создание новых потоков может быть сложным и иногда опасным для веб-серверов, поскольку им обычно нравится управлять потоками самостоятельно.

Однако хорошо играть с серверами, используя потоки, очень просто с JavaEE. Аннотирования метода с помощью @Asynchronous было бы достаточно, чтобы указать контейнеру JavaEE запускать вызываемый метод в отдельном потоке в асинхронном режиме. Чтобы протестировать асинхронное выполнение, давайте добавим новый метод, помеченный асинхронной аннотацией, в нашем предыдущем примере .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.devchronicles.observer;
 
 
import javax.ejb.Asynchronous;
import javax.ejb.Stateless;
import javax.enterprise.event.Observes;
 
 
/**
 *
 * @author Murat Yener
 */
@Stateless
public class EventObserver {
     
    @Asynchronous
    public void doLogging(@Observes String log) {
        System.out.println("1.Start logging:"+log);
        try{
             Thread.sleep(3000);
        }catch (InterruptedException e){}
        System.out.println("1.done logging");
    }
     
    public void doLogging2(@Observes String log) {
        System.out.println("2.Start logging:"+log);
        try{
             Thread.sleep(3000);
        }catch (InterruptedException e){}
        System.out.println("2.done logging");
    }
}

Класс EventService остается тем же самым за исключением нескольких строк для регистрации.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.devchronicles.observer;
 
 
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.event.Event;
import javax.inject.Inject;
 
 
/**
 *
 * @author Murat Yener
 */
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EventService {
    @Inject
    private String message;
     
    @Inject
    Event<string> event;
     
    public void startService(){
        System.out.println("start service call "+message);
        event.fire("this is my "+message);
        System.out.println("done...");
    }
}

Запустите приложение и нажмите кнопку index.xhtml, которая запустит метод startService. Файл журнала должен быть похож на приведенный ниже.

1
2
3
4
5
6
7
INFO: Observer was successfully deployed in 553 milliseconds.
INFO: start service call A message!!
INFO: 2.Start logging:this is my A message!!
INFO: 2.done logging
INFO: done...
INFO: 1.Start logging:this is my A message!!
INFO: 1.done logging

Хотя журнал может отличаться, вы все равно должны четко видеть, что вызывается метод startService, который запускает событие, за которым следует выполнение второго метода ведения журнала. Метод startService ожидал завершения выполнения второго метода журнала. Однако первый метод ведения журнала запускается и завершает свое выполнение независимо от выполнения любого из других методов.

Хотя этот пример основан на методах void, довольно просто использовать Future <> в качестве возвращаемого типа и получать результат асинхронно.

Асинхронная аннотация очень проста в использовании и может быть очень полезна в ситуациях, когда вы не хотите ждать выполнения вызванного метода.

Ссылка: JavaEE пересматривает шаблоны проектирования: асинхронно от нашего партнера по JCG Мурата Йенера в блоге Developer Chronicles .