2015-10-18 20 views
5
Ben soruları/işlemlerini-to-make SI geçidi özelliği hakkındaki ettik

:Bahar Entegrasyon Geçidi kanalı cevap

benim geçidi arabirimi aşağıdaki gibi tanımlanırsa:

public interface MyGateway{ 
    public void myGatewayMethod(Message<?> inMessage); 
} 

Ve benim Ağ geçidi yapılandırması aşağıdaki gibi tanımlamıştır:

<int:gateway id="mySvcGateway" 
       service-interface="com.myCompany.myPkg.MyGateway" 
       error-channel="globalExceptionHandlerChannel"> 

     <int:method name="myGatewayMethod" request-channel="myGatewayReqChannel" />  
    </int:gateway> 

Sorularım/işlemlerini-to-make şunlardır:

1) Ağ geçidi hizmeti arabirimi yöntemi geçersiz olarak döndüğünden, Ağ geçidi proxy çekirdeği hala "varsayılan yanıt kanalı" veya tanımlı kullanıcı "yanıt kanalı" konusunda bir yanıt arar mı? Başka bir deyişle

2), hala reply-channel="nullChannel" (veya default-reply-channel="nullChannel") bahsetmek gerekir?

yöntem dönüş geçersizdir çünkü

YA, ağ geçidi otomatik hiçbir cevap kanalı dinlemek anlayacak?

3) Hala bu yapılandırmaya reply-timeout özelliği ekleyebilir miyim YA hiçbir cevap bekleniyor çünkü mantıklı değil mi? Benzer bağlamda

, ben aşağıdaki gibi hizmet arayüzü yönteminde başka bir yöntem ekleyin: Bunda)

<int:gateway id="mySvcGateway" 
        service-interface="com.myCompany.myPkg.MyGateway" 
        error-channel="globalExceptionHandlerChannel"> 

      <int:method name="myGatewayMethod" request-channel="myGatewayReqChannel" /> 
<int:method name="myGatewayMethod2" request-channel="myGatewayReqChannel2" /> 
     </int:gateway> 

4:

public interface MyGateway{ 
     public void myGatewayMethod(Message<?> inMessage); 
     public Object myGatewayMethod2(Message<?> inMessage); 
    } 

ve aşağıda benim geçidi yapılandırmasında bu yöntemi ekleyin Ben reply-channel tanımlamamız gerektiğine inanıyorum, doğru mu?

5) default-reply-channel bir yöntem olup ağ geçidi gibi bu durum için çalışmayabilir bir yanıt olup başka, doğru için bekler?

6) Evet ise, o zaman geçersiz döndüren yöntemi için, açıkça reply-channel="nullChannel" bahsetmek gerekir?

Onaylamak için teşekkürler.

+0

Birisi bana yukarıdaki açıklamalarda yardımcı olabilir mi? Artem/Garry - Senin türünü aradığınızı! Çok teşekkürler ! – lbvirgo

+0

Tamam, Lalit. Ben senin sorununun yıldızı ve bugün bir göz atıyorum :-) –

cevap

3

Lalit!

sorunun bu kadar büyük bir demet için teşekkürler ve ben hepsini ağ geçidinin void yönteme etrafında olduğunu şaşırdım.

hepsi hızlı makul cevabı: Biz konuda Başvuru Kılavuzu şey söyleme yana

, böyle bir yapılandırma için hiçbir endişe yoktur ve
tarafından beklendiği gibi çalışması gerekir Bahar Entegrasyonunda inanç.

Biraz şaka yapıyorum ama her şakanın bir kısmı var.

Şimdi GatewayProxyFactoryBean kaynak koduna bir göz atalım:

private Object invokeGatewayMethod(MethodInvocation invocation, boolean runningOnCallerThread) throws Exception { 
    .......... 
    boolean shouldReply = returnType != void.class; 
    .................. 
     Object[] args = invocation.getArguments(); 
     if (shouldReply) { 
      response = shouldReturnMessage ? gateway.sendAndReceiveMessage(args) : gateway.sendAndReceive(args); 
     } 
     else { 
      gateway.send(args); 
      response = null; 
     } 
    } 
    return (response != null) ? this.convert(response, returnType) : null; 
} 

Nerede da void ve sadece sonunda MessageChannel.send() çağrıları

this.messagingTemplate.convertAndSend(requestChannel, object, this.historyWritingPostProcessor); 

için MessagingGatewaySupport.send() delege.

Bu yöntemin tahmin edebileceğiniz gibi, replyChannel ve replyTimeout hiçbir şekilde önem taşımamaktadır.

Mantıksal olarak, bu seçeneklerin void yöntemi için göz ardı edileceğini ve diğer yöntemler için default-*'un void dönüş türüne sahip olanları etkilemediğini varsayar. Umarım temizimdir.

+0

Birçok tx Artem; açıklamalarınız berraktır! Ama sonra nasıl "replyTimeout" void olmayan bir yöntem sağlar ne benzer void yöntemler için zaman aşımı işlevselliği nasıl sağlayabilir? İş parçacıklarının uzun işlem süresi boyunca gereksiz yere takılmasını istemiyorum. Ayrıca, herhangi bir gelen kanal bağdaştırıcısı kullanmaktan kaçınmak istiyorum. – lbvirgo

+0

Yanıt için beklediğimizde tam olarak bir "async" durumunda zaman aşımına ihtiyacımız var. İstek-cevap durumunuz senkronize ise, herhangi bir zaman aşımı söz konusu olmayacaktır. Sıkışmış Konu için, sadece 'send' veya 'sendAndReceive' öğesinin bir parçası olup olmadığı farketmez. SI olmadan kullanım durumunuzu hayal etmeye çalışın ve iş parçacığının kendisini durdurmanıza yardımcı olacak hiçbir araç olmadığını göreceksiniz. –

+0

Bazen gereksiz karmaşıklıkları önleyerek hayatımızı kolaylaştırabiliriz! :) Teşekkürler Artem! – lbvirgo