جافا - محددات متعددة في مواضيع متعددة للمآخذ غير الحلق

StackOverflow https://stackoverflow.com/questions/1111527

سؤال

أنا أكتب تطبيق Java الذي سيؤدي إلى إنشاء كائنات من الفصل لتمثيل عملاء متصلين وتسجيلهم بنظام خارجي على الجانب الآخر من طلبي.

يحتوي كل كائن عميل على فئتين متداخيتين داخله، ويمثل الواجهة الأمامية والخلفية. ستلتقي فئة الواجهة الأمامية بمستمر بيانات من العميل الفعلي، وإرسال مؤشرات وبيانات إلى فئة النهاية الخلفية، والتي ستأخذ هذه البيانات من النهاية الأمامية وإرسالها إلى النظام الخارجي في استخدام التنسيق والبروتوكول المناسب يتطلب هذا النظام.

في التصميم، نتطلع إلى أن يكون لديك كل مثيل لكائن العميل مؤشر ترابط. ثم، ضمن كل مؤشر ترابط سيكون من الطبيعي أن يكون مآخذان [تحرير] مع قنوات NIO الخاصة به لكل [/ edit]، جانب عميل واحد، جانب نظام واحد يقيم في النهاية الأمامية والخلفية على التوالي. ومع ذلك، فإن هذا يقدم الآن الحاجة إلى مآخذ غير الحلق. لقد كنت أقرأ البرنامج التعليمي هنا يشرح كيفية استخدام محدد بأمان في مؤشر الترابط الرئيسي لمعالجة جميع المواضيع مع الاتصالات.

ولكن، ما أحتاج إليه هو محددات متعددة - كل تعمل في خيطها الخاص. من قراءة البرنامج التعليمي المذكور أعلاه، تعلمت أن مجموعات المفاتيح في محدد ليست خلافا. هل هذا يعني أن المحددين منفصلين مثيلين في مؤشرات الترابط الخاصة بهم قد يخلقوا مفاتيح متعارضة إذا حاولت إعطائهم كل زوج من المقابس والقنوات الخاصة بهم؟ إن نقل المحدد يصل إلى الخيط الرئيسي هو احتمال بسيط، ولكن بعيدا عن المثالي بناء على متطلبات البرامج التي أعطيتها. شكرا لك على مساعدتك.

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

المحلول

سيكون استخدام محددات متعددة على ما يرام طالما أنك لا تقوم بتسجيل نفس القناة بنفس المصالح (OP_READ / OP_WRITE إلخ) مع كل من مثيلات المحدد. يمكن أن يسبب تسجيل القناة نفسها مع مثيلات محددات متعددة قد تتسبب في وجود مشكلة حيث يمكن أن تستهلك Selector1.Section () حدثا Selector2.Section () قد يكون مهتما به.

المحدد الافتراضي على معظم المنصات هي الاستطلاع () [أو encoll ()] بناء على ذلك.

محدد - حدد مكالمات داخليا int poll( ListPointer, Nfdsmsgs, Timeout) method.

        where the ListPointer structure can then be initialized as follows:

    list.fds[0].fd = file_descriptorA;
    list.fds[0].events = requested_events;
    list.msgs[0].msgid = message_id;
    list.msgs[0].events = requested_events;

ومع ذلك، أود أن أوصى استخدام مؤشر ترابط اختيار واحد كما هو مذكور في البرنامج التعليمي NIO RPC RPC. تطبيقات NIO تعتمد على منصة، ومن الممكن تماما أن ما يعمل على منصة واحدة قد لا يعمل على آخر. لقد رأيت مشاكل عبر الإصدارات الطفيفة أيضا. على سبيل المثال، استخدم AIX JDK 1.6 SR2 محدد استطلاع للرأي () - PollselectorMPL ومزود المحدد المقابل باسم PillselectorProvider، واجه خادمنا غرامة. عندما انتقلت إلى AIX JDK 1.6 SR5، والتي استخدمت محدد محسن على واجهة المحولات (pollsetsellectorimpl)، واجهنا تعليقا متكررا في خادمنا في تحديد () و Socketchannel.close (). أحد الأسباب التي أراها هي أننا نفتح محددات متعددة في تطبيقنا (بدلا من نموذج مؤشر ترابط الخيط المثالي) وتنفيذ pollsetsellectorimpl كما هو موضح هنا.

نصائح أخرى

إذا كان عليك استخدام اتصال مأخذ التوصيل هذا، فعليك فصل عملية تلقي البيانات وكتابة البيانات وإلى القناة من معالجة البيانات نفسها. لا يجب أن تفويض القناة. القناة تشبه الحافلة. يجب أن تقرأ الحافلة (مؤشر الترابط الواحد، الذي يدير القناة) البيانات والكتابة في قائمة انتظار إدخال الإدخال (آمنة من الخيارات) بما في ذلك المعلومات المطلوبة، لذلك يمكن أن تلتقط خيط (ق) عميلك حزمة مخطط البيانات الصحيح من قائمة الانتظار. إذا أحب مؤشر ترابط العميل كتابة البيانات، فسيتم كتابة هذه البيانات إلى قائمة انتظار الإخراج التي تتم قراءتها بعد ذلك من خلال خيط القنوات لكتابة البيانات إلى القناة.

لذلك من مفهوم مشاركة اتصال بين الجهات الفاعلة باستخدام هذا الصدد مع وقت المعالجة القابل للتناسبا فيه (وهو السبب الرئيسي للكتل)، فإنك تنتقل إلى مفهوم قراءة البيانات غير المتزامنة ومعالجة البيانات وكتابة البيانات. لذلك، ليس وقت المعالجة الذي لا يمكن التنبؤ به بعد الآن، ولكن الوقت، يتم قراءة بياناتك أو كتابتها. يعني عدم الحظر، أن دفق البيانات ثابت قدر الإمكان، على الرغم من الوقت المناسب لمعالجة هذه البيانات.

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