当前位置: 首页 > 知识库问答 >
问题:

带回调写入数据库sqlite3的异步clojure http-kit客户端

宋瀚海
2023-03-14
#!/usr/bin/env boot                                                                                                                                             

(defn deps [new-deps]                                                                                                                                           
  (boot.core/merge-env! :dependencies new-deps))                                                                                                                

(deps '[                                                                                                                                                        
        [http-kit  "2.2.0"]                                                                                                         
        [org.clojure/core.async  "0.2.395"]                                                                                                                     
        [org.clojure/java.jdbc  "0.7.0-alpha1"]                                                                                                                 
        [org.xerial/sqlite-jdbc  "3.16.1"]                                                                                                                      
        [org.slf4j/slf4j-nop "1.7.22"]                                                                                                                          
        ])                                                                                                                                                      

(require                                                                                                                                                        
         '[org.httpkit.client :as http]                                                                                                                         
         '[clojure.java.jdbc :as jdbc]                                                                                                                          
         )                                                                                                                                                      


(def db-spec                                                                                                                                                    
  {:classname "org.sqlite.JDBC"                                                                                                                                 
   :subprotocol "sqlite"                                                                                                                                        
   :subname "sqlite.db"})                                                                                                                                       

;(jdbc/db-do-commands                                                                                                                                           
  ;db-spec                                                                                                                                                      
  ;(jdbc/create-table-ddl "test" [[:msg :text]]))                                                                                                               

(def ins! (partial jdbc/insert! db-spec "test"))                                                                                                                

(http/get "http://locahost" {} (fn [_] (ins! {:msg "repl"})))                                                                                                   


(defn -main []                                                                                                                                                  
  (println (System/getProperty  "user.dir"))                                                                                                                    
  (http/get "http://locahost" {} (fn [_] (ins! {:msg "exec"}))))                                                                                                

谢谢

共有1个答案

张鹏云
2023-03-14

脚本不是从命令行工作的问题是http-kit异步回调是由守护进程线程处理的,唯一的非守护进程线程是运行脚本的主线程。

当您的-main函数在向http-kit提交HTTP请求以进行异步处理后结束时,主线程将终止并导致JVM在处理您的异步回调的守护进程线程获得运行机会之前关闭。

您可以通过在-main函数的末尾添加一个sleep表达式来检查是否执行了回调:

(defn -main []                                                                                                                                                  
  (println (System/getProperty  "user.dir"))                                                                                                                    
  (http/get "http://locahost" {} (fn [_] (ins! {:msg "exec"})))
  (Thread/sleep 60000))
(let [result-promise (http/get "https://www.google.com" {} (fn [_] "Result"))]
  @result-promise)

@result-promise(deref result-promise)的阅读器宏/快捷方式。

如果您希望不进行无限期阻塞,则使用完整表单可能更好--只需使用timeout-ms和timeout-value参数调用deref:

(deref result-promise 5000“5秒内未得到响应。放弃”)

 类似资料:
  • 我需要有一个长时间运行的websocket客户端,它接收来自websocket服务器的推送消息,并且我需要监视客户端的连接状态:如果连接中断,我需要发现。 我的方法是定期记录一个常量字符串,如果没有检测到日志消息,就触发警报。 我的想法是:1)有一个websocket客户机来响应不定期传入的消息。2)同时有一个循环,当websocket客户机抛出一个ConnectionClosed exeptio

  • 和响应的侦听器 它不想进入侦听器中的这个句柄消息。和应用程序容器显示消息

  • C Async描述了如何创建一个异步服务器和一个相应的异步客户机来与之通信。我已经在微软ViualStudio中创建了这个。 我现在需要一个java客户端说话的C服务器-我无法找到一个Java等效的客户端(到C)与C通信。 任何指点都将不胜感激

  • 问题内容: 我正在寻找一些通用策略,用于将中央服务器上的数据与并不总是在线的客户端应用程序进行同步。 在我的特定情况下,我有一个带sqlite数据库的android手机应用程序和一个带MySQL数据库的PHP Web应用程序。 用户将能够在电话应用程序和Web应用程序上添加和编辑信息。我需要确保即使手机无法立即与服务器通信,在一个地方所做的更改也会在所有地方反映出来。 我不关心如何将数据从手机传输

  • 我正在创建一个服务器,该服务器使用来自许多来源的命令,例如JMS,SNMP,HTTP等。这些都是异步的,并且工作正常。服务器维护与单个传统硬件项目的单个连接,该项目具有具有自定义TCP协议的请求/应答体系结构。理想情况下,我想要一个像这样的阻塞类型方法的命令 或者这个异步类型的方法 我对Netty和异步编程比较陌生,基本上是边学边学。我目前的想法是,我的类将具有公共同步问题CommandToLeg

  • 问题内容: 我已经搜索了如何在Node.js中创建带有回调的sqlite3数据库,但找不到任何链接。有人可以指点我看文档还是提供2-3行代码示例以实现以下目的: 创建一个sqlite3数据库,如果由于某种原因创建失败,则会捕获错误。 这是我尝试过的: 执行此操作时,出现以下错误:“无法创建数据库文件:./database/user1.db。错误:错误:SQLITE_MISUSE:错误的参数或其他A