2015-01-16 7 views
1

при выполнении действия readcsv, для обработки данных потребуется несколько минут, в зависимости от размера файла, поэтому, когда он выполняется, я хочу знать, как показывать сообщение пользователю, чтобы сообщить им что данные в процессе .. ТНХпри запуске действия контроллера, показать сообщение пользователя

def readcsv() { 
    redirect(action: "list") 
    flash.message = "okokokok" 
    def list = [] 
    def dir = new File("C:/Users/User/Desktop/Summarize_20141212/ONE_FILE") 
    dir.eachFileRecurse (FileType.FILES) { file -> 
     list << file 
    } 
    list.each { 
    File file = new File(it.path) 
    def sql = groovy.sql.Sql.newInstance("jdbc:postgresql://localhost:5432/new", 
      'postgres', 'sa', "org.postgresql.Driver") 
    def linecount = 0 
    file.eachLine() { line -> 
     if (line.trim().size() == 0) { 
      return null 
     } else { 
      def field = [] 
      def tokens = line.split(',(?=([^\"]*\"[^\"]*\")*[^\"]*$)') 
      file.name.lastIndexOf('.').with { it != -1 ? file.name[0..<it] : file.name } 
      linecount++ 
      field.push(file.name) 

      for (String t : tokens) { 

       field.push(t) 
      } 
      while (field.size() < 10) { 
       field.push("") 
      } 
      if (linecount > 1) { 
       sql.execute('insert into read_csv(version,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10) ' + 
         'VALUES (0,?,?,?,?,?,?,?,?,?,?)', field) 
       System.out.println(field); 
      } 
     } 
    } 
    } 

} 

ответ

0

здесь является кодирование, что на самом деле показать сообщение визуализации в то время как процесс запущен, если я хочу показать список четкости() страницы после обработки, как это сделать? если я просто добавить redict в конце сообщения визуализации не будет отображаться больше .. ....

def readcsv() { 
     def asyncProcess = new Thread({ 
      def list = [] 
      def dir = new File("C:/Users/User/Desktop/Summarize_20141212/ONE_FILE") 
      dir.eachFileRecurse(FileType.FILES) { file -> 
       list << file 
      } 
      list.each { 
       File file = new File(it.path) 
       def sql = groovy.sql.Sql.newInstance("jdbc:postgresql://localhost:5432/new", 
         'postgres', 'sa', "org.postgresql.Driver") 
       def linecount = 0 
       file.eachLine() { line -> 
        if (line.trim().size() == 0) { 
         return null 
        } else { 
         def field = [] 
         def tokens = line.split(',(?=([^\"]*\"[^\"]*\")*[^\"]*$)') 
         file.name.lastIndexOf('.').with { it != -1 ? file.name[0..<it] : file.name } 
         linecount++ 
         field.push(file.name) 

         for (String t : tokens) { 

          field.push(t) 
         } 
         while (field.size() < 10) { 
          field.push("") 
         } 
         if (linecount > 1) { 
          sql.execute('insert into read_csv(version,col1,col2,col3,col4,col5,col6,col7,col8,col9,col10) ' + 
            'VALUES (0,?,?,?,?,?,?,?,?,?,?)', field) 
          System.out.println(field); 
         } 

        } 

       } 
      } 
     } as Runnable) 
     asyncProcess.start() 
     render "Your file is being processed" 


    } 
+0

есть ли какой-либо оператор, такой как asyncProcess.end() render .....? –

+0

async не связан с действиями вашего приложения, после его запуска он будет делать то, что ему нужно делать в фоновом режиме (не зная, что именно это вызвало его и т. Д. И т. Д.). Как и рендер, есть другая команда с именем forward, которую вы могли бы использовать за пределами вашего asyncProcess.start. Я обновлю свой ответ. – Vahid

+0

kk ждет обновления u.xx снова –

1

Вы должны действительно переместить функциональность вашего читателя CSV в сервис и получить контроллер для его вызова. На Possiblity может быть использованием асинхронного:

class MyController { 
def myService 
def readcsv() { 

def asyncProcess = new Thread({ 
    myService.readCSV(filename, input2,input3) 
    } as Runnable) 

asyncProcess.start() 
forward (action: 'list')  
//render "Your file is being processed" 


//forward (controller:"someController", action: 'someAction', model [param1: params.param1 param2: param2:params.param2 ]) 

} 

Есть Распознать асинхронном здесь: http://grails.org/doc/latest/guide/async.html

Кроме того, ваши вперед, вы можете использовать следующие варианты

Визуализировать: Где рендеринг загружает в фактическом страница, которую вы хотите показать, чем текущее действие ... поэтому в этом случае список

render (view: 'list', model: [params:params]) 

Или, может быть, даже

Сеть: http://grails.org/doc/2.4.x/ref/Controllers/chain.html

chain(action: "details", model: [book: shawshankRedemption]) 

И, наконец, переориентировать

redirect (controller: 'admin', action: 'welcome') 
redirect(url: request.getHeader('referer')) 
redirect(action: "show", id: some.id) 
redirect(action: "list", params: params) 
+0

спасибо за вашу помощь будет попробовать –

+0

привет я попробовал, но тонированное сообщение только показали в конце. .... я ожидал, что это будет показано в начале ..... –

+0

Вы уверены ?, если он идет через async, тогда задача ставится в фоновом режиме. Возможно, ваша задача быстро завершается, и это выглядит так. Попробуйте добавить длительное время сна в службу, выполняющую синтаксический анализ csv, и посмотреть, появится ли сообщение рендеринга. – Vahid

Смежные вопросы