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

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

司空宣
2023-03-14

听众

@JmsListener(destination = "${servicebus.entities.acsTopicToListen.entityName}", containerFactory = "topicJmsListenerContainerFactory", subscription = "${servicebus.entities.acsTopicToListen.subscriptionName}")
    public void run(byte[] message, Session session) throws Exception {

        try {
            acsDataHandler.messageProcessor(new String(message));
        } catch (Exception ex) {
            LOGGER.error("Exception thrown while listening to acsDataTopic...." + ex.getMessage());
            exceptionHelper.handleTransformError(INTERNAL_SERVER_ERROR, "Error from AcsDataReceiver listen()",
                    ACS0001.name(), ex);
        }

配置

    @Bean
    public ConnectionFactory schedulerConnectionFactory(ServicebusConnectionProperties serviceBusJMSProperties) {
        final String connectionString = serviceBusJMSProperties.getConnectionString();
        final String clientId = serviceBusJMSProperties.getTopiClientId();
        final int idleTimeout = serviceBusJMSProperties.getIdleTimeout();

        final ServiceBusKey serviceBusKey = ConnectionStringResolver.getServiceBusKey(connectionString);
        final String host = serviceBusKey.getHost();
        final String sasKeyName = serviceBusKey.getSharedAccessKeyName();
        final String sasKey = serviceBusKey.getSharedAccessKey();

        final String remoteUri = String.format(AMQP_URI_FORMAT, host, idleTimeout);
        final JmsConnectionFactory jmsConnectionFactory = new JmsConnectionFactory();
        jmsConnectionFactory.setRemoteURI(remoteUri);
        jmsConnectionFactory.setClientID(clientId);
        jmsConnectionFactory.setUsername(sasKeyName);
        jmsConnectionFactory.setPassword(sasKey);
        return new CachingConnectionFactory(jmsConnectionFactory);
    }

    @Bean
    public Destination destination() {
        return new JmsTopic(destination);
    }

    @Bean
    public JmsTemplate jmsTemplate(ConnectionFactory jmsConnectionFactory, Destination destination) {
        final JmsTemplate jmsTemplate = new JmsTemplate();
        jmsTemplate.setConnectionFactory(jmsConnectionFactory);
        jmsTemplate.setMessageIdEnabled(true);
        jmsTemplate.setDefaultDestination(destination);
        return jmsTemplate;
    }
    

    @Bean
    public JmsListenerContainerFactory<?> topicJmsListenerContainerFactory(ConnectionFactory connectionFactory) {
        final DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
        jmsListenerContainerFactory.setConnectionFactory(connectionFactory);
        jmsListenerContainerFactory.setSubscriptionDurable(Boolean.TRUE);
        jmsListenerContainerFactory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
        return jmsListenerContainerFactory;
    }

我正在使用Azure Service Bus Spring Boot Starter连接已启用会话的Servicebus主题/订阅,但无法连接以下消息:需要会话的实体不可能创建非会话消息接收器。

共有1个答案

公西俊才
2023-03-14

在Java中,会话支持与azure servicebus库示例QueuesGettingStarted一起使用。java通过更改queueClient。将registerMessageHandler发送到queueClient。registerSessionHandler和相关更改。

但在这种情况下请检查:https://github.com/Azure/azure-service-bus/issues/326#issuecomment-573236250

https://github.com/MicrosoftDocs/azure-dev-docs/issues/285#issuecomment-699573311

 类似资料:
  • 我正在尝试通过java应用程序从Azure服务总线获取消息。我创建了必要的客户端配置,例如,通过ManagementClient成功连接 但当我试图从特定主题获取消息时: 并得到一个错误消息: 需要会话的实体不可能创建非会话消息接收器。 应提供哪些附加步骤?

  • 我们正在使用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-