Problema com agendamento de tarefas com Calendar

0 respostas
java
Bruno_H_Oliveira

Olá Pessoal…
Por gentileza tem como vcs me ajudarem a resolver uma situação de um código, pois não estou conseguindo.

Estou com uma classe que agenda tarefas e que será uma Thread para chamar uma outra Thread de serviço.

Ela lê informações de um um arquivo xml de configuração contendo um ou mais dias da semana que será uma lista e também possuirá horário inicial e horário final de uma tarefa.
Exemplo xml:

  1. <dias>dom,seg,ter,qua,qui,sex,sab</dias>
    
  2. <horarioInicio>20:00</horarioInicio>
    
  3. <horarioTermino>21:00</horarioTermino>
    

Se o dia da semana do sistema for igual contido em uma posição da lista de dias do xml ele entra na condição e e faz o delay até chegar a hora inicial e executar a tarefa com a Thread até a hora final que interrompa a Thread de serviço, mas o problema que quero solucionar e não sei como fazer, quais dessas seriam as melhores formas e qual seria o código:

1º Quando o dia da semana que vem como parâmetro do xml for encontrado e for maior ao dia atual, terá que fazer um delay do horário inicial do dia vindo do xml com a horário atual do sistema.

2º Fazer um delay da ultima hora do dia atual (23:59) com a hora atual:(18:00 por exemplo) onde o dia da semana do sistema mudará e verificará se é igual da lista, caso sim entra na condição, caso contrário faz novamente o ciclo de verificação até a ultima hora do dia novamente.

Segue código:

1. package br.com.gcc.service.extracaodados.controller;

2. import java.text.SimpleDateFormat;
3. import java.util.Calendar;
4. import java.util.List;
5. import java.util.Locale;

6. import org.apache.logging.log4j.LogManager;
7. import org.apache.logging.log4j.Logger;

8. import br.com.gcc.service.extracaodados.controller.task.Extracao;
9. import br.com.gcc.service.extracaodados.model.Produto;

10. public class AgendaExtracao extends Thread {

11. 	private static final Logger LOGGER = LogManager
12. 			.getLogger(AgendaExtracao.class.getName());

13. 	private static final int SECONDS = 60;
14. 	private static final int MILISECONDS = 1000;

15. 	private Produto produto = null;

16. 	public AgendaExtracao(Produto produto) {
17. 		super();
18. 		this.produto = produto;
19. 		setName(produto.getNome());
20. 	}

21. 	@Override
22. 	public void run() {

23. 		try {

24. 			boolean dias = produto.getDias() != null;
25. 			boolean periodo = produto.getHorarioInicio() != null;
26. 			List<String> diaList = produto.getDias();

27. 			if (dias && periodo) {

28. 				Calendar inicio = Calendar.getInstance();
29. 				inicio.setTime(produto.getHorarioInicio());
30. 				Calendar fim = Calendar.getInstance();
31. 				fim.setTime(produto.getHorarioTermino());

32. 				preparaHora(inicio);
33. 				preparaHora(fim);

34. 				while (true) {

35. 					long delay = 0;
36. 					long workingTime = 0;

37. 					try {
38. 						Calendar horaAtual = Calendar.getInstance();
39. 						preparaHora(horaAtual);

40. 						String datahoje = horaAtual.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, new Locale("pt", "BR"))
41. 								.replace('á', 'a').toLowerCase();

42. 						for (int i = 0; i < diaList.size(); i++) {

43. 							if (datahoje.equals(diaList.get(i))) {

44. 								if (inicio.after(fim) || inicio.equals(fim)) {
45. 									fim.add(Calendar.DAY_OF_MONTH, 1);
46. 								}

47. 								if (horaAtual.equals(fim)) {
48. 									inicio.add(Calendar.DAY_OF_MONTH, 1);
49. 									delay = inicio.getTimeInMillis() - fim.getTimeInMillis();
50. 									inicio.set(Calendar.DAY_OF_MONTH, 1);
51. 									workingTime = fim.getTimeInMillis()- inicio.getTimeInMillis();
52. 								}

53. 								else if (horaAtual.after(inicio) && horaAtual.before(fim)) {
54. 									workingTime = fim.getTimeInMillis() - horaAtual.getTimeInMillis();
55. 								}

56. 								else if (horaAtual.after(fim)) {
57. 									inicio.add(Calendar.DAY_OF_MONTH, 1);
58. 									delay = inicio.getTimeInMillis() - horaAtual.getTimeInMillis();
59. 									inicio.set(Calendar.DAY_OF_MONTH, 1);

60. 									workingTime = fim.getTimeInMillis() - inicio.getTimeInMillis();
61. 								}

62. 								else {
63. 									delay = inicio.getTimeInMillis() - horaAtual.getTimeInMillis();
64. 									workingTime = fim.getTimeInMillis() - inicio.getTimeInMillis();
65. 								}

66. 								LOGGER.info("DELAY: {}", delay);
67. 								LOGGER.info("Iniciando o manager em {} minutos",(delay / MILISECONDS / SECONDS));
68. 								LOGGER.info("WorkingTime: {}", workingTime);

69. 								Thread.sleep(delay);

70. 								Extracao extracao = new Extracao(produto);
71. 								extracao.start();
72. 								Thread.sleep(workingTime);

73. 								extracao.interrupt();

74. 							} else {
75. 								
76. 								inicio.add(Calendar.DAY_OF_MONTH, 1);
77. 								delay = inicio.getTimeInMillis() - horaAtual.getTimeInMillis();
78. 								inicio.set(Calendar.DAY_OF_MONTH, 1);

79. 								System.out.println("Delay para o dia seguinte: " + mlsToSegundo(delay));
80. 								LOGGER.info("DELAY: {}", delay);
81. 								Thread.sleep(delay);
82. 							}
83. 						}

84. 					} catch (InterruptedException e) {
85. 						LOGGER.error("Erro na interrupcao do Extrator");
86. 					}
87. 				}
88. 			} else {
89. 				Thread.interrupted();
90. 			}
91. 		} catch (Exception e) {
92. 			LOGGER.error("Exception", e);
93. 		} catch (Error e) {
94. 			LOGGER.fatal("Error", e);
95. 		}
96. 	}

97. 	private void preparaHora(Calendar hora) {
98. 		int diaMes = Calendar.DAY_OF_MONTH;
99. 		int mes = Calendar.DAY_OF_MONTH;
100. 		int ano = Calendar.DAY_OF_MONTH;

101. 		hora.set(Calendar.DAY_OF_MONTH, diaMes);
102. 		hora.set(Calendar.MONTH, mes);
103. 		hora.set(Calendar.YEAR, ano);
104. 	}

105. 	private String mlsToSegundo(long ms) {
106. 		Calendar c = Calendar.getInstance();
107. 		c.set(Calendar.HOUR, 0);
108. 		c.set(Calendar.MINUTE, 0);
109. 		c.set(Calendar.SECOND, 0);
110. 		c.set(Calendar.MILLISECOND, 0);
111. 		c.add(Calendar.MILLISECOND, (int) ms);
112. 		return new SimpleDateFormat("HH:mm").format(c.getTime());
113. 	}
114. }

Como posso resolver isso ?

Criado 3 de março de 2018
Respostas 0
Participantes 1