سؤال

أنا أعمل مع الرسائل أدوات (كان يحدث أن تكون انتشار ولكن أنا لا أعرف أن تفاصيل هذه المسألة).تلقي الرسائل من هذا الدليل يتطلب بعض النمطي:

  1. إنشاء اتصال إلى الشيطان.
  2. الانضمام إلى المجموعة.
  3. تتلقى واحد أو أكثر من رسائل.
  4. ترك المجموعة.
  5. قطع الاتصال من الشيطان.

التالية بعض التعابير التي رأيتها تستخدم في مكان آخر, كنت قادرا على طبخ بعض العمل وظائف باستخدام انتشار جافا API Clojure هو إمكانية التشغيل المتداخل أشكال:

(defn connect-to-daemon
  "Open a connection"
  [daemon-spec]
  (let [connection (SpreadConnection.)
        {:keys [host port user]} daemon-spec]
    (doto connection
      (.connect (InetAddress/getByName host) port user false false))))

(defn join-group
  "Join a group on a connection"
  [cxn group-name]
  (doto (SpreadGroup.)
    (.join cxn group-name)))

(defn with-daemon*
  "Execute a function with a connection to the specified daemon"
  [daemon-spec func]
  (let [daemon (merge *spread-daemon* daemon-spec)
        cxn (connect-to-daemon daemon-spec)]
    (try
     (binding [*spread-daemon* (assoc daemon :connection cxn)]
       (func))
     (finally
      (.disconnect cxn)))))

(defn with-group*
  "Execute a function while joined to a group"
  [group-name func]
  (let [cxn (:connection *spread-daemon*)
        grp (join-group cxn group-name)]
    (try
     (binding [*spread-group* grp]
       (func))
     (finally
      (.leave grp)))))

(defn receive-message
  "Receive a single message. If none are available, this will block indefinitely."
  []
  (let [cxn (:connection *spread-daemon*)]
    (.receive cxn)))

(أساسا نفس المصطلح كما with-open, فقط أن SpreadConnection فئة يستخدم disconnect بدلا من close.Grr.كما تركت بعض وحدات الماكرو التي لا صلة الهيكلية السؤال هنا.)

هذا يعمل بشكل جيد بما فيه الكفاية.يمكن أن أدعو تتلقى رسالة من داخل بنية مثل:

(with-daemon {:host "localhost" :port 4803}
  (with-group "aGroup"
    (... looping ...
      (let [msg (receive-message)] 
        ...))))

يحدث لي ذلك receive-message سيكون نظافة لاستخدام إذا كان لا حصر له كسول تسلسل التي تنتج الرسائل.لذا ، إذا كنت أرغب في الانضمام إلى مجموعة والحصول على رسائل رمز الدعوة ينبغي أن ننظر بشيء من مثل:

(def message-seq (messages-from {:host "localhost" :port 4803} "aGroup"))
(take 5 message-seq)

لقد رأيت الكثير من الأمثلة كسول متواليات دون تنظيف ، هذا ليس من الصعب جدا.الصيد خطوات #4 و 5 من فوق:وترك مجموعة وفصل من الشيطان.كيف يمكنني ربط حالة اتصال المجموعة في تسلسل و تشغيل اللازمة رمز تنظيف عندما تسلسل لم تعد هناك حاجة ؟

هل كانت مفيدة؟

المحلول

هذا المقالة كيفية القيام بذلك بالضبط باستخدام clojure-contrib ملء الانتظار.بخصوص تنظيف - الشيء أنيق حول ملء الانتظار هو أنه يمكنك العرض على عرقلة وظيفة هذا ينظف نفسه إذا كان هناك خطأ أو بعض الشروط التي تم التوصل إليها.يمكنك أيضا الاستمرار في إشارة إلى الموارد والسيطرة عليها خارجيا.سوف تتابع إنهاء فقط.وذلك اعتمادا على الخاص بك الدلالي شرط عليك أن تختار الاستراتيجية التي تناسبها.

نصائح أخرى

جرب هذا:

(ns your-namespace
  (:use clojure.contrib.seq-utils))

(defn messages-from [daemon-spec group-name]
  (let [cnx (connect-to-deamon daemon-spec))
        group (connect-to-group cnx group-name)]
    (fill-queue (fn [fill]
                  (if done? 
                      (do
                        (.leave group)
                        (.disconnect cnx)
                        (throw (RuntimeException. "Finished messages"))
                      (fill (.receive cnx))))))

مجموعة القيام به ؟ صحيح عندما تريد إنهاء القائمة.أيضا, أي استثناءات في (.تتلقى cnx) أيضا إنهاء القائمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top