首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >工作经理的定期工作请求在给定实例中对同一工作执行多个请求

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

Stack Overflow用户
提问于 2021-03-09 04:17:37
回答 1查看 590关注 0票数 0

我在我的android应用程序中有一个工作经理,我使用它来实现一段时间的工作请求,每隔15分钟发送一封电子邮件,然而,有时,在15分钟之后,而不是1封电子邮件,多封电子邮件被发送给同一项工作。我怎么才能解决这个问题?如果在我的Worker类中有特定的条件,我只想在15分钟后发送一封特定工作的电子邮件。

工人类

代码语言:javascript
运行
复制
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();
    }


}

活性

代码语言:javascript
运行
复制
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());
                    }
                }
        });
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-03-09 08:12:04

我相信工作经理根据工人类来区分工作,因为您使用的是同一个工人类,所以只会考虑到第一个作业(有相同的数据,其中包含在您的情况下的航班详细信息)。

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

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

我建议使用唯一的名称,而不是:

代码语言:javascript
运行
复制
workManager.enqueue(periodicWorkRequest2);

用这个:

代码语言:javascript
运行
复制
workManager.enqueueUniquePeriodicWork(
    “UNIQUE_NAME”, // Maybe you should use the flight number?
    ExistingPeriodicWorkPolicy.KEEP, // to not send mail if another being sent right now
    periodicWorkRequest2
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66540734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档