2

compojure、ring-json、lein-ring を使用して開発中にテストし (「lein ring server」コマンドを使用)、アプリを war ファイルにパッケージ化して Tomcat 7.0.42 にデプロイするために、clojure でアプリケーションを開発しています。jQuery を使用して、更新されたデータベース レコードからのデータに応答する URL に ajax ポスト リクエストを実行するページがあります。開発中、「lein ring server」コマンドで実行すると、javascript は完全に機能します。入力を収集し、投稿データを送信すると、サーバーは探しているデータで応答します。

アプリをパッケージ化して Tomcat の「webapps」ディレクトリにデプロイすると、アプリが正しく動作し、ログインしてデータベースからデータを取得し、フォームの投稿要求を正しく処理します (たとえば、ログインはデータを送信します)。サーバーへのログインフォームを介してすべてが機能します)。しかし、javascript ajax リクエストでページに移動すると、次のエラーが発生します。

SEVERE: Servlet.service() for servlet [performancecenter.routes/app servlet] in context with path [/performance] threw exception
java.io.IOException: Stream closed
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:312)
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.read(Unknown Source)
    at clojure.core$slurp.doInvoke(core.clj:6279)
    at clojure.lang.RestFn.invoke(RestFn.java:410)
    at ring.middleware.json$read_json.doInvoke(json.clj:12)
    at clojure.lang.RestFn.invoke(RestFn.java:423)
    at ring.middleware.json$wrap_json_body$fn__3427.invoke(json.clj:19)
    at ring.middleware.json$wrap_json_params$fn__3431.invoke(json.clj:31)
    at ring.middleware.json$wrap_json_response$fn__3438.invoke(json.clj:42)
    at performancecenter.servlet$_service$fn__706.invoke(servlet.clj:1)
    at ring.util.servlet$make_service_method$fn__50.invoke(servlet.clj:126)
    at performancecenter.servlet$_service.invoke(servlet.clj:1)
    at performancecenter.servlet.service(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

ポスト リクエスト URL の compojure routes 関数と、リング json 関数でリクエストをラップする app 関数を次に示します。

(defroutes page-routes
  (POST "/log/performance/api" {session :session params :params} 
        (enter-production-record (:user session) params)))

(def app
  (-> (routes login-routes main-routes)
      (auth/with-user)
      (handler/site :session)
      (middleware/wrap-json-body)
      (middleware/wrap-json-params)
      (middleware/wrap-json-response)))

そして、これはjsonデータを返す関数です(そして開発で動作します):

(defn enter-production-record [user params]
  (let [m (data/insert-producer-metric (:id user))
        r (data/get-productivity m)]
    {:body {:productivity (float (:productivity_factor r))}}))

確かに私はTomcatについてほとんど知りませんが、周りを読んでこのエラーの例を見つけました.それは通常、アプリケーションの機能がストリームを早期に閉じるか何かに関連していました. ここで何が起こっているのか、または私の関数がどのようにそれを行うのか正確にはわかりません。どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

1

DB への呼び出しがレコードの遅延シーケンスを返し、それが開発中の repl または logger に出力され、実稼働システムでは実現されていない場合、開発では何かが機能し、実稼働では失敗するような状況によく遭遇します。への呼び出しで、返された行の周りでget-productivityへの呼び出しが欠落している可能性があります。doall

別のケースは、例外ハンドラーがへの呼び出しをラップしているwith-connectionため、例外が発生したときにデータベース接続が利用できなくなっている場合ですが、これはdoall、私の推測に基づいて欠落している可能性が低いようです.get-productivity

失敗時の戻り値の例を含めget-productivityてログに記録すると、より適切な推測を行うことができます。

于 2013-08-10T01:34:53.323 に答える