2017-02-05 14 views
1

Мне нужен ваш ценный совет на QUARTZ.NET. Я использую это планирование для запуска моей функции каждые 10 секунд. На самом деле мой код получает данные из json-файлов и сравнивает их с SQL-сервером базы данных. Если идентификатор соответствует базе данных, то он ничего не сделает, иначе он будет чирикать продукт. Некоторое время код успешно работает, я не получаю дубликатов записей. Но когда-нибудь он вставляет дубликаты в базу данных, и можно только пропустить существующий = (int) cmd.ExecuteScalar(); Скажите, пожалуйста, что делать. Потому что я не могу увеличить время графика с более чем 10 секунд. И как прекратить пропустить одну строку в этом. Ниже мой код. Это будет большой помощью для меня .. Пожалуйста, помогите. БлагодаряQuartz.NET пропускает шаги во время выполнения

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 
       scheduler.Start(); 
       // scheduler.ResumeAll(); 

       IJobDetail job = JobBuilder.Create<SampleJob>() 
           .WithIdentity("currencyJob", "group1") 
           .Build(); 

       // IJobDetail job = JobBuilder.Create<SampleJob>().Build(); 
       ITrigger trigger = TriggerBuilder.Create() 
         .WithIdentity("trigger1", "group1") 
         .WithSimpleSchedule(s => s.WithIntervalInSeconds(15).RepeatForever()) 
         .Build(); 

       //ITrigger trigger = TriggerBuilder.Create() 
       //    .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever()) 
       //    .Build(); 

       scheduler.ScheduleJob(job, trigger); 

и Sample.cs ниже

public void Execute(IJobExecutionContext context) 
     { 


      tweetmonitor(); 
     } 

     public void tweetmonitor() 
     { 
      ////////////////////////////////URLS And Proxy tables data get////////////////////////////////// 
      List<UrlKeyword> employee = new List<UrlKeyword>(); 
      List<Proxy> proxy = new List<Proxy>(); 
      List<ProductsJsonModel> json = new List<ProductsJsonModel>(); 
      ProductsJsonModel json2 = new ProductsJsonModel(); 
      SqlConnection conn = new SqlConnection(strConnString); 
      //SqlConnection conn = new SqlConnection(strConnString); 

      SqlCommand customer = new SqlCommand("select * from customer", conn); 
      SqlCommand cmdproxy = new SqlCommand("select * FROM ProxyTable", conn); 

      customer.CommandType = CommandType.Text; 
      try { 
      conn.Open(); 


      if (conn.State != ConnectionState.Open) 
      { 
       conn.Open(); 
      } 
      SqlDataReader rdr = customer.ExecuteReader(); 

      while (rdr.Read()) 
      { 

       UrlKeyword emp = new UrlKeyword(); 

       emp.url = rdr["ContactName"].ToString(); 
       emp.keywords = rdr["CompanyName"].ToString(); 

       employee.Add(emp); 
      } 
      rdr.Close(); 


      SqlDataReader rdrproxy = cmdproxy.ExecuteReader(); 

      while (rdrproxy.Read()) 
      { 
       Proxy pr = new Proxy(); 

       pr.IP = rdrproxy["IP"].ToString(); 
       pr.Port = Convert.ToInt32(rdrproxy["Port"]); 
       pr.UserName = rdrproxy["UserName"].ToString(); 
       pr.PassWord = rdrproxy["PassWord"].ToString(); 
       proxy.Add(pr); 

      } 
      rdrproxy.Close(); 

      } 
      catch (Exception ex) 
      { 

      } 
      //////////////////////////////////////////////////////////////// 
      ///////////////////Checking from database///////////////////////// 

      ///////////////////Checking from database///////////////////////// 


      foreach (var x in employee) 
      { 

       foreach (var m in proxy) 
       { 


        try 
        { 
         string url = x.url; 
         string keyword = x.keywords; 
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(x.url); 
         WebProxy myproxy = new WebProxy(m.IP, m.Port); 
         if (m.UserName != null && m.PassWord != null && m.UserName != "" && m.PassWord != "") 

         { 
          myproxy.Credentials = new NetworkCredential(m.UserName, m.PassWord); 
         } 
         myproxy.BypassProxyOnLocal = false; 

         request.Proxy = myproxy; 
         request.Method = "GET"; 
         HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

         if (response != null) 
         { 
          Stream receiveStream = response.GetResponseStream(); 
          StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); 
          string mr = readStream.ReadToEnd(); 

          /////////////////JSON Data/////////////////// 
          if (x.url.Contains("json")) 
          { 
           //JSON files to twitter 
           try 
           { 
            ProductsJsonModel Data = JsonConvert.DeserializeObject<ProductsJsonModel>(mr); 
            List<Product> ProductsFromUrl = Data.products; 
            int countofloop; 
            countofloop = ProductsFromUrl.Count; 

            SqlCommand cmd = new SqlCommand(); 
            SqlDataAdapter da = new SqlDataAdapter(); 
            SqlCommandBuilder cb = new SqlCommandBuilder(da); 
            DataSet ds = new DataSet(); 

            if (conn.State != ConnectionState.Open) 
            { 
             conn.Open(); 
            } 

            cmd.CommandText = "select IdJson from dbo.JsonDataPrimary"; 
            cmd.Connection = conn; 

            da.SelectCommand = cmd; 

            da.Fill(ds, "JsonDataPrimary"); 

            for (int s = 0; s < countofloop; s++) 
            { 
             int exist = 0; 
             // SqlCommand cmd = new SqlCommand(); 
             cmd.CommandText = @"SELECT count(*) FROM dbo.JsonDataPrimary WHERE IdJson= '" + ProductsFromUrl[s].id + "'"; 
             cmd.CommandType = System.Data.CommandType.Text; 
             cmd.Connection = conn; 
             exist = (int)cmd.ExecuteScalar(); 

             //////////////////////////duplicate check//////////////////////////////////// 


             ////////////////////////////////////////////////////// 

             // if (exist > 0) 
             if (checkDuplicateTitle(ds.Tables["JsonDataPrimary"].Rows, ProductsFromUrl[s].id.ToString()) && exist > 0) 
             { 
              ///exit from here 
             } 
             else 
             { 

              string logstweetout = published_at + Environment.NewLine + product_title + Environment.NewLine + newurlimage; 

              string logsdata = published_at + Environment.NewLine + product_title + Environment.NewLine + newurlimage + Environment.NewLine + "Variants(According to size)" + Environment.NewLine + variantscheck + Environment.NewLine; 
               cmd.CommandText = @"INSERT INTO dbo.JsonDataPrimary VALUES('" + ProductsFromUrl[s].id + "','" + ProductsFromUrl[s].published_at + "','','' ,'" + test + "')"; 
              cmd.CommandType = System.Data.CommandType.Text; 
             if (conn.State != ConnectionState.Open) 
             { 
              conn.Open(); 
             } 
             cmd.Connection = conn; 



             } 

             cmd.ExecuteNonQuery(); 

            } 

           } 
           catch (Exception ex) 
           { 

           } 
           conn.Close(); 
          } 

ответ

0

Соответственно ваш код, возможно, что 2 работы выполняются в то же время => и поэтому производят dublications. Вы можете добавить [DisallowConcurrentExecution] атрибут к классу работы, чтобы предотвратить это:

аннотацию, который отмечает класс работы, как тот, который не должен иметь несколько экземпляров выполняться параллельно

+0

Thankyou очень много указан .. Вы разгадали мой проблема ... Да благословит вас Бог –

+0

@ArslanAhmad рад помочь, вы можете принять ответ тогда) – Set

+0

Привет, Я хочу задать еще один вопрос. Из-за [DisallowConcurrentExecution] мое приложение выполняет всю работу за 30 секунд, но я устанавливаю таймер через 5 секунд. Можно ли параллельно запускать потоки. Среднее значение, когда триггер запускает класс задания образца, и через 5 секунд он снова запустится в Sample Sample, оба будут выполнять свою работу? –