Сделайте инъекцию DAO в потоке - PullRequest
0 голосов
/ 14 января 2020

Я занимаюсь разработкой веб-приложения в java ее с помощью wildfly, мне нужно разработать веб-сервис, который немедленно отвечает клиенту, но вы должны создать задачу или поток для выполнения некоторых задач и, наконец, обновить запись. в базе данных

Это базовый c пример, здесь создан поток

@GET
@Path("/createReq")
@Produces("application/json")
public void createReq() {
    objThread trip = new ObjThread();
    trip.setIdTrip("id");
    trip.start();
}

Это базовый c пример, здесь создан поток

public class ObjThread extends Thread {
    volatile boolean ejecutar = true;
    public String idTrip;
    private int time = 0;

    @Inject
    Tbl_car_tripDAO tripDAO;

    @Override
    public void run() {
        try {
            while (ejecutar) {
                if (time == 1) { 
                    // task 1
                } else if (time ==  3) { //30
                    // task 2
                } else if (time >= 5) { //45
                    // task 3
                    detener();
                    changeStatus();
                }
                Thread.sleep(1000);
                time++;
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    public void detener() {
        ejecutar = false;
    }

    public void changeStatus() {
        try {
            Tbl_car_trip trip= tripDAO.getTripByIdTrip(idTrip);
            trip.setCar_tri_status("data");
            tripDAO.update(trip);
        } catch (Exception e) {
            e.printStackTrace();
            // TODO: handle exception
        }
    }

    public void setIdTrip(String idTrip) {
        this.idTrip = idTrip;
    }
}

Но во время выполнения я получаю ошибку постоянства в методе changeStatus, но если я использую тот же метод с аннотацией @inject в другом классе, он работает правильно. Не могли бы вы помочь мне решить эту проблему с рекомендация. Спасибо

Обновление

Это мой класс DAO

@Singleton
public class Tbl_car_tripDAO {

    @Inject
    private EntityManager em;

    public boolean update(Tbl_car_trip tbl_car_trip) {
        try {
            em.merge(tbl_car_trip);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

1 Ответ

0 голосов
/ 14 января 2020

ObjThread должен быть bean-компонентом Spring, чтобы вы могли внедрить зависимость (Tbl_car_tripDAO).

@Component
@Scope("prototype")
public class ObjThread extends Thread {

Вам потребуется получить ObjThread из контекста Sprint (не может быть создан с помощью нового ObjThread ()

...