المحول الداخلي على بوابة وكيل التكامل الربيعي

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

  •  07-07-2019
  •  | 
  •  

سؤال

أرغب في تكوين عملية تبدو كالتالي:

Method Call -> Dynamic Proxy Gateway -> Channel -> Service Activator -> Method Call
             ^---------- Transformer <- Channel <-             [return value]

على نحو فعال، أرغب في الوصول بطريقة أو بأخرى إلى القناة المخفية التي ينشئها Spring Integration وتحويل حمولة رسالة الإرجاع إلى نوع رسالة مختلف.

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

يبدو أن الحل الآخر هنا هو تحديد قناة الإخراج على منشط الخدمة، ولكن هذا يعاني من مشكلة مختلفة قليلاً.بافتراض أنني أشارك قناة الإخراج من الحزمة "ب"، فقد قمت بتخفيف مشكلة التبعية الدائرية، ولكن الآن في أي وقت يطلب شخص ما شيئًا من الحزمة "أ"، يذهب الرد إلى كل شخص مرتبط بقناة الإخراج - وهذا أيضًا غير مرغوب فيه .

[يحرر:ما أعنيه هنا هو أنه إذا شارك "B" كلاً من قناة الإدخال والإخراج لمنشط الخدمة الخاص به، فإن أي شخص مرتبط بقناة الإخراج الخاصة بـ "B" سيتلقى نتيجة طلب أي شخص إلى قناة الإدخال الخاصة بـ "B" -- والسلوك المطلوب هو أن يتم توجيه الردود إلى الطالبين.

يجب أن أشير إلى أن المحول هنا منطقي فقط في سياق الحزمة أ.توفر الحزمة B خدمة (لجميع المقاصد والأغراض، خدمة لا أملك أي سيطرة عليها).يجب أن يكون التحول الخاص باحتياجات الحزمة "أ" موجودًا في الحزمة "أ".]

لذا، ما أعتقد أنني بحاجة إليه حقًا هو أن أكون قادرًا على تكوين محول عند الردود على بوابة الوكيل الديناميكية، ولكن حاول قدر المستطاع أنني لا أستطيع العثور على مثل هذا الجهاز في دليل Spring Integration.كما هو الحال دائمًا، ستكون المساعدة موضع تقدير كبير.

--

تحرير 2:لقد حاولت استخدام تكتيكين آخرين هنا:

  1. استخدم منشط الخدمة الذي يشير إلى قناة OSGi المشتركة من الحزمة B

    وكانت النتيجة أن العنصر الذي تم إرجاعه كان GenericMessageType - والذي من الممكن تحويله.إن GenericMessageType هو في الواقع النتيجة المنطقية لطريقة "الإرسال" التي يجب أن يشير إليها منشط الخدمة، وليس رسالة الرد.هكذا تفعل هذه الطريقة لا عمل.

  2. استخدم أداة إثراء الرأس للضبط REPLY_CHANNEL وقم بتمرير قناة الرد كمرجع وليس كقيمة.

    فعلت هذه التقنية لا العمل، يبدو أن عنصر رأس REPLY_CHANNEL يتم تجاهله عند تعيين قناة الرد الافتراضية للبوابة (وقناة الرد الافتراضية يجب يتم تعيينها).

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

المحلول

من الناحية النظرية الجواب الحقيقي هنا هو استخدام سلسلة.

سيبدو تكوين الحزمة A كما يلي

<si:gateway id="gw" default-request-channel="xyz" />
<si:channel id="xyz" />
<si:chain input-channel="xyz" />
    <si:service-activator />
    <si:transformer />
</si:chain>

ملاحظة بالنسبة للحزمة B، لم يتغير التكوين وتتم مشاركة قناة واحدة فقط من خلال OSGi للوصول إليها بواسطة الحزمة A أو أي حزم ثالثة.

يتوفر خياران لمنشط الخدمة:

  1. الخدمة المشتركة من خلال OSGi
  2. خدمة مخصصة تستدعي ببساطة بوابة وكيل لنوع البيانات التي تم إرجاعها قبل التحويل.

سيتم إدخال بوابة الوكيل في الحزمة A في بعض قنوات الإدخال "xyz" وفي النهاية ستحتوي قناة العودة الضمنية على المحتوى المحول حسب الرغبة.

هذا الحل هو تقريبًا نفس الحل الذي اقترحته SingleShot، ولكن هنا نمنع مشاركة خدمة حقيقية من خلال OSGi، مع الحفاظ على حدود الحزمة.

نصائح أخرى

أنا مرتبك قليلاً من وصف مشكلتك.أنا أفهم جانب التبعية الدائرية وجانب المحول، لكنني لست متأكدًا من أن "الرد يذهب إلى كل شخص مرتبط بـ A".

يبدو أنك قد ترغب في الحصول على منشطي خدمة لـ B.سيبقى جهازك الموجود في B، وسيستخدمه معظم العملاء.والآخر سيدخل في A، وسيستخدم فقط القنوات المحددة في A.وهذا من شأنه أن يمنع الطلبات من A إلى B من التسبب في تلقي استجابات من قبل مكونات خارج A.

وهذا من شأنه أن يجعل مشكلة التحول أسهل.تأخذ المحولات رسالة من قناة واحدة، وتحولها، وتضعها على قناة أخرى.فقط أضف واحدًا في A ويجب أن تكون جيدًا.

إذن في A سيكون لديك هذه المكونات، التي لا يمكن استخدامها إلا بواسطة A:

  • بوابة
  • قناة الإدخال
  • منشط الخدمة لـ B
  • قناة الإخراج
  • محول
  • قناة الإخراج المحولة

في B سيكون لديك، صالحة للاستخدام من قبل أي شخص:

  • قناة الإدخال
  • منشط الخدمة لـ B
  • قناة الإخراج

أ يعتمد على ب، لكن ب لا يعتمد على أ.

هل سيصلح هذا؟

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