تكامل الربيع: تثبيت خدمات الويب إلى قائمة انتظار FIFO

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

سؤال

ما زلت أعاضي مع تكامل الربيع، إليك سيناريو:

  1. خدمة الويب تحصل على طلب من العميل
  2. خدمة الويب تضع الطلب على قائمة انتظار
  3. يقوم المستهلك في قائمة الانتظار بمعالجة الرسائل FIFO ويرسل استجابة يتم توجيهها مرة أخرى إلى خدمة الويب
  4. خدمات الويب ترسل استجابة العودة إلى العميل

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

ما القطع من تكامل الربيع أحتاج إلى الأسلاك معا؟

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

المحلول

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

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

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

نصائح أخرى

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

هذا هو الرمز الذي يضيف شيئا إلى قائمة انتظار (خدمة الويب الخاصة بك).

public class TheWebService {

  // Could also use QueueChannel, or PollableChannel here instead
  // just picked the most general one
  private org.springframework.integration.channel.MessageChannel queue;

  public void yourWebServiceMethod(SomeArg arg) {
     SomeObjectToPassThatExtendsMessage passed = someInitialProcessing(arg);
     queue.send(passed);
  }
}

هذا هو الرمز الذي سيذهب إلى فئة جهاز الاستقبال / المعالج / Dequeue

public class TheProcessor {

  // Could also use QueueChannel here instead
  // just picked the most general one
  private org.springframework.integration.channel.PollableChannel queue;

  // This method needs to be setup to be called by a separate thread.
  // See http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/scheduling/package-summary.html
  // and it's sub-packages.
  public void someProcessingPoller() {
     SomeObjectToPassThatExtendsMessage passed = queue.receive();
     // Do some processing with the passed object.
  }

}

تكوين الربيع لهذا سيبدو شيئا مثل

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans">

  <bean id="webService" class="mypackage.TheWebService">
      <property name="queue" ref="queue" />
  </bean>

  <bean id="processor" class="mypackage.TheProcessor ">
      <property name="queue" ref="queue" />
  </bean>

  <bean id="queue" class="org.springframework.integration.channel.QueueChannel"/>
</beans>

ملاحظة تأكد من تكامل الربيع ولكن Java 5 لديه عدد من OrchingQueues التي يمكنها التعامل مع FIFO.

يجب أن تنظر إليك إما على HTTP (للراحة) أو WS (بالنسبة إلى عناصر POX / SOAP) "بوابة Inbound-gateway" في تكامل الربيع. يمكن أن يكون أحد المرء متصلا بقناة مشتركة مدعومة من قائمة الانتظار عبر سمة "طلب القناة" (يمكن معالجة توجيه الرد مرة أخرى من خلال البوابة نفسها خلف الكواليس). أود أن أوصي بدءا من خلال التصفح من خلال العينات. يجب أن تساعدك هذه المدونة في الاستيقاظ والجري: http://blog.springsource.com/2010/09/29/NEW-SPRING-STIMATESS/

امل ان يساعد. -علامة

المشكلة ليست الربيع. أعتقد أنك ستحتاج إلى قائمة انتظار مع عناصر تحتوي على الطلب وتقديم استجابة. لكن الاستجابة تحتاج إلى حظرها حتى يتم حيز العنصر ومعالجته. لذلك يبدو أن عنصر قائمة الانتظار:

public class BlockingPair {
  private final RequestBodyType request;
  private ResponseBodyType response;

  public BlockingPair(RequestBodyType request) {
    this.request = request;
  }

  public RequestBodyType getRequest() {
    return request;
  }

  public ResponseBodyType getResponse() {
    while (response == null) {
      Thread.currentThread().sleep(10);
    }
    return response;
  }

  public void setResponse(ResponseBodyType response) {
    this.response = response;
  }
}

يقوم Webservice Encqueing بإنشاء BlockingPair مع هيئة الطلب الخاصة به. من دفع عنصر blockingpair إلى قائمة الانتظار. بعد ذلك، فإنه يخلق الاستجابة في الحصول على جسم الاستجابة من BlockingPair، ولكن الكتل.

يعتبر المستهلك كتلة واحدة ويحدد هيئة الاستجابة. من هناك تواصل Webservice كتابة الاستجابة.

تحتاج إلى ثلاثة فاصوليا: Webservice، قائمة انتظار حظر والمستهلك. يحتاج كل من WebService والمستهلك إلى قائمة الانتظار كخاصية Bean.

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

جزء من web.xml:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
  <servlet-name>service</servlet-name>
  <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>service</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

ال applicationContext.xml يحتوي على فاصين:

<bean id="queue" class="java.util.concurrent.LinkedBlockingQueue"/>

<bean id="consumer" class="...">
  <property name="queue" ref="queue"/>
</bean>

يحتوي Webservice على تعريف سياقه الخاص، هنا service-servlet.xml:

<bean id="endpoint" class="org.springframework.ws.server.endpoint....PayloadEndpoint">
  <property name="queue" ref="queue"/>
</bean>

لمزيد من المعلومات حول تحديد نقطة نهاية ربيع WS، انظر الربيع التعليمي.

يجب أن يكون المستهلك مهمة خلفية، لذلك أفضل ذلك كوارتز, ، لاندماج الربيع انظر هنا.

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