ConnectedController.cs
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Linq;
5 using System.Text;
6 
7 using System.Timers;
8 using Newtonsoft.Json;
9 using sage.ew.db;
10 using sage.ew.global;
11 
12 namespace sage.ew.ewbase
13 {
17  public class ConnectedController: IDisposable
18  {
19  #region PROPIEADES PRIVADAS
20 
21  private int _nIntervalo = 5; // minutos
22  private DateTime? _dUltEjecucion = null;
23  private string _cMensajeError = string.Empty;
25  Timer _aTimer;
26  private BackgroundWorker _oBackgroundWorker;
27  private string _cTerminal = Convert.ToString(EW_GLOBAL._GetVariable("wc_terminal")).Trim();
28 
29  #endregion
30 
31  #region PROPIEDADES PUBLICAS
32 
36  public int _Intervalo
37  {
38  get => _nIntervalo;
39  set => _nIntervalo = value;
40  }
41 
45  public bool _Master
46  {
47  get => ValidacionMaster();
48  }
49 
53  public DateTime? _UltEjecucion
54  {
55  get => _dUltEjecucion;
56  }
57 
61  public string _MensajeError
62  {
63  get => _cMensajeError;
64  }
65 
66  #endregion
67 
68  #region CONSTRUCTOR
69 
74  {
75  if (_oBackgroundWorker != null && _oBackgroundWorker.IsBusy)
76  return;
77 
78  // Declaro un nuevo elemento
79  _oBackgroundWorker = new BackgroundWorker
80  {
81  WorkerSupportsCancellation = false,
82  WorkerReportsProgress = false
83  };
84 
85  // Declaro los procesos
86  _oBackgroundWorker.DoWork += _oBackgroundWorker_DoWork;
87 
88  // Ejecución asíncrona
89  _oBackgroundWorker.RunWorkerAsync();
90  }
91 
92  #endregion
93 
94  #region METODOS PUBLICOS
95 
99  public delegate void _ConnectedEvent_Handler(ref bool tlOk);
100 
104  public event _ConnectedEvent_Handler _ConnectedEvent;
105 
109  public void _Delete()
110  {
111  if (_Master)
112  {
113  try
114  {
115  DB.SQLBegin();
116  EW_GLOBAL._DeleteDbVariable("Master");
117  DB.SQLCommit();
118  }
119  catch (Exception loEx)
120  {
121  DB.SQLRollback();
122  _cMensajeError = loEx.Message;
123  }
124  }
125  }
126 
127  #endregion
128 
129  #region METODOS PRIVADOS
130 
136  private bool ValidacionMaster()
137  {
138  _cMensajeError = string.Empty;
139  string lcMaster = string.Empty;
140 
141  bool llOk = EW_GLOBAL._GetDbVariableString("Master", ref lcMaster);
142  bool llActualizaMaster = (!llOk || string.IsNullOrWhiteSpace(lcMaster)); //No existe, soy yo el Master
143 
144  if (!llActualizaMaster)
145  {
146  try
147  {
148  _oMaster = JsonConvert.DeserializeObject<ConnectedControllerMaster>(lcMaster);
149  }
150  catch (Exception loEx)
151  {
152  _cMensajeError = loEx.Message;
153  }
154 
155  if (_oMaster != null)
156  {
157  ConfigurarTimer(); //actualizamos timer con el valor de la propiedad _Frecuencia
158  llActualizaMaster = (_oMaster._Terminal == _cTerminal);
159  if (!llActualizaMaster) //comparo el terminal por si me han quitado el master
160  {
161  TimeSpan loTimeSpan = DateTime.Now - _oMaster._Fecha; //validamos fecha
162  llActualizaMaster = (loTimeSpan.TotalMinutes > (2 * _Intervalo)); //Caducado, soy yo el Master
163  }
164  }
165  }
166 
167  if (llActualizaMaster)
168  return ActualizarMaster();
169  else
170  return false;
171  }
172 
177  private bool ActualizarMaster()
178  {
179  _oMaster._Get(); //nos devuelve la instancia con los datos actualizados
180 
181  try
182  {
183  DB.SQLBegin();
184  EW_GLOBAL._SaveDbVariable("Master", JsonConvert.SerializeObject(_oMaster));
185  DB.SQLCommit();
186  }
187  catch (Exception loEx)
188  {
189  DB.SQLRollback();
190  _cMensajeError = loEx.Message;
191  }
192 
193  return true;
194  }
195 
200  private bool ActivarInvoke()
201  {
202  return _Master && _oMaster?._Frecuencia != 0; //Al comprobar si es _Master hace el load del objeto _oMaster y así tenemos el valor de la tabla variable si se ha modificado
203  }
204 
208  private void ConfigurarTimer()
209  {
210  if (_oMaster == null)
211  return;
212 
213  if(_oMaster._Terminal == _cTerminal && _oMaster._Frecuencia != 0 && _oMaster._Frecuencia != _Intervalo )
214  {
215  int lnInterval = 1000 * 60 * _oMaster._Frecuencia;
216  _aTimer.Stop();
217  _aTimer.Interval = lnInterval;
218  _aTimer.Start();
219  }
220  }
221 
225  private void _oBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
226  {
227  SetTimer();
228  }
229 
233  private void SetTimer()
234  {
235  _aTimer = new Timer(1000 * 60 * _Intervalo);
236  _aTimer.Elapsed += _aTimer_Elapsed;
237  _aTimer.Enabled = true;
238  }
239 
245  private void _aTimer_Elapsed(object sender, ElapsedEventArgs e)
246  {
247  if(ActivarInvoke())
248  {
249  try
250  {
251  bool llOk = false;
252  _ConnectedEvent?.Invoke(ref llOk);
253  }
254  catch (Exception loEx)
255  {
256  _cMensajeError = "Se ha producido un error en la invocación de los eventos suscritos a ConnectedController: " + loEx.Message;
257  DB.Escribir_En_Log_Error(DB.Modo_Registro.Registro_Error, loEx, _cMensajeError);
258  }
259  }
260  }
261 
265  private void CloseTimer()
266  {
267  if(_aTimer!=null)
268  _aTimer.Enabled = false;
269  }
270 
271  #endregion
272 
273  #region DISPOSE
274 
278  public void Dispose()
279  {
280  _oMaster = null;
281  CloseTimer();
282  _aTimer = null;
283  }
284 
285  #endregion Dispose
286  }
287 }
void _Delete()
Si soy yo el Master, borro el registro con valor master de la tabla variable
void Dispose()
Gestión del dispose
void _Get()
Actualiza los campos de la clase con los valores actuales
_ConnectedEvent_Handler _ConnectedEvent
Evento
int _Frecuencia
Frecuencia en la que se ejecuta el ConnectedController
DateTime _Fecha
Fecha en la que se ha ejecutado el ConnectedController
Control de las peticiones realizadas con plataformas de terceros