Search in sources :

Example 86 with MessagingException

use of org.springframework.messaging.MessagingException in project spring-integration by spring-projects.

the class MicrometerMetricsTests method testSend.

@Test
public void testSend() {
    GenericMessage<String> message = new GenericMessage<>("foo");
    this.channel.send(message);
    try {
        this.channel.send(this.source.receive());
        fail("Expected exception");
    } catch (MessagingException e) {
        assertThat(e.getCause().getMessage()).isEqualTo("testErrorCount");
    }
    this.channel2.send(message);
    this.queue.send(message);
    this.queue.send(message);
    this.queue.receive();
    this.badPoll.send(message);
    try {
        this.badPoll.receive();
        fail("Expected exception");
    } catch (RuntimeException e) {
        assertThat(e.getMessage()).isEqualTo("badPoll");
    }
    nullChannel.send(message);
    MeterRegistry registry = this.meterRegistry;
    assertThat(registry.get("spring.integration.channels").gauge().value()).isEqualTo(6);
    assertThat(registry.get("spring.integration.handlers").gauge().value()).isEqualTo(3);
    assertThat(registry.get("spring.integration.sources").gauge().value()).isEqualTo(1);
    assertThat(registry.get("spring.integration.receive").tag("name", "source").tag("result", "success").counter().count()).isEqualTo(1);
    assertThat(registry.get("spring.integration.receive").tag("name", "badPoll").tag("result", "failure").counter().count()).isEqualTo(1);
    assertThat(registry.get("spring.integration.send").tag("name", "eipBean.handler").tag("result", "success").timer().count()).isEqualTo(1);
    assertThat(registry.get("spring.integration.send").tag("name", "eipMethod.handler").tag("result", "success").timer().count()).isEqualTo(1);
    assertThat(registry.get("spring.integration.send").tag("name", "channel").tag("result", "success").timer().count()).isEqualTo(1);
    assertThat(registry.get("spring.integration.send").tag("name", "channel").tag("result", "failure").timer().count()).isEqualTo(1);
    assertThat(registry.get("spring.integration.send").tag("name", "eipMethod.handler").tag("result", "failure").timer().count()).isEqualTo(1);
    assertThat(registry.get("spring.integration.receive").tag("name", "queue").tag("result", "success").counter().count()).isEqualTo(1);
    assertThat(registry.get("spring.integration.send").tag("name", "nullChannel").tag("result", "success").timer().count()).isEqualTo(1);
    BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) this.context.getBeanFactory();
    beanFactory.registerBeanDefinition("newChannel", BeanDefinitionBuilder.genericBeanDefinition(DirectChannel.class).getRawBeanDefinition());
    DirectChannel newChannel = this.context.getBean("newChannel", DirectChannel.class);
    newChannel.setBeanName("newChannel");
    newChannel.subscribe(m -> {
    });
    newChannel.send(new GenericMessage<>("foo"));
    assertThat(registry.get("spring.integration.send").tag("name", "newChannel").tag("result", "success").timer().count()).isEqualTo(1);
}
Also used : GenericMessage(org.springframework.messaging.support.GenericMessage) MessagingException(org.springframework.messaging.MessagingException) DirectChannel(org.springframework.integration.channel.DirectChannel) BeanDefinitionRegistry(org.springframework.beans.factory.support.BeanDefinitionRegistry) SimpleMeterRegistry(io.micrometer.core.instrument.simple.SimpleMeterRegistry) MeterRegistry(io.micrometer.core.instrument.MeterRegistry) Test(org.junit.Test)

Example 87 with MessagingException

use of org.springframework.messaging.MessagingException in project spring-integration by spring-projects.

the class AsyncAmqpGatewayTests method testConfirmsAndReturns.

@Test
public void testConfirmsAndReturns() throws Exception {
    CachingConnectionFactory ccf = new CachingConnectionFactory("localhost");
    ccf.setPublisherConfirms(true);
    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);
    assertThat(returned, instanceOf(ErrorMessage.class));
    assertThat(returned.getPayload(), instanceOf(ReturnedAmqpMessageException.class));
    ReturnedAmqpMessageException payload = (ReturnedAmqpMessageException) returned.getPayload();
    assertEquals("fiz", payload.getFailedMessage().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);
    assertThat(returned, instanceOf(ErrorMessage.class));
    assertThat(returned.getPayload(), instanceOf(ReturnedAmqpMessageException.class));
    NackedAmqpMessageException nack = (NackedAmqpMessageException) ack.getPayload();
    assertEquals("buz", nack.getFailedMessage().getPayload());
    assertEquals("nacknack", nack.getNackReason());
    asyncTemplate.stop();
    receiver.stop();
    ccf.destroy();
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) QueueChannel(org.springframework.integration.channel.QueueChannel) MessagingException(org.springframework.messaging.MessagingException) SimpleMessageListenerContainer(org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer) AsyncRabbitTemplate(org.springframework.amqp.rabbit.AsyncRabbitTemplate) SettableListenableFuture(org.springframework.util.concurrent.SettableListenableFuture) DirectFieldAccessor(org.springframework.beans.DirectFieldAccessor) ErrorMessage(org.springframework.messaging.support.ErrorMessage) Mockito.spy(org.mockito.Mockito.spy) ReturnedAmqpMessageException(org.springframework.integration.amqp.support.ReturnedAmqpMessageException) Assert.assertThat(org.junit.Assert.assertThat) MessageBuilder(org.springframework.integration.support.MessageBuilder) BDDMockito.willReturn(org.mockito.BDDMockito.willReturn) AmqpReplyTimeoutException(org.springframework.amqp.core.AmqpReplyTimeoutException) RabbitMessageFuture(org.springframework.amqp.rabbit.AsyncRabbitTemplate.RabbitMessageFuture) BDDMockito.given(org.mockito.BDDMockito.given) CachingConnectionFactory(org.springframework.amqp.rabbit.connection.CachingConnectionFactory) BrokerRunning(org.springframework.amqp.rabbit.junit.BrokerRunning) MessageListenerAdapter(org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter) ReplyingMessageListener(org.springframework.amqp.rabbit.listener.adapter.ReplyingMessageListener) Message(org.springframework.messaging.Message) ClassRule(org.junit.ClassRule) RabbitTemplate(org.springframework.amqp.rabbit.core.RabbitTemplate) AfterClass(org.junit.AfterClass) ArgumentMatchers.startsWith(org.mockito.ArgumentMatchers.startsWith) Assert.assertNotNull(org.junit.Assert.assertNotNull) Assert.assertTrue(org.junit.Assert.assertTrue) Test(org.junit.Test) UUID(java.util.UUID) BDDMockito.willAnswer(org.mockito.BDDMockito.willAnswer) Matchers.instanceOf(org.hamcrest.Matchers.instanceOf) TimeUnit(java.util.concurrent.TimeUnit) CountDownLatch(java.util.concurrent.CountDownLatch) TestUtils(org.springframework.amqp.utils.test.TestUtils) NackedAmqpMessageException(org.springframework.integration.amqp.support.NackedAmqpMessageException) Rule(org.junit.Rule) Log4j2LevelAdjuster(org.springframework.integration.test.rule.Log4j2LevelAdjuster) BeanFactory(org.springframework.beans.factory.BeanFactory) Log(org.apache.commons.logging.Log) AmqpHeaders(org.springframework.amqp.support.AmqpHeaders) DirectChannel(org.springframework.integration.channel.DirectChannel) Assert.assertEquals(org.junit.Assert.assertEquals) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) Mockito.mock(org.mockito.Mockito.mock) SettableListenableFuture(org.springframework.util.concurrent.SettableListenableFuture) QueueChannel(org.springframework.integration.channel.QueueChannel) ErrorMessage(org.springframework.messaging.support.ErrorMessage) Message(org.springframework.messaging.Message) DirectChannel(org.springframework.integration.channel.DirectChannel) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) AmqpReplyTimeoutException(org.springframework.amqp.core.AmqpReplyTimeoutException) ReturnedAmqpMessageException(org.springframework.integration.amqp.support.ReturnedAmqpMessageException) BeanFactory(org.springframework.beans.factory.BeanFactory) NackedAmqpMessageException(org.springframework.integration.amqp.support.NackedAmqpMessageException) AsyncRabbitTemplate(org.springframework.amqp.rabbit.AsyncRabbitTemplate) RabbitTemplate(org.springframework.amqp.rabbit.core.RabbitTemplate) AsyncRabbitTemplate(org.springframework.amqp.rabbit.AsyncRabbitTemplate) Log(org.apache.commons.logging.Log) MessagingException(org.springframework.messaging.MessagingException) SimpleMessageListenerContainer(org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer) CountDownLatch(java.util.concurrent.CountDownLatch) MessageListenerAdapter(org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter) RabbitMessageFuture(org.springframework.amqp.rabbit.AsyncRabbitTemplate.RabbitMessageFuture) DirectFieldAccessor(org.springframework.beans.DirectFieldAccessor) CachingConnectionFactory(org.springframework.amqp.rabbit.connection.CachingConnectionFactory) ErrorMessage(org.springframework.messaging.support.ErrorMessage) Test(org.junit.Test)

Example 88 with MessagingException

use of org.springframework.messaging.MessagingException in project spring-integration by spring-projects.

the class AbstractMessageRouter method handleMessageInternal.

@Override
protected void handleMessageInternal(Message<?> message) {
    boolean sent = false;
    Collection<MessageChannel> results = this.determineTargetChannels(message);
    if (results != null) {
        int sequenceSize = results.size();
        int sequenceNumber = 1;
        for (MessageChannel channel : results) {
            final Message<?> messageToSend = !this.applySequence ? message : (this.getMessageBuilderFactory().fromMessage(message).pushSequenceDetails(message.getHeaders().getId(), sequenceNumber++, sequenceSize).build());
            if (channel != null) {
                try {
                    this.messagingTemplate.send(channel, messageToSend);
                    sent = true;
                } catch (MessagingException e) {
                    if (!this.ignoreSendFailures) {
                        throw e;
                    } else if (this.logger.isDebugEnabled()) {
                        this.logger.debug(e);
                    }
                }
            }
        }
    }
    if (!sent) {
        getDefaultOutputChannel();
        if (this.defaultOutputChannel != null) {
            this.messagingTemplate.send(this.defaultOutputChannel, message);
        } else {
            throw new MessageDeliveryException(message, "No channel resolved by router '" + this.getComponentName() + "' and no 'defaultOutputChannel' defined.");
        }
    }
}
Also used : MessageChannel(org.springframework.messaging.MessageChannel) MessagingException(org.springframework.messaging.MessagingException) MessageDeliveryException(org.springframework.messaging.MessageDeliveryException)

Example 89 with MessagingException

use of org.springframework.messaging.MessagingException in project spring-integration by spring-projects.

the class SimpleMessageStore method copy.

@Override
protected MessageGroup copy(MessageGroup group) {
    Object groupId = group.getGroupId();
    Lock lock = this.lockRegistry.obtain(groupId);
    try {
        lock.lockInterruptibly();
        try {
            MessageGroup simpleMessageGroup = getMessageGroupFactory().create(group.getMessages(), groupId, group.getTimestamp(), group.isComplete());
            simpleMessageGroup.setLastModified(group.getLastModified());
            simpleMessageGroup.setLastReleasedMessageSequenceNumber(group.getLastReleasedMessageSequenceNumber());
            return simpleMessageGroup;
        } finally {
            lock.unlock();
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new MessagingException("Interrupted while obtaining lock", e);
    }
}
Also used : MessagingException(org.springframework.messaging.MessagingException) Lock(java.util.concurrent.locks.Lock)

Example 90 with MessagingException

use of org.springframework.messaging.MessagingException in project spring-integration by spring-projects.

the class SimpleMessageStore method clearMessageGroup.

public void clearMessageGroup(Object groupId) {
    Lock lock = this.lockRegistry.obtain(groupId);
    try {
        lock.lockInterruptibly();
        try {
            MessageGroup group = this.groupIdToMessageGroup.get(groupId);
            Assert.notNull(group, "MessageGroup for groupId '" + groupId + "' " + "can not be located while attempting to complete the MessageGroup");
            group.clear();
            group.setLastModified(System.currentTimeMillis());
            UpperBound upperBound = this.groupToUpperBound.get(groupId);
            Assert.state(upperBound != null, "'upperBound' must not be null.");
            upperBound.release(this.groupCapacity);
        } finally {
            lock.unlock();
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new MessagingException("Interrupted while obtaining lock", e);
    }
}
Also used : MessagingException(org.springframework.messaging.MessagingException) UpperBound(org.springframework.integration.util.UpperBound) Lock(java.util.concurrent.locks.Lock)

Aggregations

MessagingException (org.springframework.messaging.MessagingException)143 Test (org.junit.Test)60 IOException (java.io.IOException)25 Message (org.springframework.messaging.Message)23 QueueChannel (org.springframework.integration.channel.QueueChannel)22 ErrorMessage (org.springframework.messaging.support.ErrorMessage)21 CountDownLatch (java.util.concurrent.CountDownLatch)17 BeanFactory (org.springframework.beans.factory.BeanFactory)15 MessageChannel (org.springframework.messaging.MessageChannel)15 MessageHandlingException (org.springframework.messaging.MessageHandlingException)15 GenericMessage (org.springframework.messaging.support.GenericMessage)15 MessageHandler (org.springframework.messaging.MessageHandler)14 File (java.io.File)12 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)12 Matchers.containsString (org.hamcrest.Matchers.containsString)12 DirectChannel (org.springframework.integration.channel.DirectChannel)12 ArrayList (java.util.ArrayList)11 PollableChannel (org.springframework.messaging.PollableChannel)11 Lock (java.util.concurrent.locks.Lock)8 MessageDeliveryException (org.springframework.messaging.MessageDeliveryException)8