簡體   English   中英

帶有后台作業的Grails Mahout插件(quartz2)

[英]Grails Mahout Plugin with Background Job (quartz2)

我是Grails的新手。 我正在使用Mahout Recommender插件來創建Recommender Engine。 我正在關注本教程 這對我來說可以。

現在,我正在嘗試做的是, 我只想使用Background Job來完成此Mahout建議。 這樣用戶可以根據自己的喜好自動推薦。 我正在將Quartz 2.x Scheduler用於后台作業。 如何將Mahout用作后台作業?

在本教程中 ,您可以看到我創建了一個PrefrenceController.groovy,在其中添加了userID,itemID和prefrence編號。

我的Prefrence.groovy域類文件-

package com.rbramley.mahout

import org.apache.commons.lang.builder.HashCodeBuilder

class Preference implements Serializable {
   long userId
   long itemId
   float prefValue

   static constraints = {
       userId()
       itemId()
       prefValue range: 0.0f..5.0f
   }

   boolean equals(other) {
      if(!(other instanceof Preference)) {
         return false
      }

    other.userId == userId && other.itemId == itemId
   }

   int hashCode() {
      def builder = new HashCodeBuilder()
      builder.append userId
      builder.append itemId
      builder.toHashCode()
   }

   static mapping = {
      id composite: ['userId', 'itemId']
      version false
   }
  }

和我的PrefrenceController.groovy

package com.rbramley.mahout

import org.springframework.dao.DataIntegrityViolationException

class PreferenceController {

   static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

   def index() {
       redirect(action: "list", params: params)
   }

   def list(Integer max) {
      params.max = Math.min(max ?: 10, 100)
      [preferenceInstanceList: Preference.list(params), preferenceInstanceTotal: Preference.count()]
   }

   def create() {
       [preferenceInstance: new Preference(params)]
   }

   def save() {
       def preferenceInstance = new Preference(params)
       if (!preferenceInstance.save(flush: true)) {
          render(view: "create", model: [preferenceInstance: preferenceInstance])
          return
       }

    flash.message = message(code: 'default.created.message', args: [message(code: 'preference.label', default: 'Preference'), preferenceInstance.id])
    redirect(action: "show", id: preferenceInstance.id)
    }

    def show(Long id) {
      def preferenceInstance = Preference.get(id)
      if (!preferenceInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'preference.label', default: 'Preference'), id])
        redirect(action: "list")
        return
    }

    [preferenceInstance: preferenceInstance]
  }

  def edit(Long id) {
    def preferenceInstance = Preference.get(id)
    if (!preferenceInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'preference.label', default: 'Preference'), id])
        redirect(action: "list")
        return
    }

    [preferenceInstance: preferenceInstance]
  }

  def update(Long id, Long version) {
    def preferenceInstance = Preference.get(id)
    if (!preferenceInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'preference.label', default: 'Preference'), id])
        redirect(action: "list")
        return
    }

    if (version != null) {
        if (preferenceInstance.version > version) {
            preferenceInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'preference.label', default: 'Preference')] as Object[],
                      "Another user has updated this Preference while you were editing")
            render(view: "edit", model: [preferenceInstance: preferenceInstance])
            return
        }
    }

    preferenceInstance.properties = params

    if (!preferenceInstance.save(flush: true)) {
        render(view: "edit", model: [preferenceInstance: preferenceInstance])
        return
    }

    flash.message = message(code: 'default.updated.message', args: [message(code: 'preference.label', default: 'Preference'), preferenceInstance.id])
    redirect(action: "show", id: preferenceInstance.id)
}

def delete(Long id) {
    def preferenceInstance = Preference.get(id)
    if (!preferenceInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'preference.label', default: 'Preference'), id])
        redirect(action: "list")
        return
    }

    try {
        preferenceInstance.delete(flush: true)
        flash.message = message(code: 'default.deleted.message', args: [message(code: 'preference.label', default: 'Preference'), id])
        redirect(action: "list")
    }
    catch (DataIntegrityViolationException e) {
        flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'preference.label', default: 'Preference'), id])
        redirect(action: "show", id: id)
    }
}
}

假設我已經在數據庫中手動添加了一些數據。 現在,當用戶單擊RecommendController並輸入特定的用戶ID時,它將顯示推薦。 但我想將此作為背景工作。 推薦應該自動地向所有用戶推薦,而無需任何人工干預。

如果我理解您的問題,則需要一項按需工作,您可以從控制器運行它。 為此,創建一個沒有任何觸發器的作業,然后您可以從Controller手動將其觸發並傳遞給您的參數。 這將在后台觸發作業。 在執行中定義作業需要執行的操作,您還可以將所需的任何服務注入該作業。

控制器:

BackgroundJob.triggerNow([id:params.id,userId:userId]) 

工作

class BackgroundJob {
    static triggers = {}

    def execute(context) {
        def id = context.mergedJobDataMap.get('id')
        def userId = context.mergedJobDataMap.get('userId')
        ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM