gpt4 book ai didi

java - Apache Camel JMS 组件 : bridgeErrorHandler does not work as documented

转载 作者:行者123 更新时间:2023-12-02 09:24:49 26 4
gpt4 key购买 nike

问题

嗨,我尝试使用标志 bridgeErrorHandler=true 将错误处理从 JMS 使用者桥接到我的 Camel 路由的错误处理程序(该路由是一个 DLC),但是当我使用消息时发生的 JMSException 永远不会由 DLC ErrorHandler 处理,而是由 DefaultSpringErrorHandler 处理,因此仅被记录和忽略。

在我的 DLC 中,我配置了当发生异常时应该执行额外的步骤,但现在遗憾的是这些步骤被忽略了。 也许你可以告诉我我做错了什么?

详细信息如下:

项目设置

我正在使用:

  • spring-boot:2.1.0.RELEASE
  • Apache Camel :2.23.3
  • Camel -jms-starter:2.23.3

路线:

@Component
public class BridgeErrorHandlerTestQuellRoute extends RouteBuilder{

private static final String ROUTE_ALIAS = "BridgeErrorHandlerTestQuellRoute";

public static final String ENDPOINT_QUELLE = "{{BridgeErrorHandlerTestQuelle}}";

@Override
public void configure() {
errorHandler(deadLetterChannel(DLCRoute.ENDPOINT_DLC));

// @formatter:off
from(ENDPOINT_QUELLE).routeId(ROUTE_ALIAS)
.removeHeaders("*", "JMS*") // Entfernt alle nicht notwendigen JMS-Header
.log(INFO, log, "Start Route: ${routeId}")
.to("mock:mymock")
.log(INFO, log, "Ende Route: ${routeId}")
// @formatter:on
}
}

配置:

端点本身是在application.properties中定义的(不过我必须更改主题名称):

topic.props=subscriptionShared=true&\
transacted=true&\
recoveryInterval=-1&\
connectionFactory=#connectionFactory&\
bridgeErrorHandler=true

BridgeErrorHandlerTestQuelle=jms:topic:IBMMQSERVER/AT/ALL/MYTOPIC?durableSubscriptionName=BridgeErrorHandlerTest.bridgeerrorhandlertest&${topic.props}

连接工厂 bean

连接工厂用于 IBM MQ:

    @Bean
public ConnectionFactory connectionFactory() {
try {
MQConnectionFactory factory = new MQConnectionFactory();
factory.setHostName(properties.getHost());
factory.setPort(properties.getPort());
factory.setQueueManager(properties.getQueueManager());
factory.setChannel(properties.getChannel());
factory.setStringProperty(WMQConstants.USERID, properties.getUser());
factory.setStringProperty(WMQConstants.PASSWORD, properties.getPassword());
factory.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
return factory;
} catch (JMSException e) {
throw new RuntimeException(e);
}
}

异常

异常发生在:com.ibm.msg.client.wmq.common.internal.WMQUtils#computeTextFromBytes(byte[], int, int, com.ibm.mq.jmqi.system.JmqiCodepage) 并且是一个 >详细的JMSException

WARN  EndpointMessageListener        : Execution of JMS message listener failed. Caused by: [org.apache.camel.RuntimeCamelException - Failed to extract body due to: com.ibm.msg.client.jms.DetailedJMSException: JMSCMQ1049: Mit dem Zeichensatz '1208(UTF-8) Unmappable Action: REPORT Unmappable Replacement: 63' kann die Zeichenfolge '[B@22b4f934' gar nicht oder nur teilweise konvertiert werden.
Es wurde versucht, Zeichenfolgedaten mit einem Zeichensatz zu versenden bzw. zu empfangen, der den Inhalt der Zeichenfolge nicht umsetzen kann.
Codieren Sie eine Nachricht nur mit einem Zeichensatz, von dem bekannt ist, dass er für die zu übertragenden Zeichenfolgedaten geeignet ist.. Message:
[removed due to sensitive details]
org.apache.camel.RuntimeCamelException: Failed to extract body due to: com.ibm.msg.client.jms.DetailedJMSException: JMSCMQ1049: Mit dem Zeichensatz '1208(UTF-8) Unmappable Action: REPORT Unmappable Replacement: 63' kann die Zeichenfolge '[B@22b4f934' gar nicht oder nur teilweise konvertiert werden.
Es wurde versucht, Zeichenfolgedaten mit einem Zeichensatz zu versenden bzw. zu empfangen, der den Inhalt der Zeichenfolge nicht umsetzen kann.
Codieren Sie eine Nachricht nur mit einem Zeichensatz, von dem bekannt ist, dass er für die zu übertragenden Zeichenfolgedaten geeignet ist.. Message:
[removed due to sensitive details]
at org.apache.camel.component.jms.JmsBinding.extractBodyFromJms(JmsBinding.java:176)
at org.apache.camel.component.jms.JmsMessage.createBody(JmsMessage.java:227)
at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:54)
at org.apache.camel.component.bean.AbstractBeanProcessor.process(AbstractBeanProcessor.java:132)
at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:53)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)
at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:113)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:736)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:696)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:245)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1179)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1076)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.ibm.msg.client.jms.DetailedJMSException: JMSCMQ1049: Mit dem Zeichensatz '1208(UTF-8) Unmappable Action: REPORT Unmappable Replacement: 63' kann die Zeichenfolge '[B@22b4f934' gar nicht oder nur teilweise konvertiert werden.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:319)
at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:226)
at com.ibm.msg.client.wmq.common.internal.WMQUtils.computeTextFromBytes(WMQUtils.java:382)
at com.ibm.msg.client.wmq.common.internal.WMQUtils.computeTextFromByteBuffer(WMQUtils.java:421)
at com.ibm.msg.client.wmq.common.internal.messages.WMQTextMessage.getText(WMQTextMessage.java:240)
at com.ibm.msg.client.jms.internal.JmsTextMessageImpl.getText(JmsTextMessageImpl.java:205)
at com.ibm.jms.JMSTextMessage.getText(JMSTextMessage.java:124)
at org.apache.camel.component.jms.JmsBinding.extractBodyFromJms(JmsBinding.java:161)
... 22 common frames omitted
Caused by: java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:816)
at com.ibm.mq.jmqi.system.JmqiCodepage.bytesToString(JmqiCodepage.java:745)
at com.ibm.msg.client.wmq.common.internal.WMQUtils.computeTextFromBytes(WMQUtils.java:375)
... 27 common frames omitted

最佳答案

好的,我们正在为 Camel 3 改进这一点,您可以在其中打开 eagerLoadingOfProperties(组件级别或每个端点),然后将检测到此类 JMS 负载错误,并使用异常消息设置消息正文;您可以配置的内容,以及在 Exchange 上引起的异常。这允许 Camel 的路由错误处理程序将此检测为异常并路由到死信 channel 。

查看 JIRA 票证:https://issues.apache.org/jira/browse/CAMEL-14083

关于java - Apache Camel JMS 组件 : bridgeErrorHandler does not work as documented,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58407987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com