【问题标题】:How do I run a java program on a server with Spark?如何使用 Spark 在服务器上运行 java 程序?
【发布时间】:2017-12-13 18:22:44
【问题描述】:

我正在尝试自动化呼叫,以便当用户呼叫 Twilio 号码时,代码将生成 XML 并将其作为 HTTP 响应发送给呼叫者。他们网页上的例子是:

@SuppressWarnings("serial")
@WebServlet("/voice")
public class IncomingCallServlet extends HttpServlet {
  // Handle HTTP POST to /voice
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // Create a TwiML builder object
    VoiceResponse twiml = new VoiceResponse.Builder()
        .say(new Say.Builder("Hello world!")
              .voice(Say.Voice.ALICE)
              .build())
        .build();

    // Render TwiML as XML
    response.setContentType("text/xml");

    try {
      response.getWriter().print(twiml.toXml());
    } catch (TwiMLException e) {
      e.printStackTrace();
    }



  }
}

但是由于没有 main 方法,我该如何让它运行呢?我使用 spark 在本地端口上运行它,然后使用 ngrok 为应用程序创建一个 webhook。如果我有一个主要的,它可以工作,但这里的示例没有给出任何内容。

关于如何让这段代码运行并生成 XML 的任何建议。

【问题讨论】:

    标签: java web-applications twilio spark-java


    【解决方案1】:

    有趣的是,我没有在您的代码中看到任何对 Spark 的引用,并且它可以在任何 Java Web 容器上运行,只要您在格式良好的 web.xml 中声明 servlet。如果我正确理解您的问题和代码提取,您似乎愿意依靠嵌入 Spark 的 Jetty 服务器来加载此 servlet。

    如果您想利用 Spark 并避免显式声明 servlet 的麻烦,您可以编写如下内容(假设您运行的是 Java 8):

    import com.twilio.twiml.Say;
    import com.twilio.twiml.VoiceResponse;
    
    import static spark.Spark.*
    
    public class IncomingCall {
    
      public static void main(String[] args) {
    
        // You might want to pass the listen port
        // e.g as CLI argument or system property
        port(4567);
        post("/voice", (request, response) -> {
          // Create a TwiML builder object
          VoiceResponse twiml = new VoiceResponse.Builder()
            .say(new Say.Builder("Hello world!")
              .voice(Say.Voice.ALICE)
              .build())
            .build();
    
          // Render TwiML as XML
          response.type("text/xml");
          try {
              return twiml.toXml();
          } catch (TwiMLException e) {
              // This will result in a HTTP 500
              throw new RuntimeException(e);
          }
        }
      }
    }
    

    【讨论】:

    • 感谢@Mithfindel,这是比手动配置 web.xml 更好的方法。但是,doPost() 方法将 HTTP req/rep 作为参数。如果不手动实例化和覆盖必要的方法,我将如何获得这些?
    • 查看 SparkJava 的请求文档sparkjava.com/documentation#request - 实际上,Spark 为来自 Java EE API 的“本机”HTTPServlet(Request|Response) 对象提供了包装器。
    • 另请注意,Spark.post 方法的第二个参数是一个 lambda,它取代了 Twilio 示例中的 doPost 方法。
    【解决方案2】:

    可以实现SparkApplication接口,在你的web.xml中声明一个过滤器,然后根据documentation在另一个web服务器上运行。

    【讨论】:

      猜你喜欢
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多