当前位置: 首页 > 知识库问答 >
问题:

需要会话的实体不可能为azure IMessageReceiver创建非会话消息接收器

翟泰
2023-03-14

我正在尝试通过java应用程序从Azure服务总线获取消息。我创建了必要的客户端配置,例如,通过ManagementClient成功连接

@Bean
public ClientSettings getMessageReceiver() throws ServiceBusException, InterruptedException {

    AzureTokenCredentials azureTokenCredentials = new ApplicationTokenCredentials(
            "clientID,
            "domain",
            "secret",
            AzureEnvironment.AZURE
    );

    TokenProvider tokenProvider = TokenProvider.createAzureActiveDirectoryTokenProvider(
            new AzureAuthentication(azureTokenCredentials),
            AzureEnvironment.AZURE.activeDirectoryEndpoint(),
            null
    );

    ClientSettings clientSettings = new ClientSettings(tokenProvider,
            RetryPolicy.getDefault(),
            Duration.ofSeconds(30),
            TransportType.AMQP);

    return clientSettings;
}

ManagementClient managementClient =
            new ManagementClient(Util.convertNamespaceToEndPointURI("namespace"),
                    clientSettings);
    managementClient.getTopics();

但当我试图从特定主题获取消息时:

        SubscriptionClient subscriptionClient = new SubscriptionClient("namespace", "events/subscriptions/subscription", clientSettings, ReceiveMode.PEEKLOCK);

并得到一个错误消息:

需要会话的实体不可能创建非会话消息接收器。

应提供哪些附加步骤?

共有1个答案

公羊伟志
2023-03-14

在主题订阅中创建时,您已启用会话(默认情况下已禁用)。如果不需要消息会话,请禁用“需要会话”重新创建订阅(注意:一旦创建订阅,您就不能更改该属性)。

或者,如果您确实需要消息会话,请像下面这样更新代码,以便首先接收会话,然后从接收的会话中接收消息。所有代码示例都可以在这里找到,会话示例也可以在这里找到。

java prettyprint-override">        // The connection string value can be obtained by:
        // 1. Going to your Service Bus namespace in Azure Portal.
        // 2. Go to "Shared access policies"
        // 3. Copy the connection string for the "RootManageSharedAccessKey" policy.
        String connectionString = "Endpoint={fully-qualified-namespace};SharedAccessKeyName={policy-name};"
            + "SharedAccessKey={key}";

        // Create a receiver.
        // "<<topic-name>>" will be the name of the Service Bus topic you created inside the Service Bus namespace.
        // "<<subscription-name>>" will be the name of the session-enabled subscription.
        ServiceBusReceiverAsyncClient receiver = new ServiceBusClientBuilder()
            .connectionString(connectionString)
            .sessionReceiver()
            .receiveMode(ReceiveMode.PEEK_LOCK)
            .topicName("<<topic-name>>")
            .subscriptionName("<<subscription-name>>")
            .buildAsyncClient();

        Disposable subscription = receiver.receiveMessages()
            .flatMap(context -> {
                if (context.hasError()) {
                    System.out.printf("An error occurred in session %s. Error: %s%n",
                        context.getSessionId(), context.getThrowable());
                    return Mono.empty();
                }

                System.out.println("Processing message from session: " + context.getSessionId());

                // Process message
                return receiver.complete(context.getMessage());
            }).subscribe(aVoid -> {
            }, error -> System.err.println("Error occurred: " + error));

        // Subscribe is not a blocking call so we sleep here so the program does not end.
        TimeUnit.SECONDS.sleep(60);

        // Disposing of the subscription will cancel the receive() operation.
        subscription.dispose();

        // Close the receiver.
        receiver.close();
 类似资料:
  • 听众 配置 我正在使用Azure Service Bus Spring Boot Starter连接已启用会话的Servicebus主题/订阅,但无法连接以下消息:需要会话的实体不可能创建非会话消息接收器。

  • 我们正在使用qpid-jms-client-0.57.0从Azure ServiceBus发布和接收消息。ServiceBus提供从会话接收消息的功能,以维护消息顺序。更多详情请参考这里-https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-sessions 我能够使用JMXGroupId发布消息,但无法从启用会话

  • 当会话仅是一个未来的且还没有被建立的会话时被认为是“新”的。因为 HTTP是一种基于请求-响应的协议,直到客户端“加入”到 HTTP 会话之前它都被认为是新的。当会话跟踪信息返回到服务器指示会话已经建立时客户端加入到会话。直到客户端加入到会话,否则不能假定下一个来自客户端的请求被识别为同一会话。 如果以下之一是 true,会话被认为是“新”的: 客户端还不知道会话 客户端选择不加入会话。 这些条件

  • 我已经创建了一个默认的表单登录身份验证,下面是我的配置。 身份验证工作正常,但最近我在应用程序中添加了会话超时。我的应用程序每5秒轮询一次服务器,因此默认超时不起作用。我在谷歌上找到了下面的过滤器解决方案,并实现了它。 另外,2)我没有得到会话超时错误消息,因为它被重定向到这个页面,一次又一次地转到登录页面。我不能保存这个错误消息,直到用户再次登录。 有什么指示吗?

  • 问题内容: 我正在维护Java Web应用程序。 通过登录代码,它可以通过HttpServletRequest的getSession()方法从HttpServletRequest中获取一个HttpSession。(它在会话中使用一些值进行认证) 但是,我担心会话固定攻击,因此在使用初始会话后,我想开始一个新会话或更改会话ID。这可能吗? 问题答案: Servlet 3.0 API不允许您更改现有会

  • 在我的Vaadin应用程序中,当Vaadin在“session Timeout”消息之后没有使会话无效时,我遇到了一个问题。收到此消息后,用户有时可以单击链接或刷新页面,并继续工作,就像他们仍在登录一样。我使用以下参数: Last参数(session-timeout)也在context.xml(session-timeout=900)和web.xml(session-config/session-