Java 通过订阅从Azure服务总线接收消息

Java 通过订阅从Azure服务总线接收消息,java,azureservicebus,azure-servicebus-topics,azure-servicebus-subscriptions,Java,Azureservicebus,Azure Servicebus Topics,Azure Servicebus Subscriptions,我提到通过订阅从我的Azure服务总线接收消息 我可以接收消息,但我会持续接收消息,直到手动终止程序 我有一个超时选项,只想在超时之前接收消息 如果您能解释下面的代码是如何工作的,以及我如何修改下面的代码以接收特定时间范围内的消息,并在达到超时后停止接收,这将非常有帮助 static void registerMessageHandlerOnClient(SubscriptionClient receiveClient, ExecutorService executorService) thro

我提到通过订阅从我的Azure服务总线接收消息

我可以接收消息,但我会持续接收消息,直到手动终止程序

我有一个超时选项,只想在超时之前接收消息

如果您能解释下面的代码是如何工作的,以及我如何修改下面的代码以接收特定时间范围内的消息,并在达到超时后停止接收,这将非常有帮助

static void registerMessageHandlerOnClient(SubscriptionClient receiveClient, ExecutorService executorService) throws Exception {
    // register the RegisterMessageHandler callback
    receiveClient.registerMessageHandler(
            new IMessageHandler() {
                // callback invoked when the message handler loop has obtained a message
                public CompletableFuture<Void> onMessageAsync(IMessage message) {
                    // receives message is passed to callback
                    if (message.getLabel() != null &&
                            message.getContentType() != null &&
                            message.getLabel().contentEquals("Scientist") &&
                            message.getContentType().contentEquals("application/json")) {

                        byte[] body = message.getBody();
                        Map scientist = GSON.fromJson(new String(body, UTF_8), Map.class);

                        System.out.printf(
                                "\n\t\t\t\t%s Message received: \n\t\t\t\t\t\tMessageId = %s, \n\t\t\t\t\t\tSequenceNumber = %s, \n\t\t\t\t\t\tEnqueuedTimeUtc = %s," +
                                        "\n\t\t\t\t\t\tExpiresAtUtc = %s, \n\t\t\t\t\t\tContentType = \"%s\",  \n\t\t\t\t\t\tContent: [ firstName = %s, name = %s ]\n",
                                receiveClient.getEntityPath(),
                                message.getMessageId(),
                                message.getSequenceNumber(),
                                message.getEnqueuedTimeUtc(),
                                message.getExpiresAtUtc(),
                                message.getContentType(),
                                scientist != null ? scientist.get("firstName") : "",
                                scientist != null ? scientist.get("name") : "");
                    }
                    return receiveClient.completeAsync(message.getLockToken());
                }

                // callback invoked when the message handler has an exception to report
                public void notifyException(Throwable throwable, ExceptionPhase exceptionPhase) {
                    System.out.printf(exceptionPhase + "-" + throwable.getMessage());
                }
            },
            // 1 concurrent call, messages are auto-completed, auto-renew duration
            new MessageHandlerOptions(1, false, Duration.ofMinutes(1)),
            executorService);
}
static void registerMessageHandlerOnClient(SubscriptionClient receiveClient,ExecutorService ExecutorService)引发异常{
//注册RegisterMessageHandler回调
receiveClient.registerMessageHandler(
新的IMessageHandler(){
//当消息处理程序循环获得消息时调用回调
公共CompletableFuture onMessageAsync(IMessage消息){
//接收传递给回调函数的消息
如果(message.getLabel()!=null&&
message.getContentType()!=null&&
message.getLabel().contentEquals(“科学家”)&&
message.getContentType().contentEquals(“应用程序/json”)){
byte[]body=message.getBody();
Map scientist=GSON.fromJson(新字符串(body,UTF_8),Map.class);
System.out.printf(
\n\t\t\t\t%s收到的消息:\n\t\t\t\t\t消息ID=%s\n\t\t\t\t\t序列号=%s\n\t\t\t\t\tQueuedTimeUTC=%s+
“\n\t\t\t\t\t\t\texpiresautc=%s,\n\t\t\t\t\t内容类型=\%s\,\n\t\t\t\t\t内容:[名字=%s,名字=%s]\n”,
receiveClient.getEntityPath(),
message.getMessageId(),
message.getSequenceNumber(),
message.getEnqueuedTimeUtc(),
message.getExpiresAuthc(),
message.getContentType(),
科学家!=null?科学家。获取(“名字”):“”,
科学家!=null?科学家。获取(“名称”):“”;
}
返回receiveClient.completeAsync(message.getLockToken());
}
//当消息处理程序有异常要报告时调用回调
公共无效notifyException(可丢弃可丢弃,ExceptionPhase ExceptionPhase){
System.out.printf(exceptionPhase+“-”+throwable.getMessage());
}
},
//1个并发呼叫,消息自动完成,自动续订持续时间
新MessageHandlerOptions(1,false,持续时间为分钟(1)),
执行人服务);
}

这不能在订阅代码中完成

您可以执行两个选项/解决方法

  • 不要不断地向主题发送信息,在那里控制时间
  • 创建一个REST API调用以使
    EntityStatus
    =
    ReceiveDisabled
    ,并使用类似的函数使
    EntityStatus
    =
    处于活动状态

    • 这不能在您的订阅代码中完成

      您可以执行两个选项/解决方法

      • 不要不断地向主题发送信息,在那里控制时间
      • 创建一个REST API调用以使
        EntityStatus
        =
        ReceiveDisabled
        ,并使用类似的函数使
        EntityStatus
        =
        处于活动状态


      您是否收到相同的消息?@VovaBilyachat否根据我们的要求,这些消息不同且随机。我相信您正在寻找的是.Net SDK中提供的方法。它看起来在JavaSDK中不可用。您可能想提出一个问题并要求提供此功能。@GauravMantri是否有可能使用Java Completable Future实现它?老实说,我不知道,对不起!我只是对这个功能有点好奇,所以我随便看看。您可能想在SDK的Github repo上问这个问题。您收到相同的消息吗?@VovaBilyachat否这些消息根据我们的要求是不同的和随机的。我相信您正在寻找的是.Net SDK中提供的方法。它看起来在JavaSDK中不可用。您可能想提出一个问题并要求提供此功能。@GauravMantri是否有可能使用Java Completable Future实现它?老实说,我不知道,对不起!我只是对这个功能有点好奇,所以我随便看看。您可能想在SDK的Github repo上问这个问题。非常感谢您的回答。选项1在我的情况下是不可能的,因为我无法控制发送消息。我是一个有意的接受者。请您详细说明选项2
      发布-订阅的整个想法不是这样的
      ——我不同意这种说法。这与发布/订阅无关。问题是如何连续读取消息,但可以灵活地随时打开/关闭该通道。
      创建一个计时器触发器,用于进行REST API调用订阅-创建或更新以使EntityStatus=ReceiveDisabled
      -同样,目的不是阻止消息进入订阅。这是关于控制如何以及何时从订阅中读取消息的问题。你是对的@Gaurav。但是,这在目前是不可能的,这就是为什么我建议采取“变通办法”。您可以随时在此处输入您的用户声音:@code geek,请查看详细链接以了解设计。非常感谢您的回答。选项1在我的情况下是不可能的,因为我无法控制发送消息。我是一个有意的接受者。你能帮我吗