工作经理的定期工作请求在给定实例中对同一工作执行多个请求

问题描述

我的 android 应用程序中有一个工作经理,我正在使用它来实现一个周期工作请求,每 15 分钟发送一封电子邮件,但是,有时,在 15 分钟后,而不是 1 封电子邮件,多个电子邮件-为相同的工作发送邮件。我怎样才能解决这个问题?在我的 Worker 课程中,给定特定条件,我想在 15 分钟后仅针对特定作业发送一封电子邮件。

工人阶级

public class CloseFlight extends Worker {

    private FlightRepository flightRepo;
    public Context context;
    DateTimeFormatter formatter;
    LocalDateTime final_departure_time;

    String aircraft_type;



    public CloseFlight(@NonNull Context context,@NonNull WorkerParameters workerParams) {
        super(context,workerParams);
        this.flightRepo = new FlightRepository(context);
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @NonNull
    @Override
    public Result doWork() {
        String flightnumber = getInputData().getString("flightno");
        String date = getInputData().getString("departuredate");

        formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

        if(!(flightnumber==null || date == null)) {
            Flight flight_value = flightRepo.getFlight(flightnumber,date);

            String departure_time = flight_value.getFinal_departure_time();
            final_departure_time = LocalDateTime.parse(departure_time,formatter);

            String datetime_now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
            LocalDateTime time_now = LocalDateTime.parse(datetime_now,formatter);


            long diffInMinutes = Duration.between(final_departure_time,time_now).toMinutes();
            String email_status = flight_value.getFlight_closure_status();


            \\I want this to be executed just once 
            if(diffInMinutes>60 && email_status.contentEquals("opened")) {

                aircraft_type = flight_value.getAircraft_type();

                String email = "Details " + "\n" + flightnumber + " " + date + "\n" + "\n" + "Date: " + " " + date + "\n" + "Aircraft Type: " + " " + aircraft_type;

                //Sending the email from here
                JavaMailAPI javaMailAPI = new JavaMailAPI(context,"myemailid@gmail.com","Email for " + flightnumber + " and Departure date: " + date,email);
                javaMailAPI.execute();

                FlightClosureStatus flightClosureStatus = new FlightClosureStatus(flightnumber,date,"emailsent");
                flightRepo.updateFlightClosureStatus(flightClosureStatus);

            }

        }

        return Result.success();
    }


}

活动

for(int i =0 ; i< length_report; i ++) {
    String status = reportitems.get(i).getStatus();


    if(status.contentEquals("opened")){
        String flightNumber = reportitems.get(i).getFlightNumber();
        String departureDate = reportitems.get(i).getDepartureDate();


        Data data = new Data.Builder()
            .putString("flightno",flightNumber)
            .putString("departuredate",departureDate).build();

        Constraints constraints = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .build();

        final PeriodicWorkRequest periodicWorkRequest2 = new PeriodicWorkRequest.Builder(CloseFlight.class,15,TimeUnit.MINUTES)
            .setConstraints(constraints)
            .setInputData(data)
            .build();

        WorkManager workManager =  WorkManager.getInstance(ReportListingActivity.this);

        workManager.enqueue(periodicWorkRequest2);

        workManager.getWorkInfoByIdLiveData(periodicWorkRequest2.getId())
            .observe(ReportListingActivity.this,new Observer<WorkInfo>() {
                @Override
                public void onChanged(@Nullable WorkInfo workInfo) {
                    if (workInfo != null) {
                        Log.d("periodicWorkRequest","Status changed to : " + workInfo.getState());
                    }
                }
        });
    }
}

解决方法

我相信工作经理通过工人阶级区分工作,并且由于您使用相同的工人阶级,因此只会考虑第一个工作(使用相同的数据,其中包含您的航班详细信息)。>

意思是,当第一个工作被安排时,一切都很好。但是当你安排同一个工人的第二个时 - 它会再次使用前一个工作。

在不同的上下文中使用同一个worker类是可以的,但是你应该让工作经理知道如何区分同一个worker的work。

我建议改用唯一名称:

workManager.enqueue(periodicWorkRequest2);

使用这个:

workManager.enqueueUniquePeriodicWork(
    “UNIQUE_NAME”,// Maybe you should use the flight number?
    ExistingPeriodicWorkPolicy.KEEP,// to not send mail if another being sent right now
    periodicWorkRequest2
);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...