【问题标题】:It is not possible for an entity that requires sessions to create a non-sessionful message receiver需要会话的实体不可能创建非会话消息接收器
【发布时间】:2020-11-20 17:17:13
【问题描述】:

听众

@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 主题/订阅,但无法连接以下消息: 需要会话的实体不可能创建非会话消息接收者。

【问题讨论】:

    标签: azure spring-boot azureservicebus


    【解决方案1】:

    在 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

    【讨论】:

    • 感谢 Jaya 的快速回复。
    • @NilendraMishra 如果答案对您有帮助,请您标记并投票?
    猜你喜欢
    • 2021-01-30
    • 2021-10-04
    • 1970-01-01
    • 2012-02-28
    • 2019-06-08
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多