我有一个Spring-Cloud-Streams客户端,它从一个由多个分区组成的Kakfa主题中读取。客户端为读取的每个Kafka消息调用一个Web服务。如果几次重试后Web服务不可用,我想阻止用户从Kafka读取。参考上一个Stackoverflow问题(Spring cloud stream kafka pause/resume binders),我自动连接了 BindingsEndpoint ,并调用 changeState()方法以尝试停止使用方,但日志显示该使用方正在继续在调用 changeState()后从Kafka中读取消息。
我正在使用Spring Boot版本2.1.2.RELEASE和Spring Cloud版本Greenwich.RELEASE。 spring-cloud-stream-binder-kafka的托管版本是2.1.0.RELEASE。我已经设置了属性autoCommitOffset = true和autoCommitOnError = false。
下面是我的代码段。有什么我想念的吗? changeState()的第一个输入参数应该是主题名称吗?
如果我希望使用者应用程序在Web服务不可用时退出,是否可以简单地执行System.exit()而不需要先停止使用者?
@Autowired
private BindingsEndpoint bindingsEndpoint;
...
...
@StreamListener(MyInterface.INPUT)
public void read(@Payload MyDTO dto,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic,
@Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition,
@Header(KafkaHeaders.CONSUMER) Consumer<?, ?> consumer) {
try {
logger.info("Processing message "+dto);
process(dto); // this is the method that calls the webservice
} catch (Exception e) {
if (e instanceof IllegalStateException || e instanceof ConnectException) {
bindingsEndpoint.changeState("my.topic.name",
BindingsEndpoint.State.STOPPED);
// Binding<?> b = bindingsEndpoint.queryState("my.topic.name"); ==> Using topic name returns a valid Binding object
}
e.printStackTrace();
throw (e);
}
}
答案 0 :(得分:1)
您可以利用Binding visualization and control功能来实现此目的,在该功能中,您可以可视化以及停止/开始/暂停/恢复绑定。
还知道using System;
using Prism.Commands;
namespace TestWpfApplication
{
internal class Student
{
DelegateCommand selectCommand;
public string Type => "Student";
public string FullName => "My name is student";
public DelegateCommand SelectCommand
{
get => selectCommand ?? (selectCommand = new DelegateCommand(Select, CanSelect));
}
public bool CanSelect()
{
return false;
}
public void Select()
{
Console.WriteLine("Student Clicked");
}
}
}
将关闭整个JVM吗?
答案 1 :(得分:-1)
有同样的问题,changeState()的第一个输入参数应该是绑定名称。对我有用