Example usage for org.springframework.integration.channel QueueChannel receive

List of usage examples for org.springframework.integration.channel QueueChannel receive

Introduction

In this page you can find the example usage for org.springframework.integration.channel QueueChannel receive.

Prototype

@Override 
@Nullable
public Message<?> receive(long timeout) 

Source Link

Document

Receive the first available message from this channel.

Usage

From source file:org.springframework.integration.aggregator.AggregatorTests.java

@Test
public void testMultipleGroupsSimultaneously() throws InterruptedException {
    QueueChannel replyChannel1 = new QueueChannel();
    QueueChannel replyChannel2 = new QueueChannel();
    Message<?> message1 = createMessage(3, "ABC", 3, 1, replyChannel1, null);
    Message<?> message2 = createMessage(5, "ABC", 3, 2, replyChannel1, null);
    Message<?> message3 = createMessage(7, "ABC", 3, 3, replyChannel1, null);
    Message<?> message4 = createMessage(11, "XYZ", 3, 1, replyChannel2, null);
    Message<?> message5 = createMessage(13, "XYZ", 3, 2, replyChannel2, null);
    Message<?> message6 = createMessage(17, "XYZ", 3, 3, replyChannel2, null);
    aggregator.handleMessage(message1);//from w  w w.ja  v  a  2 s .  c om
    aggregator.handleMessage(message5);
    aggregator.handleMessage(message3);
    aggregator.handleMessage(message6);
    aggregator.handleMessage(message4);
    aggregator.handleMessage(message2);
    @SuppressWarnings("unchecked")
    Message<Integer> reply1 = (Message<Integer>) replyChannel1.receive(1000);
    assertNotNull(reply1);
    assertThat(reply1.getPayload(), is(105));
    @SuppressWarnings("unchecked")
    Message<Integer> reply2 = (Message<Integer>) replyChannel2.receive(1000);
    assertNotNull(reply2);
    assertThat(reply2.getPayload(), is(2431));
}

From source file:org.springframework.integration.aggregator.AggregatorTests.java

@Test
@Ignore//from   w  ww.  j a  va2 s. c om
// dropped backwards compatibility for setting capacity limit (it's always Integer.MAX_VALUE)
public void testTrackedCorrelationIdsCapacityAtLimit() {
    QueueChannel replyChannel = new QueueChannel();
    QueueChannel discardChannel = new QueueChannel();

    this.aggregator.setDiscardChannel(discardChannel);
    this.aggregator.handleMessage(createMessage(1, 1, 1, 1, replyChannel, null));
    assertEquals(1, replyChannel.receive(1000).getPayload());
    this.aggregator.handleMessage(createMessage(3, 2, 1, 1, replyChannel, null));
    assertEquals(3, replyChannel.receive(1000).getPayload());
    this.aggregator.handleMessage(createMessage(4, 3, 1, 1, replyChannel, null));
    assertEquals(4, replyChannel.receive(1000).getPayload());
    // next message with same correllation ID is discarded
    this.aggregator.handleMessage(createMessage(2, 1, 1, 1, replyChannel, null));
    assertEquals(2, discardChannel.receive(1000).getPayload());
}

From source file:org.springframework.integration.aggregator.AggregatorTests.java

@Test
@Ignore// w  w w.ja va 2s  .  co  m
// dropped backwards compatibility for setting capacity limit (it's always Integer.MAX_VALUE)
public void testTrackedCorrelationIdsCapacityPassesLimit() {
    QueueChannel replyChannel = new QueueChannel();
    QueueChannel discardChannel = new QueueChannel();

    this.aggregator.setDiscardChannel(discardChannel);
    this.aggregator.handleMessage(createMessage(1, 1, 1, 1, replyChannel, null));
    assertEquals(1, replyChannel.receive(1000).getPayload());
    this.aggregator.handleMessage(createMessage(2, 2, 1, 1, replyChannel, null));
    assertEquals(2, replyChannel.receive(1000).getPayload());
    this.aggregator.handleMessage(createMessage(3, 3, 1, 1, replyChannel, null));
    assertEquals(3, replyChannel.receive(1000).getPayload());
    this.aggregator.handleMessage(createMessage(4, 4, 1, 1, replyChannel, null));
    assertEquals(4, replyChannel.receive(1000).getPayload());
    this.aggregator.handleMessage(createMessage(5, 1, 1, 1, replyChannel, null));
    assertEquals(5, replyChannel.receive(1000).getPayload());
    assertNull(discardChannel.receive(0));
}

From source file:org.springframework.integration.aggregator.AggregatorTests.java

@Test
public void testAdditionalMessageAfterCompletion() throws InterruptedException {
    QueueChannel replyChannel = new QueueChannel();
    Message<?> message1 = createMessage(3, "ABC", 3, 1, replyChannel, null);
    Message<?> message2 = createMessage(5, "ABC", 3, 2, replyChannel, null);
    Message<?> message3 = createMessage(7, "ABC", 3, 3, replyChannel, null);
    Message<?> message4 = createMessage(7, "ABC", 3, 3, replyChannel, null);

    this.aggregator.handleMessage(message1);
    this.aggregator.handleMessage(message2);
    this.aggregator.handleMessage(message3);
    this.aggregator.handleMessage(message4);

    Message<?> reply = replyChannel.receive(10000);
    assertNotNull("A message should be aggregated", reply);
    assertThat(((Integer) reply.getPayload()), is(105));
}

From source file:org.springframework.integration.aggregator.AggregatorTests.java

@Test
public void shouldRejectDuplicatedSequenceNumbers() throws InterruptedException {
    QueueChannel replyChannel = new QueueChannel();
    Message<?> message1 = createMessage(3, "ABC", 3, 1, replyChannel, null);
    Message<?> message2 = createMessage(5, "ABC", 3, 2, replyChannel, null);
    Message<?> message3 = createMessage(7, "ABC", 3, 3, replyChannel, null);
    Message<?> message4 = createMessage(7, "ABC", 3, 3, replyChannel, null);
    this.aggregator.setReleaseStrategy(new SequenceSizeReleaseStrategy());

    this.aggregator.handleMessage(message1);
    this.aggregator.handleMessage(message3);
    // duplicated sequence number, either message3 or message4 should be rejected
    this.aggregator.handleMessage(message4);
    this.aggregator.handleMessage(message2);

    Message<?> reply = replyChannel.receive(10000);
    assertNotNull("A message should be aggregated", reply);
    assertThat(((Integer) reply.getPayload()), is(105));
}

From source file:org.springframework.integration.aggregator.BarrierMessageHandlerTests.java

@Test
public void testRequestBeforeReply() throws Exception {
    final BarrierMessageHandler handler = new BarrierMessageHandler(10000);
    QueueChannel outputChannel = new QueueChannel();
    handler.setOutputChannel(outputChannel);
    handler.setBeanFactory(mock(BeanFactory.class));
    handler.afterPropertiesSet();//from  www  .j ava 2 s.  co  m
    final AtomicReference<Exception> dupCorrelation = new AtomicReference<Exception>();
    final CountDownLatch latch = new CountDownLatch(1);
    Runnable runnable = () -> {
        try {
            handler.handleMessage(MessageBuilder.withPayload("foo").setCorrelationId("foo").build());
        } catch (MessagingException e) {
            dupCorrelation.set(e);
        }
        latch.countDown();
    };
    ExecutorService exec = Executors.newCachedThreadPool();
    exec.execute(runnable);
    exec.execute(runnable);
    Map<?, ?> suspensions = TestUtils.getPropertyValue(handler, "suspensions", Map.class);
    int n = 0;
    while (n++ < 100 && suspensions.size() == 0) {
        Thread.sleep(100);
    }
    Map<?, ?> inProcess = TestUtils.getPropertyValue(handler, "inProcess", Map.class);
    assertEquals(1, inProcess.size());
    assertTrue("suspension did not appear in time", n < 100);
    assertTrue(latch.await(10, TimeUnit.SECONDS));
    assertNotNull(dupCorrelation.get());
    assertThat(dupCorrelation.get().getMessage(), startsWith("Correlation key (foo) is already in use by"));
    handler.trigger(MessageBuilder.withPayload("bar").setCorrelationId("foo").build());
    Message<?> received = outputChannel.receive(10000);
    assertNotNull(received);
    List<?> result = (List<?>) received.getPayload();
    assertEquals("foo", result.get(0));
    assertEquals("bar", result.get(1));
    assertEquals(0, suspensions.size());
    assertEquals(0, inProcess.size());
}

From source file:org.springframework.integration.aggregator.BarrierMessageHandlerTests.java

@Test
public void testReplyBeforeRequest() throws Exception {
    final BarrierMessageHandler handler = new BarrierMessageHandler(10000);
    QueueChannel outputChannel = new QueueChannel();
    handler.setOutputChannel(outputChannel);
    handler.setBeanFactory(mock(BeanFactory.class));
    handler.afterPropertiesSet();/*  ww w  . ja  va 2s.c  om*/
    Executors.newSingleThreadExecutor()
            .execute(() -> handler.trigger(MessageBuilder.withPayload("bar").setCorrelationId("foo").build()));
    Map<?, ?> suspensions = TestUtils.getPropertyValue(handler, "suspensions", Map.class);
    int n = 0;
    while (n++ < 100 && suspensions.size() == 0) {
        Thread.sleep(100);
    }
    assertTrue("suspension did not appear in time", n < 100);
    handler.handleMessage(MessageBuilder.withPayload("foo").setCorrelationId("foo").build());
    Message<?> received = outputChannel.receive(10000);
    assertNotNull(received);
    List<?> result = (ArrayList<?>) received.getPayload();
    assertEquals("foo", result.get(0));
    assertEquals("bar", result.get(1));
    assertEquals(0, suspensions.size());
}

From source file:org.springframework.integration.aggregator.BarrierMessageHandlerTests.java

@Test
public void testLateReply() throws Exception {
    final BarrierMessageHandler handler = new BarrierMessageHandler(0);
    QueueChannel outputChannel = new QueueChannel();
    QueueChannel discardChannel = new QueueChannel();
    handler.setOutputChannel(outputChannel);
    handler.setDiscardChannelName("discards");
    handler.setChannelResolver(s -> discardChannel);
    handler.setBeanFactory(mock(BeanFactory.class));
    handler.afterPropertiesSet();/*from   w ww.  j  a  v  a2  s .  c om*/
    final CountDownLatch latch = new CountDownLatch(1);
    Executors.newSingleThreadExecutor().execute(() -> {
        handler.handleMessage(MessageBuilder.withPayload("foo").setCorrelationId("foo").build());
        latch.countDown();
    });
    Map<?, ?> suspensions = TestUtils.getPropertyValue(handler, "suspensions", Map.class);
    assertTrue(latch.await(10, TimeUnit.SECONDS));
    assertEquals("suspension not removed", 0, suspensions.size());
    Log logger = spy(TestUtils.getPropertyValue(handler, "logger", Log.class));
    new DirectFieldAccessor(handler).setPropertyValue("logger", logger);
    final Message<String> triggerMessage = MessageBuilder.withPayload("bar").setCorrelationId("foo").build();
    handler.trigger(triggerMessage);
    ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
    verify(logger).error(captor.capture());
    assertThat(captor.getValue(),
            allOf(containsString("Suspending thread timed out or did not arrive within timeout for:"),
                    containsString("payload=bar")));
    assertEquals(0, suspensions.size());
    Message<?> discard = discardChannel.receive(0);
    assertSame(discard, triggerMessage);
    handler.handleMessage(MessageBuilder.withPayload("foo").setCorrelationId("foo").build());
    assertEquals(0, suspensions.size());
}

From source file:org.springframework.integration.amqp.outbound.AsyncAmqpGatewayTests.java

@Test
public void testConfirmsAndReturns() throws Exception {
    CachingConnectionFactory ccf = new CachingConnectionFactory("localhost");
    ccf.setPublisherConfirms(true);/*from ww w  .j a  v a  2 s  . co m*/
    ccf.setPublisherReturns(true);
    RabbitTemplate template = new RabbitTemplate(ccf);
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(ccf);
    container.setBeanName("replyContainer");
    container.setQueueNames("asyncRQ1");
    container.afterPropertiesSet();
    container.start();
    AsyncRabbitTemplate asyncTemplate = new AsyncRabbitTemplate(template, container);
    asyncTemplate.setEnableConfirms(true);
    asyncTemplate.setMandatory(true);

    SimpleMessageListenerContainer receiver = new SimpleMessageListenerContainer(ccf);
    receiver.setBeanName("receiver");
    receiver.setQueueNames("asyncQ1");
    final CountDownLatch waitForAckBeforeReplying = new CountDownLatch(1);
    MessageListenerAdapter messageListener = new MessageListenerAdapter(
            (ReplyingMessageListener<String, String>) foo -> {
                try {
                    waitForAckBeforeReplying.await(10, TimeUnit.SECONDS);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                return foo.toUpperCase();
            });
    receiver.setMessageListener(messageListener);
    receiver.afterPropertiesSet();
    receiver.start();

    AsyncAmqpOutboundGateway gateway = new AsyncAmqpOutboundGateway(asyncTemplate);
    Log logger = spy(TestUtils.getPropertyValue(gateway, "logger", Log.class));
    given(logger.isDebugEnabled()).willReturn(true);
    final CountDownLatch replyTimeoutLatch = new CountDownLatch(1);
    willAnswer(invocation -> {
        invocation.callRealMethod();
        replyTimeoutLatch.countDown();
        return null;
    }).given(logger).debug(startsWith("Reply not required and async timeout for"));
    new DirectFieldAccessor(gateway).setPropertyValue("logger", logger);
    QueueChannel outputChannel = new QueueChannel();
    outputChannel.setBeanName("output");
    QueueChannel returnChannel = new QueueChannel();
    returnChannel.setBeanName("returns");
    QueueChannel ackChannel = new QueueChannel();
    ackChannel.setBeanName("acks");
    QueueChannel errorChannel = new QueueChannel();
    errorChannel.setBeanName("errors");
    gateway.setOutputChannel(outputChannel);
    gateway.setReturnChannel(returnChannel);
    gateway.setConfirmAckChannel(ackChannel);
    gateway.setConfirmNackChannel(ackChannel);
    gateway.setConfirmCorrelationExpressionString("#this");
    gateway.setExchangeName("");
    gateway.setRoutingKey("asyncQ1");
    gateway.setBeanFactory(mock(BeanFactory.class));
    gateway.afterPropertiesSet();
    gateway.start();

    Message<?> message = MessageBuilder.withPayload("foo").setErrorChannel(errorChannel).build();

    gateway.handleMessage(message);

    Message<?> ack = ackChannel.receive(10000);
    assertNotNull(ack);
    assertEquals("foo", ack.getPayload());
    assertEquals(true, ack.getHeaders().get(AmqpHeaders.PUBLISH_CONFIRM));
    waitForAckBeforeReplying.countDown();

    Message<?> received = outputChannel.receive(10000);
    assertNotNull(received);
    assertEquals("FOO", received.getPayload());

    // timeout tests
    asyncTemplate.setReceiveTimeout(10);

    receiver.setMessageListener(message1 -> {
    });
    // reply timeout with no requiresReply
    message = MessageBuilder.withPayload("bar").setErrorChannel(errorChannel).build();
    gateway.handleMessage(message);
    assertTrue(replyTimeoutLatch.await(10, TimeUnit.SECONDS));

    // reply timeout with requiresReply
    gateway.setRequiresReply(true);
    message = MessageBuilder.withPayload("baz").setErrorChannel(errorChannel).build();
    gateway.handleMessage(message);

    received = errorChannel.receive(10000);
    assertThat(received, instanceOf(ErrorMessage.class));
    ErrorMessage error = (ErrorMessage) received;
    assertThat(error.getPayload(), instanceOf(MessagingException.class));
    assertThat(error.getPayload().getCause(), instanceOf(AmqpReplyTimeoutException.class));
    asyncTemplate.setReceiveTimeout(30000);
    receiver.setMessageListener(messageListener);

    // error on sending result
    DirectChannel errorForce = new DirectChannel();
    errorForce.setBeanName("errorForce");
    errorForce.subscribe(message1 -> {
        throw new RuntimeException("intentional");
    });
    gateway.setOutputChannel(errorForce);
    message = MessageBuilder.withPayload("qux").setErrorChannel(errorChannel).build();
    gateway.handleMessage(message);
    received = errorChannel.receive(10000);
    assertThat(received, instanceOf(ErrorMessage.class));
    error = (ErrorMessage) received;
    assertThat(error.getPayload(), instanceOf(MessagingException.class));
    assertEquals("QUX", ((MessagingException) error.getPayload()).getFailedMessage().getPayload());

    gateway.setRoutingKey(UUID.randomUUID().toString());
    message = MessageBuilder.withPayload("fiz").setErrorChannel(errorChannel).build();
    gateway.handleMessage(message);
    Message<?> returned = returnChannel.receive(10000);
    assertNotNull(returned);
    assertEquals("fiz", returned.getPayload());
    ackChannel.receive(10000);
    ackChannel.purge(null);

    asyncTemplate = mock(AsyncRabbitTemplate.class);
    RabbitMessageFuture future = asyncTemplate.new RabbitMessageFuture(null, null);
    willReturn(future).given(asyncTemplate).sendAndReceive(anyString(), anyString(),
            any(org.springframework.amqp.core.Message.class));
    DirectFieldAccessor dfa = new DirectFieldAccessor(future);
    dfa.setPropertyValue("nackCause", "nacknack");
    SettableListenableFuture<Boolean> confirmFuture = new SettableListenableFuture<Boolean>();
    confirmFuture.set(false);
    dfa.setPropertyValue("confirm", confirmFuture);
    new DirectFieldAccessor(gateway).setPropertyValue("template", asyncTemplate);

    message = MessageBuilder.withPayload("buz").setErrorChannel(errorChannel).build();
    gateway.handleMessage(message);

    ack = ackChannel.receive(10000);
    assertNotNull(ack);
    assertEquals("buz", ack.getPayload());
    assertEquals("nacknack", ack.getHeaders().get(AmqpHeaders.PUBLISH_CONFIRM_NACK_CAUSE));
    assertEquals(false, ack.getHeaders().get(AmqpHeaders.PUBLISH_CONFIRM));

    asyncTemplate.stop();
    receiver.stop();
    ccf.destroy();
}

From source file:org.springframework.integration.channel.QueueChannelTests.java

@Test
public void testImmediateReceive() throws Exception {
    final AtomicBoolean messageReceived = new AtomicBoolean(false);
    final QueueChannel channel = new QueueChannel();
    final CountDownLatch latch1 = new CountDownLatch(1);
    final CountDownLatch latch2 = new CountDownLatch(1);
    Executor singleThreadExecutor = Executors.newSingleThreadExecutor();
    Runnable receiveTask1 = new Runnable() {
        @Override/*from   w ww. j a  va2 s . c o m*/
        public void run() {
            Message<?> message = channel.receive(0);
            if (message != null) {
                messageReceived.set(true);
            }
            latch1.countDown();
        }
    };
    Runnable sendTask = new Runnable() {
        @Override
        public void run() {
            channel.send(new GenericMessage<String>("testing"));
        }
    };
    singleThreadExecutor.execute(receiveTask1);
    latch1.await();
    singleThreadExecutor.execute(sendTask);
    assertFalse(messageReceived.get());
    Runnable receiveTask2 = new Runnable() {
        @Override
        public void run() {
            Message<?> message = channel.receive(0);
            if (message != null) {
                messageReceived.set(true);
            }
            latch2.countDown();
        }
    };
    singleThreadExecutor.execute(receiveTask2);
    latch2.await();
    assertTrue(messageReceived.get());
}