2016-05-05 5 views
2

Ich spiele mehr mit Frühling Integration, was ich sehr interessiert bin, aber meiner Meinung nach ein seltsames Verhalten habe ich keine Antwort dafür finden.Spring Integration Queue-Channel Kapazität falsch

Ich habe eine einfache Anwendung mit Queue-Channel:

<int:channel id="ticketChannel" datatype="ch.elca.prototype.model.Ticket"> 
    <int:queue capacity="1"/> 
</int:channel> 

ich auch Rendezvous-Queue mit dem gleichen Effekt versucht:

<int:channel id="ticketChannel" datatype="ch.elca.prototype.model.Ticket"> 
    <int:rendezvous-queue/> 
</int:channel> 

Mit meinem Verständnis, soll es jetzt nur noch möglich sein wird, Verschieben Sie eine Nachricht in diesem Kanal. Vielleicht 2, wenn Sie denken, dass Sie eine zusätzliche Kapazität haben. Ich bin mir nicht sicher, wie ich es lesen soll. ABER ich kann viermal ohne Verbrauch in diesen Kanal senden, das ist ein bisschen komisch für mich und ich verstehe die Kapazität dann nicht.

Siehe folgende:

Hauptanwendung: Hier streamen I 10 Tickets und rufen Sie Openticket für jeden:

public static void main(final String[] args) throws InterruptedException { 
    try (ConfigurableApplicationContext context = SpringApplication.run(SassSimulatorApplication2.class, args)) { 
     final TicketGenerator generator = context.getBean(TicketGenerator.class); 
     final ProblemReporter reporter = context.getBean(ProblemReporter.class); 
     generator.createTickets().limit(10).forEach(reporter::openTicket); 
     context.close(); 
    } 
} 

ProblemReporter:

public class ProblemReporter { 
    private volatile QueueChannel channel; 

    public synchronized void openTicket(final Ticket ticket){ 
     final Message<Ticket> build = TicketMessageBuilder.buildMessage(ticket); 
     boolean send = channel.send(build); 

     System.out.println("send: " + send); 
     System.out.println("getQueueSize: " + channel.getQueueSize()); 
     System.out.println("getSendCount: " + channel.getSendCount()); 
     System.out.println("getReceiveCount: " + channel.getReceiveCount()); 
     System.out.println("getSendErrorCount: " + channel.getSendErrorCount()); 
     System.out.println("getRemainingCapacity: " + channel.getRemainingCapacity()); 
    } 

    @Value("#{ticketChannel}") 
    public void setChannel(final QueueChannel channel) { 
     this.channel = channel; 
    } 
} 

Beim Starten Anwendung I erhalten Sie folgendes:

send: true 
getQueueSize: 0 
getSendCount: 0 
getReceiveCount: 0 
getSendErrorCount: 0 
getRemainingCapacity: 1 

send: true 
getQueueSize: 0 
getSendCount: 0 
getReceiveCount: 0 
getSendErrorCount: 0 
getRemainingCapacity: 1 

send: true 
getQueueSize: 1 
getSendCount: 0 
getReceiveCount: 0 
getSendErrorCount: 0 
getRemainingCapacity: 0 

send: true 
getQueueSize: 1 
getSendCount: 0 
getReceiveCount: 0 
getSendErrorCount: 0 
getRemainingCapacity: 0 

Ich benutze Spring-Boot 1.3.3, Sprint-Integration 4.2.5.RELEASE. Ich habe auch Spring-Boot 1.2.8 mit Spring-Integration 4.1.9 ausprobiert.

Ist das erwartete Verhalten ???

Vielen Dank im Voraus.

Antwort

1

Sieht aus wie Ihre channel.send(build, 30000); ist gegen die local Variable, nicht freigegeben bean getan. Mein Testfall wie folgt aussieht:

QueueChannel channel = new QueueChannel(3); 

IntStream.range(0, 4) 
     .forEach(i -> { 
      boolean send = channel.send(new GenericMessage<>("test-" + i), 100); 
      System.out.println("send: " + send); 
      System.out.println("getQueueSize: " + channel.getQueueSize()); 
      System.out.println("getRemainingCapacity: " + channel.getRemainingCapacity()); 
     }); 

Und das Ergebnis ist:

send: true 
getQueueSize: 1 
getRemainingCapacity: 2 
send: true 
getQueueSize: 2 
getRemainingCapacity: 1 
send: true 
getQueueSize: 3 
getRemainingCapacity: 0 
send: false 
getQueueSize: 3 
getRemainingCapacity: 0 

Hinweis: Die sendCount (und ähnliche) nur über @EnableIntegrationMBeanExport oder @EnableIntegrationManagement aktiviert werden kann. Siehe Management im Referenzhandbuch.

Sie können auch einige Testfälle zu diesem Thema im Framework finden, z. QueueChannelTests.

+0

Danke für die Antwort, ich bin mir nicht sicher, was Sie mit nicht gemeinsamen Bean meinen. Ich habe meine Klasse in meiner Frage oben erweitert. Ich injiziere den Kanal mit @Value, also wird es von Spring verwaltet. Wenn ich Kapazität z. 50, dann bekomme ich 200 in den Kanal ... –

+0

OK. Da es wie eine Spring-Boot-Anwendung aussieht, wäre es großartig, wenn Sie es irgendwo auf GitHub teilen und wir werden damit lokal spielen. –

+0

Es tut mir wirklich leid, es war wirklich dumm von mir. Ich hatte bereits einen Transformator, und er konsumierte bereits das Ticket, so dass es wieder ein Leerzeichen in der Warteschlange gab. So peinlich, danke fürs helfen. –