[英]Java: Azure Service Bus Queue Receiving messsages with sessions
我正在用 Java 编写代码(使用 Azure SDK for Java),我有一个包含会话消息的服务总线队列。 我想接收这些消息并将它们处理到另一个地方。
我使用 QueueClient 连接到队列,然后使用 registerSessionHandler 处理消息(下面的代码)。
问题是,每当收到一条消息时,我都可以打印有关它的所有详细信息,包括内容,但它会打印 10 次,每次打印后都会打印一个异常。 (打印 10 次:我理解这是因为在将消息抛出到死信队列并转到下一条消息之前有 10 次重试策略。)
例外说
> USERCALLBACK-Receiver not created. Registering a MessageHandler creates a receiver.
但我确信 SessionHandler 与 MessageHandler 做同样的事情,但包括对会话的支持,因此它应该创建一个接收器,因为它接收消息。 我曾尝试使用 MessageHandler 但它甚至无法工作并停止整个程序,因为它不支持会话消息,而我收到的消息有会话。
我的问题是了解 Exception 想要我做什么,以及如何修复代码使其不会给我任何异常? 有没有人有关于如何改进代码的建议? 或其他做同样事情的方法?
QueueClient qc = new QueueClient(
new ConnectionStringBuilder(connectionString),
ReceiveMode.PEEKLOCK);
qc.registerSessionHandler(
new ISessionHandler() {
@Override
public CompletableFuture<Void> onMessageAsync(IMessageSession messageSession, IMessage message) {
System.out.printf(
"\nMessage received: " +
"\n --> MessageId = %s " +
"\n --> SessionId = %s" +
"\n --> Content Type = %s" +
"\n --> Content = \n\t\t %s",
message.getMessageId(),
messageSession.getSessionId(),
message.getContentType(),
getMessageContent(message)
);
return qc.completeAsync(message.getLockToken());
}
@Override
public CompletableFuture<Void> OnCloseSessionAsync(IMessageSession iMessageSession) {
return CompletableFuture.completedFuture(null);
}
@Override
public void notifyException(Throwable throwable, ExceptionPhase exceptionPhase) {
System.out.println("\n Exception " + exceptionPhase + "-" + throwable.getMessage());
}
},
new SessionHandlerOptions(1, true, Duration.ofMinutes(1)),
Executors.newSingleThreadExecutor()
);
(getMessageContent(message) 方法是一个单独的方法,对于那些有兴趣的人:)
public String getMessageContent(IMessage message){
List<byte[]> content = message.getMessageBody().getBinaryData();
StringBuilder sb = new StringBuilder();
for (byte[] b : content) {
sb.append(new String(b)
);
}
return sb.toString();
}
对于那些想知道的人,我设法解决了这个问题!
它只是通过使用 Azure Functions ServiceBusQueueTrigger 完成的,然后它会监听服务总线队列并处理消息。 通过将 isSessionsEnabled 设置为 true,它将根据需要接受会话消息:)
所以现在代码看起来像这样,而不是写 100 多行代码:
public class Function {
@FunctionName("QueueFunction")
public void run(
@ServiceBusQueueTrigger(
name = "TriggerName", //Any name you choose
queueName = "queueName", //QueueName from the portal
connection = "ConnectionString", //ConnectionString from the portal
isSessionsEnabled = true
) String message,
ExecutionContext context
) {
// Write the code you want to do with the message here
// Using the variable messsage which contains the messageContent, messageId, sessionId etc.
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.