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

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

我的 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
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?