- Add the Codota plugin to your IDE and get smart completions
private void myMethod () {Charset c =
String charsetName;Charset.forName(charsetName)
Charset.defaultCharset()
ContentType contentType;contentType.getCharset()
- Smart code suggestions by Codota
}
private String processStackTrace(Throwable cause) { String stackTraceAsString = getStackTraceAsString(cause); if (this.maxStackTraceLength < 0) { int maxStackTraceLen = RabbitUtils .getMaxFrame(((RabbitTemplate) this.errorTemplate).getConnectionFactory()); if (maxStackTraceLen > 0) { maxStackTraceLen -= this.frameMaxHeadroom; this.maxStackTraceLength = maxStackTraceLen; } } if (this.maxStackTraceLength > 0 && stackTraceAsString.length() > this.maxStackTraceLength) { stackTraceAsString = stackTraceAsString.substring(0, this.maxStackTraceLength); this.logger.warn("Stack trace in republished message header truncated due to frame_max limitations; " + "consider increasing frame_max on the broker or reduce the stack trace depth", cause); } return stackTraceAsString; }
/** * Apply a prefix to the outbound routing key, which will be prefixed to the original message * routing key (if no explicit routing key was provided in the constructor; ignored otherwise. * Use an empty string ("") for no prefixing. * @param errorRoutingKeyPrefix The prefix (default "error."). * @return this. */ public RepublishMessageRecoverer errorRoutingKeyPrefix(String errorRoutingKeyPrefix) { this.setErrorRoutingKeyPrefix(errorRoutingKeyPrefix); return this; }
MessageProperties messageProperties = message.getMessageProperties(); Map<String, Object> headers = messageProperties.getHeaders(); String stackTraceAsString = processStackTrace(cause); headers.put(X_EXCEPTION_STACKTRACE, stackTraceAsString); headers.put(X_EXCEPTION_MESSAGE, cause.getCause() != null ? cause.getCause().getMessage() : cause.getMessage()); headers.put(X_ORIGINAL_EXCHANGE, messageProperties.getReceivedExchange()); headers.put(X_ORIGINAL_ROUTING_KEY, messageProperties.getReceivedRoutingKey()); Map<? extends String, ? extends Object> additionalHeaders = additionalHeaders(message, cause); if (additionalHeaders != null) { headers.putAll(additionalHeaders); : this.prefixedOriginalRoutingKey(message); this.errorTemplate.send(this.errorExchangeName, routingKey, message); if (this.logger.isWarnEnabled()) { final String routingKey = this.prefixedOriginalRoutingKey(message); this.errorTemplate.send(routingKey, message); if (this.logger.isWarnEnabled()) {
@Test public void shouldPublishWithRoutingKeyPrefixedWithErrorWhenExchangeIsNotSet() { recoverer = new RepublishMessageRecoverer(amqpTemplate); recoverer.recover(message, cause); verify(amqpTemplate).send("error.some.key", message); }
@Test public void setDeliveryModeIfNull() { this.message.getMessageProperties().setDeliveryMode(null); this.recoverer = new RepublishMessageRecoverer(amqpTemplate, "error"); this.recoverer.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT); recoverer.recover(this.message, this.cause); assertEquals(MessageDeliveryMode.NON_PERSISTENT, this.message.getMessageProperties().getDeliveryMode()); }
@Test public void testWithRepublishRecovererCustomExchangeAndDefaultRoutingCustomPrefix() throws Throwable { AmqpTemplate amqpTemplate = mock(AmqpTemplate.class); RetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateless() .recoverer(new RepublishMessageRecoverer(amqpTemplate, "baz").errorRoutingKeyPrefix("bar.")) .build(); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder.withBody("".getBytes()).setReceivedRoutingKey("foo").build(); delegate.onMessage("", message); assertEquals(3, count.get()); verify(amqpTemplate).send("baz", "bar.foo", message); }
@Test public void testWithRepublishRecovererExplicitExchangeAndRouting() throws Throwable { AmqpTemplate amqpTemplate = mock(AmqpTemplate.class); RetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateless() .recoverer(new RepublishMessageRecoverer(amqpTemplate, "bar", "baz")) .build(); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder.withBody("".getBytes()).build(); delegate.onMessage("", message); assertEquals(3, count.get()); verify(amqpTemplate).send("bar", "baz", message); }
@Test public void shouldRemapDeliveryMode() { message.getMessageProperties().setDeliveryMode(null); message.getMessageProperties().setReceivedDeliveryMode(MessageDeliveryMode.PERSISTENT); recoverer = new RepublishMessageRecoverer(amqpTemplate, "error") { protected Map<? extends String, ? extends Object> additionalHeaders(Message message, Throwable cause) { message.getMessageProperties().setDeliveryMode(message.getMessageProperties().getReceivedDeliveryMode()); return null; } }; recoverer.recover(message, cause); assertEquals(MessageDeliveryMode.PERSISTENT, message.getMessageProperties().getDeliveryMode()); }
MessageProperties messageProperties = message.getMessageProperties(); Map<String, Object> headers = messageProperties.getHeaders(); String stackTraceAsString = processStackTrace(cause); headers.put(X_EXCEPTION_STACKTRACE, stackTraceAsString); headers.put(X_EXCEPTION_MESSAGE, cause.getCause() != null ? cause.getCause().getMessage() : cause.getMessage()); headers.put(X_ORIGINAL_EXCHANGE, messageProperties.getReceivedExchange()); headers.put(X_ORIGINAL_ROUTING_KEY, messageProperties.getReceivedRoutingKey()); Map<? extends String, ? extends Object> additionalHeaders = additionalHeaders(message, cause); if (additionalHeaders != null) { headers.putAll(additionalHeaders); : this.prefixedOriginalRoutingKey(message); this.errorTemplate.send(this.errorExchangeName, routingKey, message); if (this.logger.isWarnEnabled()) { final String routingKey = this.prefixedOriginalRoutingKey(message); this.errorTemplate.send(routingKey, message); if (this.logger.isWarnEnabled()) {
@Test public void shouldPublishWithSetErrorRoutingKeyWhenExchangeAndErrorRoutingKeyProvided() { recoverer = new RepublishMessageRecoverer(amqpTemplate, "errorExchange", "errorRoutingKey"); recoverer.recover(message, cause); verify(amqpTemplate).send("errorExchange", "errorRoutingKey", message); }
@Test public void testWithRepublishRecovererDefaultExchangeAndRoutingCustomPrefix() throws Throwable { AmqpTemplate amqpTemplate = mock(AmqpTemplate.class); RetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateless() .recoverer(new RepublishMessageRecoverer(amqpTemplate).errorRoutingKeyPrefix("bar.")) .build(); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder.withBody("".getBytes()).setReceivedRoutingKey("foo").build(); delegate.onMessage("", message); assertEquals(3, count.get()); verify(amqpTemplate).send("bar.foo", message); }
@Test public void shouldPublishToProvidedExchange() { recoverer = new RepublishMessageRecoverer(amqpTemplate, "error"); recoverer.recover(message, cause); verify(amqpTemplate).send("error", "error.some.key", message); }
/** * Apply a prefix to the outbound routing key, which will be prefixed to the original message * routing key (if no explicit routing key was provided in the constructor; ignored otherwise. * Use an empty string ("") for no prefixing. * @param errorRoutingKeyPrefix The prefix (default "error."). * @return this. */ public RepublishMessageRecoverer errorRoutingKeyPrefix(String errorRoutingKeyPrefix) { this.setErrorRoutingKeyPrefix(errorRoutingKeyPrefix); return this; }
private String processStackTrace(Throwable cause) { String stackTraceAsString = getStackTraceAsString(cause); if (this.maxStackTraceLength < 0) { int maxStackTraceLen = RabbitUtils .getMaxFrame(((RabbitTemplate) this.errorTemplate).getConnectionFactory()); if (maxStackTraceLen > 0) { maxStackTraceLen -= this.frameMaxHeadroom; this.maxStackTraceLength = maxStackTraceLen; } } if (this.maxStackTraceLength > 0 && stackTraceAsString.length() > this.maxStackTraceLength) { stackTraceAsString = stackTraceAsString.substring(0, this.maxStackTraceLength); this.logger.warn("Stack trace in republished message header truncated due to frame_max limitations; " + "consider increasing frame_max on the broker or reduce the stack trace depth", cause); } return stackTraceAsString; }
@Test public void shouldIncludeTheStacktraceInTheHeaderOfThePublishedMessage() { recoverer = new RepublishMessageRecoverer(amqpTemplate); ByteArrayOutputStream baos = new ByteArrayOutputStream(); cause.printStackTrace(new PrintStream(baos)); final String expectedHeaderValue = baos.toString(); recoverer.recover(message, cause); assertEquals(expectedHeaderValue, message.getMessageProperties().getHeaders().get("x-exception-stacktrace")); }
@Test public void shouldIncludeTheCauseMessageInTheHeaderOfThePublishedMessage() { recoverer = new RepublishMessageRecoverer(amqpTemplate); recoverer.recover(message, cause); assertEquals(cause.getCause().getMessage(), message.getMessageProperties().getHeaders().get("x-exception-message")); }
@Test public void shouldSetTheOriginalMessageExchangeOnInTheHeaders() { message.getMessageProperties().setReceivedExchange("the.original.exchange"); recoverer = new RepublishMessageRecoverer(amqpTemplate, "error"); recoverer.recover(message, cause); assertEquals("the.original.exchange", message.getMessageProperties().getHeaders().get("x-original-exchange")); }