我使用Kafka消息代理和Spring Kafka。
我使用默认的自动确认模型。有时我的update.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
using (datademoEntities db = new datademoEntities())
{
var query = from tbl in db.demotables select new{tbl.Id, tbl.FirstName, tbl.gender, tbl.PhoneNumber, tbl.Role};
ddlupdate.DataSource = query.ToList();
ddlupdate.DataTextField = "FirstName";
ddlupdate.DataValueField = "id";
ddlupdate.DataBind();
ddlupdate.Items.Insert(0, new ListItem("select"));
} }
}
static int did;
protected void ddlupdate_SelectedIndexChanged(object sender,
EventArgs e)
{
did = int.Parse(ddlupdate.SelectedValue);
using (datademoEntities db = new datademoEntities())
{
var query = (from tbl in db.demotables
where tbl.Id == did
select tbl).First();
txtname.Text = query.FirstName;
rbgender.DataTextField = query.gender;
txtphone.Text = query.PhoneNumber.ToString();
}
}
protected void btnupdate_Click(object sender, EventArgs e)
{
string dname = txtname.Text;
int dphone = int.Parse(txtphone.Text);
using (datademoEntities db = new datademoEntities())
{
demotable tbl = (from row in db.demotables
where
row.Id==did
select row).First();
tbl.FirstName = dname;
tbl.PhoneNumber = dphone;
db.SaveChanges();
Response.AddHeader("Refresh", "3;url.display.aspx");
}
}
}
}
display.aspx.cs
public partial class display : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
datademoEntities db = new datademoEntities();
var query = (from tbl in db.demotables select tbl).ToList();
GridView1.DataSource = query;
GridView1.DataBind();
}
}
}
INSERT.apx.cs
protected void btnsubmit_Click(object sender, EventArgs e)
{
datademoEntities dm = new datademoEntities();
string dname = txtname.Text;
string drole = ddlrole.SelectedValue;
string dphone = txtphone.Text;
string dgender = rbgender.SelectedValue;
demotable tbl = new demotable();
tbl.FirstName = dname;
tbl.Role = drole;
tbl.PhoneNumber = Convert.ToInt32(dphone);
tbl.gender = dgender;
dm.demotables.Add(tbl);
dm.SaveChanges();
需要约5分钟才能完成工作。
我注意到,当它发生时,Kafka会产生重复的消息。 是否有任何超时属性可以配置以防止Kafka重复相同的消息并让生产者等待(至少例如10分钟)而消费者将完成工作?
答案 0 :(得分:2)
生产者和消费者脱钩 - 没有办法阻止生产者发送更多消息,因为消费者很慢。
默认情况下,我没有明确使用auto.com。我使用默认的Spring配置
"main@1" prio=5 tid=0x1 nid=NA runnable
java.lang.Thread.State: RUNNABLE
at org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice.evaluateSuccessExpression(ExpressionEvaluatingRequestHandlerAdvice.java:241)
at org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice.doInvoke(ExpressionEvaluatingRequestHandlerAdvice.java:214)
at org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice.invoke(AbstractRequestHandlerAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy81.handleRequestMessage(Unknown Source:-1)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.doInvokeAdvisedRequestHandler(AbstractReplyProducingMessageHandler.java:127)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:112)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105)
at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:143)
at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:135)
at org.springframework.integration.gateway.MessagingGatewaySupport.send(MessagingGatewaySupport.java:392)
at org.springframework.integration.gateway.GatewayProxyFactoryBean.invokeGatewayMethod(GatewayProxyFactoryBean.java:481)
at org.springframework.integration.gateway.GatewayProxyFactoryBean.doInvoke(GatewayProxyFactoryBean.java:433)
at org.springframework.integration.gateway.GatewayProxyFactoryBean.invoke(GatewayProxyFactoryBean.java:424)
at org.springframework.integration.gateway.GatewayCompletableFutureProxyFactoryBean.invoke(GatewayCompletableFutureProxyFactoryBean.java:65)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy87.upload(Unknown Source:-1)
为auto.commit
(在Kafka客户端中),因此spring下的默认行为是客户端执行自己的提交而不是容器。将其设置为true
并将容器属性false
设置为AckMode
,以便在侦听器退出后执行提交。
有kafka consumer property RECORD
,默认为5分钟(300000)。
使用消费者群组管理时poll()调用之间的最大延迟。这为消费者在获取更多记录之前可以闲置的时间量设置了上限。如果在此超时到期之前未调用poll(),则认为使用者失败,并且该组将重新平衡以便将分区重新分配给另一个成员。
重新平衡将导致重新发送。您可以增加该属性以避免重新平衡。
正如我所说,日志通常有帮助;您应该会在日志中看到重新平衡。