天道酬勤,学无止境

如何通过 REST API 提交作业?(How to submit a job via REST API?)

问题

我正在使用 Datastax Enterprise 4.8.3。 我正在尝试实现基于 Quartz 的应用程序来远程提交 Spark 作业。 在我的研究过程中,我偶然发现了以下链接:

  1. Apache Spark 隐藏的 REST API
  2. Spark 特性 - 在独立集群模式下提供稳定的应用提交网关

为了测试这个理论,我尝试在我的 2 节点集群的主节点(IP:“spark-master-ip”;直接在 shell 上)上执行以下代码片段(如上面链接 #1 中提供的):

curl -X POST http://spark-master-ip:6066/v1/submissions/create --header "Content-Type:application/json;charset=UTF-8" --data '{
    "action" : "CreateSubmissionRequest",
    "appArgs" : [ "myAppArgument1" ],
    "appResource" : "file:/home/local/sparkjob.jar",
    "clientSparkVersion" : "1.4.2",
    "environmentVariables" : {
    "SPARK_ENV_LOADED" : "1"
  },
  "mainClass" : "com.spark.job.Launcher",
  "sparkProperties" : {
      "spark.jars" : "file:/home/local/sparkjob.jar",
      "spark.driver.supervise" : "false",
      "spark.app.name" : "MyJob",
      "spark.eventLog.enabled": "true",
      "spark.submit.deployMode" : "cluster",
      "spark.master" : "spark://spark-master-ip:6066"
  }
}'

但是执行代码我得到一个带有以下文本的 html 响应:

This Page Cannot Be Displayed
The system cannot communicate with the external server (spark-master-ip).
The Internet server may be busy, may be permanently down, or may be unreachable because of network problems.
Please check the spelling of the Internet address entered.
If it is correct, try this request later.

If you have questions, please contact your organization's network administrator and provide the codes shown below.

Date: Fri, 11 Dec 2015 13:19:15 GMT
Username: 
Source IP: spark-master-ip
URL: POST http://spark-master-ip/v1/submissions/create
Category: Uncategorized URLs
Reason: UNKNOWN
Notification: GATEWAY_TIMEOUT
回答1
  • 检查您是否已启动 Spark master 和 worker(使用start-all.sh

  • 检查日志文件中是否有类似的消息

信息 rest.StandaloneRestServer:启动 REST 服务器,用于在端口 6066 上提交应用程序

  • 检查启动的进程是否真的在监听 6066 端口(使用netstat

它应该是这样的:

root@x:~# netstat -apn | grep 11572 | grep LISTEN
tcp6       0      0 :::8080                 :::*                    LISTEN      11572/java      
tcp6       0      0 10.0.0.9:6066           :::*                    LISTEN      11572/java      
tcp6       0      0 10.0.0.9:7077           :::*                    LISTEN      11572/java      

然后将脚本中的“spark-master-ip”替换为您在netstat输出中看到的 IP 地址(示例显示“10.0.0.9”)。

回答2

使用 Spark 2.4.3,我们发现默认情况下禁用 REST API。 禁用 REST API 后,对端口 6066 的调用将失败并显示您显示的错误。

我们发现必须通过将以下条目添加到spark-defaults.conf文件来启用 REST API。

spark.master.rest.enabled true

添加此条目后,我们重新启动了机器上的 Spark 实例,REST API 就出现了。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 通过Web应用程序启动Spark应用程序的最佳实践?(Best Practice to launch Spark Applications via Web Application?)
    问题 我想通过Web应用程序向用户公开我的Spark应用程序。 基本上,用户可以决定要运行的动作并输入一些变量,需要将这些变量传递给spark应用程序。 例如:用户输入一些字段,然后单击执行以下“使用参数min_x,max_x,min_y,max_y运行sparkApp1 ”的按钮。 应该使用用户指定的参数启动spark应用程序。 完成后,可能需要Web应用程序检索结果(从hdfs或mongodb)并将其显示给用户。 在处理过程中,Web应用程序应显示Spark应用程序的状态。 我的问题: Web应用程序如何启动Spark Application? 它可能能够从幕后的命令行启动它,但是可能会有更好的方法来执行此操作。 Web应用程序如何访问Spark应用程序的当前状态? 从Spark WebUI的REST API获取状态是否可行? 我正在运行带有YARN / Mesos(尚不确定)和MongoDB的Spark 1.6.1集群。 回答1 很基本的答案: 基本上,您可以使用SparkLauncher类来启动Spark应用程序,并添加一些侦听器以监视进度。 但是,您可能对Livy服务器感兴趣,该服务器是用于Spark作业的RESTful服务器。 据我所知,齐柏林飞艇正在使用Livy提交工作并获取状态。 您还可以使用Spark REST界面检查状态,信息将更加精确。
  • 如何通过 Hadoop 2.5.1 Rest api 运行 mapreduce 作业?(How can I run mapreduce job by Hadoop 2.5.1 Rest api?)
    问题 Hadoop 2.5.1 添加了一个新的 Rest api 来提交应用程序:http://hadoop.apache.org/docs/r2.5.1/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html#Cluster_Applications_APISubmit_Application "Cluster Applications API(Submit Application) Submit Applications API 可用于提交申请。如果提交申请,您必须首先使用 Cluster New Application API 获取 application-id。" 在 Hadoop 2.4 从命令行运行 mapreduce 示例之前,我们必须执行 hadoop 命令行 shell: bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.1.jar grep input output 'dfs[az.] +' 现在在 Hadoop 2.5.1 中可以使用上述 Rest api 运行相同的 mapreduce 示例,但我无法(我不明白)应该如何编写 http 请求正文。 我阅读了上面的文档,该示例是关于 YARN 应用程序的,但我无法为
  • 通过 rest api 运行 MapReduce 作业(Run a MapReduce job via rest api)
    问题 我使用 hadoop2.7.1 的 rest apis 在集群外运行 mapreduce 作业。 这个例子“http://hadoop-forum.org/forum/general-hadoop-discussion/miscellaneous/2136-how-can-i-run-mapreduce-job-by-rest-api”真的帮助了我。 但是当我提交帖子回复时,发生了一些奇怪的事情: 我看“http://master:8088/cluster/apps”,一个帖子响应产生两个工作,如下图:奇怪的事情:一个响应产生两个工作等待很长时间后,我在 http 响应正文中定义的作业由于 FileAlreadyExistsException 而失败。 原因是另一个作业创建了输出目录,所以输出目录 hdfs://master:9000/output/output16 已经存在。 这是我的回复正文: { "application-id": "application_1445825741228_0011", "application-name": "wordcount-demo", "am-container-spec": { "commands": { "command": "{{HADOOP_HOME}}/bin/hadoop jar /home/hadoop/hadoop
  • 如何通过REST API停止Jenkins中的构建?(How to stop a build in Jenkins via the REST api ?)
    问题 我在詹金斯(Jenkins)工作。 我们自己的网站通过REST API触发了此作业的构建。 有时我们想中止构建。 有时,甚至可能在构建开始之前。 在这种情况下,我们将使用queueItem#而不是build#。 如何通过REST API做到这一点? 回答1 如果构建已经开始,请通过POST进行以下操作: http://<Jenkins_URL>/job/<Job_Name>/<Build_Number>/stop 将停止/取消当前构建。 如果构建尚未开始,则您有queueItem ,然后在POST上进行: http://<Jenkins_URL>/queue/cancelItem?id=<queueItem> 这是假设您的Jenkins服务器尚未受到保护,否则,您需要为具有“取消”特权的用户添加BASIC身份验证。 回答2 其实这个问题已经回答了。 因此,我将添加如何找到id=<queueItem> ,这是我在寻找该解决方案时遇到的id=<queueItem> ,这将对其他人有所帮助。 因此,您可以通过<queueItem> http:// jenkins:8081 / queue / api / json获取<queueItem> 样本输出将是这种类型的json类型- [{"_class":"hudson.model.Cause$RemoteCause"
  • 如何将 Apache Spark 作业提交到 Azure HDInsight 上的 Hadoop YARN(How to submit Apache Spark job to Hadoop YARN on Azure HDInsight)
    问题 我很高兴 HDInsight 切换到 Hadoop 版本 2,它通过 YARN 支持 Apache Spark。 对于我想要执行的任务,Apache Spark 是比 MapReduce 更适合的并行编程范式。 但是,我找不到任何有关如何将 Apache Spark 作业远程作业提交到我的 HDInsight 群集的文档。 对于标准 MapReduce 作业的远程作业提交,我知道有几个 REST 端点,例如 Templeton 和 Oozie。 但据我所知,无法通过 Templeton 运行 Spark 作业。 我确实发现可以将 Spark 作业合并到 Oozie 中,但我读到这是一件非常乏味的事情,而且我还阅读了一些关于在这种情况下无法检测作业失败的报告。 可能必须有更合适的方式来提交 Spark 作业。 有谁知道如何将 Apache Spark 作业的远程作业提交到 HDInsight? 提前谢谢了! 回答1 您可以在 hdinsight 集群上安装 spark。 您必须通过创建自定义集群并添加一个操作脚本来完成此操作,该脚本将在为集群创建 VM 时在集群上安装 Spark。 在集群安装中使用动作脚本进行安装非常简单,您可以在 C# 或 powershell 中通过向标准自定义创建集群脚本/程序添加几行代码来完成。 电源外壳: # ADD SCRIPT ACTION TO
  • 您如何使用 Google DataProc Java Client 使用关联 GS 存储桶中的 jar 文件和类提交 Spark 作业?(How do you use the Google DataProc Java Client to submit spark jobs using jar files and classes in associated GS bucket?)
    问题 我需要触发 Spark 作业以使用 API 调用从 JSON 文件聚合数据。 我使用 spring-boot 创建资源。 因此,解决方案的步骤如下: 用户使用 json 文件作为输入发出 POST 请求 JSON 文件存储在与 dataproc 集群关联的 google 存储桶中。 使用指定的 jars、类和参数是 json 文件链接从 REST 方法中触发聚合火花作业。 我希望使用 Dataproc 的 Java 客户端而不是控制台或命令行来触发作业。 你怎么做呢? 回答1 我们希望很快能有关于官方文档的更全面的指南,但要开始使用,请访问以下 API 概述:https://developers.google.com/api-client-library/java/apis/dataproc/v1 它包括指向 Dataproc javadoc 的链接; 如果您的服务器代表您自己的项目而不是代表您最终用户的 Google 项目进行调用,那么您可能需要此处解释的基于密钥文件的服务帐户身份验证来创建用于初始化Dataproc的Credential对象客户端存根。 至于特定于 dataproc 的部分,这仅意味着如果使用 Maven,则将以下依赖项添加到 Maven pomfile: <project> <dependencies> <dependency> <groupId>com
  • 使用REST触发Spark作业(Triggering spark jobs with REST)
    问题 我最近尝试了Apache Spark。 我的问题是更具体地触发火花作业。 我在这里发表了关于了解火花工作的问题。 在工作变得肮脏之后,我继续着我的要求。 我有一个REST端点,其中公开了API来触发Jobs,我已经将Spring4.0用于Rest实施。 现在,我想到了在Spring中实现Jobs as Service的工作,我将以编程方式提交Job,这意味着当端点被触发时,如果具有给定的参数,我将触发该Job。 我现在有几个设计选项。 与下面的书面工作类似,我需要维护一个由抽象类调用的几个Jobs可能是JobScheduler 。 /*Can this Code be abstracted from the application and written as as a seperate job. Because my understanding is that the Application code itself has to have the addJars embedded which internally sparkContext takes care.*/ SparkConf sparkConf = new SparkConf().setAppName("MyApp").setJars( new String[] { "/path/to/jar/submit
  • 已提交Spark作业-等待中(TaskSchedulerImpl:不接受初始作业)(Spark Job submitted - Waiting (TaskSchedulerImpl : Initial job not accepted))
    问题 已进行API调用以提交作业。 响应状态-正在运行 在群集用户界面上- 工人(从属)-worker-20160712083825-172.31.17.189-59433仍然存在核心2之1已使用内存1Gb(已使用6个) 正在运行的应用程序 app-20160713130056-0020-等待5小时核心数-无限 应用程序的职位描述 活跃舞台 在/root/wordcount.py:23上的reduceByKey 等待阶段 takeOrdered在/root/wordcount.py:26 正在运行的驱动程序- stderr log page for driver-20160713130051-0025 WARN scheduler.TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources 据初步工作未接受任何资源; 检查您的集群UI,以确保已注册工作进程并具有足够的资源尚未启动从站-因此,它没有资源。 但是以我为例-从站1正在工作 根据“无法执行更多工作”,“初始作业未接受任何资源”,我使用的是deploy-mode = cluster
  • 有没有办法通过 REST API “延迟”作业(Is there a way to “delay” a job via the REST API)
    问题 即时消息插件能够接收 IM 消息,例如“在 10 秒内构建 XYZ”并将作业设置为在 10 秒内运行。 它通过 java API 来安排作业 [0]。 我想知道是否有一些神奇的参数可以在 REST API[1] 上传递,这将允许我以相同的方式“延迟”工作? 谢谢。 [0] - https://github.com/jenkinsci/instant-messaging-plugin/blob/master/src/main/java/hudson/plugins/im/bot/BuildCommand.java#L54 [1] - https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API 回答1 获取以下网址: http://jenkins/job/jobname/build?delay=4000sec 此示例将导致作业在 4000 秒后启动。 这也适用于参数化作业的buildWithParameters URL。
  • 如何通过 groovy 脚本获取正在运行的 jenkins 构建的列表?(How to get a list of running jenkins builds via groovy script?)
    问题 有没有办法通过 System Groovy 脚本在 Jenkins 中获取 RUNNING 构建的列表? 我尝试遍历繁忙的执行程序,但是从执行程序对象中,我无法获取构建对象: def busyExecutors = Jenkins.instance.computers .collect { c -> c.executors.findAll { it.isBusy() } } .flatten() // reminder: transforms list(list(executor)) into list(executor) busyExecutors.each { e -> println('=====print out methods of executor object======='); println e.metaClass.methods*.name.sort().unique(); } 我也可以像这样定位我感兴趣的工作: def item = hudson.model.Hudson.instance.getItem("my_job"); println item.metaClass.methods*.name.sort().unique(); 但随后我将不得不循环 100 次(如果不是更多)构建并询问每个构建是否正在运行。 必须有一种更简单
  • 基于 Web 请求在气流上运行作业(Running Job On Airflow Based On Webrequest)
    问题 我想知道是否可以在通过 HTTP 获取请求时执行气流任务。 我对 Airflow 的调度部分不感兴趣。 我只是想用它来代替芹菜。 因此,示例操作将是这样的。 用户提交一个表格,要求提供一些报告。 后端接收请求并向用户发送已收到请求的通知。 然后后端使用 Airflow 安排作业立即运行。 Airflow 然后执行一系列与 DAG 相关的任务。 比如先从redshift拉取数据,再从MySQL拉取数据,对两个结果集做一些操作,合并后将结果上传到Amazon S3,发邮件。 从我在线阅读的任何内容来看,您都可以通过在命令行上执行airflow ...来运行airflow 作业。 我想知道是否有可以执行相同操作的 python api。 谢谢。 回答1 Airflow REST API 插件会在这里帮助你。 按照说明安装插件后,您只需要点击以下网址: http://{HOST}:{PORT}/admin/rest_api/api/v1.0/trigger_dag?dag_id={dag_id}&run_id={run_id}&conf={url_encoded_json_parameters} ,将 dag_id 替换为您的 dag 的 id,或者省略 run_id 或指定一个唯一的 id,并为 conf 传递一个 url 编码的 json(带有您在触发的 dag 中需要的任何参数
  • 如何从命令行查看Spark应用程序的状态?(How to check status of Spark applications from the command line?)
    问题 要检查Apache Spark中正在运行的应用程序,可以从URL上的Web界面检查它们: http://<master>:8080 我的问题是我们如何从终端检查正在运行的应用程序,是否有任何命令可以返回应用程序状态? 回答1 如果是用于Spark Standalone或Apache Mesos集群管理器,则@ sb0709的答案是遵循的方法。 对于YARN,您应该使用yarn application命令: $ yarn application -help usage: application -appStates <States> Works with -list to filter applications based on input comma-separated list of application states. The valid application state can be one of the following: ALL,NEW,NEW_SAVING,SUBMITTED,ACCEPTED,RUN NING,FINISHED,FAILED,KILLED -appTypes <Types> Works with -list to filter applications based on input comma-separated list of
  • 如何在通过 curl 触发构建时设置 Jenkins 构建描述?(How can I set Jenkins build description while triggering build via curl?)
    问题 我正在尝试设置我正在触发的构建的构建描述,因为我正在启动构建,到目前为止我没有运气。 我遇到了一个解决方案(将文本添加到由 Jenkins 远程 API 触发的构建页面),我有点让它以这种方式工作(第一个命令将启动构建,第二个命令将设置最后一个的描述建造): curl -v -X POST "http://[myServer]/job/[jobName]/build" curl -v -X POST "http://[myServer]/job/[jobName/lastBuild/submitDescription" --data-urlencode "description=test description" 然而,问题是,如果我刚刚启动的构建被排队/没有立即启动,“lastBuild”将不会引用我刚刚启动的构建,而是它之前的构建(仍在构建)。 所以我尝试了这样的事情: payload='json={""description"":""test description""}' curl -v -X POST -H "Content-Type: application/json" -d $payload "http://[myServer]/job/[jobName]/build" 但它实际上并没有设置描述。 任何想法如何实现? 我找到了其他解决方案
  • 在 YARN 上运行 Spark 应用程序,无需 spark-submit(Running a Spark application on YARN, without spark-submit)
    问题 我知道可以使用spark-submit --master yarn在 YARN 上执行 Spark 应用程序。 问题是:是否可以使用yarn命令在 yarn 上运行 Spark 应用程序? 如果是这样,YARN REST API 可以用作以统一方式运行 Spark 和 MapReduce 应用程序的接口。 回答1 我看到这个问题已经有一年了,但对于偶然发现这个问题的任何其他人来说,现在看起来这应该是可能的。 我一直在尝试做类似的事情,并一直在尝试通过 Hortonworks 的 YARN REST API 教程直接关注启动 Spark 作业。 基本上你需要做的是将你的 jar 上传到 HDFS,根据 YARN REST API 文档创建一个 Spark 作业 JSON 文件,然后使用 curl 命令启动应用程序。 该命令的一个示例是: curl -s -i -X POST -H "Content-Type: application/json" ${HADOOP_RM}/ws/v1/cluster/apps \ --data-binary spark-yarn.json 回答2 就像所有 YARN 应用程序一样,Spark 在 YARN 上部署时实现了一个 Client 和一个 ApplicationMaster。 如果您查看 Spark 存储库中的实现,您将了解如何创建自己的
  • python长时间运行的守护进程作业处理器(python long running daemon job processor)
    问题 我想编写一个长期运行的进程(linux 守护进程),它有两个目的: 响应 REST Web 请求执行可调度的作业 我最初将它作为一个简单的程序运行,该程序将运行并执行我随后进行的更新,但现在我增加了 REST 要求,并且还想更改某些作业的频率,但不更改其他作业的频率假设所有工作都有不同的频率)。 我有 0 次编写长时间运行的进程的经验,尤其是那些自己做事而不是响应请求的进程。 我的基本计划是在单独的线程/进程中运行 REST 部分,并认为我会单独运行作业部分。 我想知道是否存在任何模式,特别是 python,(我已经看过但没有真正找到任何我想做的例子)或者是否有人对从哪里开始转换我的项目以满足这些有任何建议新要求。 我看过一些涉及日程安排的项目,但我真的在这里寻找真实世界的用户体验/建议。 什么对你有效/无效? 回答1 如果 REST 服务器和计划作业没有任何共同之处,请执行两个单独的实现,REST 服务器和作业内容,并将它们作为单独的进程运行。 如前所述,查看作业的现有调度程序。 我不知道 Twisted 是否是替代方案,但您可能想检查一下这个平台。 OTOH,如果 REST 接口调用与计划作业相同的功能,您应该尝试将它们视为相同功能的两个接口,例如: 将实际作业编写为 REST 服务器可以分叉和运行的程序。 有一个单独的调度程序来处理作业的时间安排。 如果作业要运行
  • 如何停止 Spark 流作业?(How do I stop a spark streaming job?)
    问题 我有一个一直在运行的 Spark Streaming 作业。 我如何优雅地停止工作? 我已经阅读了在作业监控中附加关闭挂钩并向作业发送 SIGTERM 的通常建议。 sys.ShutdownHookThread { logger.info("Gracefully stopping Application...") ssc.stop(stopSparkContext = true, stopGracefully = true) logger.info("Application stopped gracefully") } 它似乎有效,但看起来不是停止工作的最干净方法。 我在这里错过了什么吗? 从代码的角度来看,这可能是有道理的,但是如何在集群环境中使用它呢? 如果我们启动一个 Spark 流作业(我们将作业分布在集群中的所有节点上),我们将必须跟踪作业的 PID 和运行它的节点。 最后,当我们必须停止进程时,我们需要跟踪作业在哪个节点上运行以及它的 PID。 我只是希望有一种更简单的流作业控制方法。 回答1 您可以通过运行以下命令在集群模式下停止流上下文,而无需发送 SIGTERM。 这将停止流上下文,而无需使用线程钩子显式停止它。 $SPARK_HOME_DIR/bin/spark-submit --master $MASTER_REST_URL --kill $DRIVER
  • 创建作业并使用 REST 在 jenkins 中执行它们(Create jobs and execute them in jenkins using REST)
    问题 我正在尝试创建一个 WCF REST 客户端,它将与 Jenkins 通信并从 XML 文件创建一个作业,然后构建该作业。 我的理解是你可以用 Jenkins 做到这一点。 有人可以提供一些命令,您可以在浏览器的地址栏中键入这些命令来创建和构建作业吗? 即: http:localhost/jenkins/createItem?name=TESTJOB类似的东西。 回答1 请参阅 Jenkins API Wiki 页面(包括最后的评论)。 您可以使用 Jenkins 本身提供的文档来填补空白; 例如, http://JENKINS_HOST/api将为您提供创建作业的 URL,而http://JENKINS_HOST/job/JOBNAME/api将为您提供触发构建的 URL。 我强烈建议避免自定义创建作业配置 XML 文件,而是查看类似作业 DSL 插件的内容。 这为您提供了一个很好的基于 Groovy 的 DSL 来以编程方式创建作业 - 更加简洁且不易出错。 回答2 通常,在解析文档时,可能需要一两天时间。 能够访问代码或 curl 命令以在一小时内启动并运行是很有帮助的。 这是我使用许多第三方软件的目标。 请参阅 http://scottizu.wordpress.com/2014/04/30/getting-started-with-the-jenkins-api/
  • 如何让 Symfony 表单与 REST API 一起使用?(How do I get Symfony forms to work with a REST API?)
    问题 我目前正在尝试让 symfony 表单与我的帖子一起工作并放置 rest api 端点。 目前我有: $request = $this->getRequest(); $cc = new CreditCard(); $form = $this->createForm(new CreditCardType(), $cc); $form->handleRequest($request); if ($form->isValid()) { //... } 但是,该表格永远无效。 查看问题,似乎表单的 isSubmitted 字段为 false,因此它从未通过验证。 此外,由于这是一个 api 调用,我将 creditcardtype 中的 csrf_protection 设置为 false。 以下是我让用户提交的数据示例: { "credit_card": { "name" : "Example Name" ... } } 我如何让这个 post/put 请求被注册为提交并让表单验证器通过? 谢谢。 回答1 如果您可以提供 CreditCardType 类的完整代码以及完整的 POST 数据和表单中的验证错误,那将会很有帮助。 无论如何,这是我发现表单提交失败的原因: 提交不完整的数据:如果您的 CerditCardType 表单中有一个字段在您的 POST 请求中不存在
  • 如何让控制器在应用程序的其余部分继续运行时等待延迟作业?(How to Make the Controller wait for a Delayed Job while the rest of the App continues on?)
    问题 (这个问题是对如何处理 Rails 应用程序的长请求的后续问题,以便其他用户不会延迟太多?) 用户向我的 Rails 应用程序提交了一个答案,它会在后端被检查长达 10 秒。 这会导致所有其他用户的延迟,所以我正在尝试 delay_job gem 将检查移动到 Worker 进程。 Worker 代码将结果返回给控制器。 但是,控制器没有意识到它应该耐心等待结果,因此会导致错误。 如何让控制器等待结果,同时让应用程序的其余部分处理简单的请求? 在 Javascript 中,人们会使用回调来调用函数而不是返回值。 我应该在 Ruby 中做同样的事情并从 Worker 回调控制器吗? 更新: 或者,如何从 Worker 调用控制器方法? 然后我可以在完成后调用相关操作。 这是相关代码: 控制器: def submit question = Question.find params[:question] user_answer = params[:user_answer] @result, @other_stuff = SubmitWorker.new.check(question, user_answer) render_ajax end submit_worker.rb : class SubmitWorker def check #lots of code... end
  • Drupal:如何使用 AJAX POST 从 REST 服务提交 webfrom(Drupal: How to submit the webfrom from REST services using AJAX POST)
    问题 我在 drupal 中有 Web 表单模块。 我想使用 AJAX POST 方法从带有 REST 服务的外部应用程序将表单提交到 webform 中。 我可以使用 ajax 检索 Web 表单(节点/1)。 提交时,它不应创建为新节点,而是会添加到 Web 表单中。 在此先感谢您的帮助..... 回答1 为了能够使用外部应用程序从 Webform 模块检索数据并将数据发送到 Webform 模块,我建议您使用 Drupal 的 Webform Service 模块,它使 REST API 可用于您的调查。 安装并配置模块及其依赖项(如果有)后,您将能够检索调查的序列化数据。 您还可以使用适当的 HTTP 方法(GET、POST 等)通过适当的请求向端点发送提交。 参见Webform Service模块页面的端点描述。 您需要知道要提交的数据的格式。 在此您将找到 JSON 对象的正确格式。 values键的values是一个数组,它有一个或多个值,所以大多数时候它看起来像这样: {'values':{0:"put your value here"}} 如果有多个值(复选框、多选),可以使用如下values : {'values':{ 0:"put your value1 here", 1: "put your value2 here", }} 最后,这里是一段 HTML 和