Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何配置DefaultMessageListenerContainer,使其仅在MessageListener确认消息时提交消息?_Java_Apache Kafka_Jms_Spring Jms - Fatal编程技术网

Java 如何配置DefaultMessageListenerContainer,使其仅在MessageListener确认消息时提交消息?

Java 如何配置DefaultMessageListenerContainer,使其仅在MessageListener确认消息时提交消息?,java,apache-kafka,jms,spring-jms,Java,Apache Kafka,Jms,Spring Jms,我们有一个JavaSpring应用程序,它从JMS队列读取消息,然后将它们写入Kafka。目前,它有两个Java类来管理连接和会话。我们计划用Spring的DefaultMessageListenerContainer替换这些东西 我们希望我们的MessageListener在成功地将消息发送到卡夫卡后确认这些消息。如果在向Kafka发送消息时引发任何异常(例如,连接相关或超时),我们的MessageListener将不会确认此消息,因此此消息不应提交,应保留在队列中 我们使用以下配置测试了代码

我们有一个JavaSpring应用程序,它从JMS队列读取消息,然后将它们写入Kafka。目前,它有两个Java类来管理连接和会话。我们计划用Spring的
DefaultMessageListenerContainer
替换这些东西

我们希望我们的
MessageListener
在成功地将消息发送到卡夫卡后确认这些消息。如果在向Kafka发送消息时引发任何异常(例如,连接相关或超时),我们的
MessageListener
将不会确认此消息,因此此消息不应提交,应保留在队列中

我们使用以下配置测试了代码:

public DefaultMessageListenerContainer DefaultMessageListenerContainer(ConnectionFactory ConnectionFactory,MessageListener jmsMessageListener)抛出URI语法异常{
DefaultMessageListenerContainer messageListenerContainer=新建DefaultMessageListenerContainer();
messageListenerContainer.setConnectionFactory(connectionFactory);
messageListenerContainer.setDestinationName(“queueName”);
setMessageListener(jmsMessageListener);
messageListenerContainer.setConcurrency(“1-1”);
messageListenerContainer.SetSessionTransactived(true);
messageListenerContainer.setErrorHandler(新的JmsContainerErrorHandler());
messageListenerContainer.SetSessionAcknowledgeMemodeName(“客户端确认”);
返回消息ListenerContainer;
}
使用这段代码,我启动了我们的应用程序,关闭Kafka代理,然后在JMS队列上放置了一条消息。此消息已被应用程序读取,但应用程序无法在卡夫卡上发送并尝试与卡夫卡建立连接。我看到消息出现在队列上。我开始了卡夫卡经纪人。已建立从应用程序到Kafka的连接,应用程序尝试在Kafka上发送消息,但失败,出现
TimeOutException
。我回去查看队列上的消息,但它不在那里。在本例中,我们的
MessageListener
甚至没有确认此消息。在这种情况下,我们希望消息应该保留在队列中


知道我们的
DefaultMessageListenerContainer
配置有什么问题吗

卡夫卡是异步的;在让容器线程退出侦听器之前,需要等待发送结果。显示您的侦听器代码。根据您在此处的描述,您似乎关心JMS代理和Kafka之间数据的完整性。然而,即使您在这里得到了问题的答案,仍然会有一个时间窗口,它会破坏您数据的完整性。在卡夫卡消息成功发送到
MessageListener
确认期间,
MessageListener
应用程序可能会失败(例如硬件崩溃、断电等)。如果发生这种情况,那么消息将出现在Kafka和JMS代理上,最终会在Kafka上出现重复消息。