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

Qpid(JMS)-Azure Servicebus-对于需要会话来创建非会话消息接收器的实体来说是不可能的

荀子轩
2023-03-14

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

我能够使用JMXGroupId发布消息,但无法从启用会话的队列接收消息。获取错误-javax。jms。JMSException:对于需要会话的实体,不可能创建非会话消息接收器。TrackingId:*,SystemTracker:mule intr sbus测试标准:队列:测试顺序,时间戳:2021-07-28011:07:49 TrackingId:*,SystemTracker:gateway7,时间戳:2021-07-28011:07:49[条件=amqp:不允许]

您是否可以建议从启用会话的队列接收消息?

样本代码

public void receiveMessage() throws Exception {
        System.out.println("** Receiver start **");

        Connection connection = createConnection();
        connection.start();

        Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

        Destination destination = session.createQueue(QUEUE_NAME);
        MessageConsumer messageConsumer = session.createConsumer(destination);
        
        messageConsumer.setMessageListener(this);
        
        System.out.println("** Receiver registered **");
    }

错误堆栈跟踪

Exception in thread "main" javax.jms.JMSException: It is not possible for an entity that requires sessions to create a non-sessionful message receiver. TrackingId:****, SystemTracker:****:Queue:test-order, Timestamp:2021-07-28T10:30:03 TrackingId:****, SystemTracker:gateway7, Timestamp:2021-07-28T10:30:03 [condition = amqp:not-allowed]
    at org.apache.qpid.jms.provider.ProviderException.toJMSException(ProviderException.java:34)
    at org.apache.qpid.jms.exceptions.JmsExceptionSupport.create(JmsExceptionSupport.java:80)
    at org.apache.qpid.jms.exceptions.JmsExceptionSupport.create(JmsExceptionSupport.java:112)
    at org.apache.qpid.jms.JmsConnection.createResource(JmsConnection.java:698)
    at org.apache.qpid.jms.JmsMessageConsumer.<init>(JmsMessageConsumer.java:125)
    at org.apache.qpid.jms.JmsMessageConsumer.<init>(JmsMessageConsumer.java:82)
    at org.apache.qpid.jms.JmsSession.createConsumer(JmsSession.java:479)
    at org.apache.qpid.jms.JmsSession.createConsumer(JmsSession.java:467)
    at org.apache.qpid.jms.JmsSession.createConsumer(JmsSession.java:459)
    at com.qpid.test.TestSessionEnable.receiveMessage(TestSessionEnable.java:70)
    at com.qpid.test.TestSessionEnable.main(TestSessionEnable.java:80)
Caused by: org.apache.qpid.jms.provider.ProviderException: It is not possible for an entity that requires sessions to create a non-sessionful message receiver. TrackingId:****, SystemTracker:****:Queue:test-order, Timestamp:2021-07-28T10:30:03 TrackingId:****, SystemTracker:gateway7, Timestamp:2021-07-28T10:30:03 [condition = amqp:not-allowed]
    at org.apache.qpid.jms.provider.amqp.AmqpSupport.convertToNonFatalException(AmqpSupport.java:181)
    at org.apache.qpid.jms.provider.amqp.builders.AmqpResourceBuilder.getOpenAbortExceptionFromRemote(AmqpResourceBuilder.java:299)
    at org.apache.qpid.jms.provider.amqp.builders.AmqpResourceBuilder.handleClosed(AmqpResourceBuilder.java:185)
    at org.apache.qpid.jms.provider.amqp.builders.AmqpResourceBuilder.processRemoteClose(AmqpResourceBuilder.java:129)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider.processUpdates(AmqpProvider.java:985)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider.onData(AmqpProvider.java:871)
    at org.apache.qpid.jms.transports.netty.NettyTcpTransport$NettyTcpTransportHandler.channelRead0(NettyTcpTransport.java:563)
    at org.apache.qpid.jms.transports.netty.NettyTcpTransport$NettyTcpTransportHandler.channelRead0(NettyTcpTransport.java:556)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
    at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1533)
    at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1282)
    at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1329)
    at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:508)
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:447)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at java.lang.Thread.run(Thread.java:748)

共有1个答案

袁恩
2023-03-14

你问了这个问题,在Qpid消息列表中有一个答案,所以我猜你可能对这个答案不满意,但给出的答案基本上涵盖了这个问题。Microsoft客户端使用的非法筛选器值不是AMQP描述的类型,因此即使客户端支持以某种方式设置自定义筛选器(它不支持),也不允许使用该值。

此外,客户端不会向用户公开这种级别的内部实现,因此您不能向链接附加添加任何过滤器来利用Microsoft使用这种非法过滤器定义启用的任何机制。

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

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

  • 我有一个有状态的会话bean,我在那里发送和接收JMS消息。所有的连接设置都是手动处理的,因此bean包含javax.jms.connection和javax.jms.Session的实例。该bean还实现了MessageListener,使其能够接收消息。 注意:这是在Java EE环境(GlassFish4.0)中执行的 编辑:

  • 我按照本教程阅读来自给定订阅的消息。我创建了一个像这样的接收类- 在执行这个程序时,我得到了这个错误- 错误指向此行-还想知道像这样提供我的主题和订阅名称-是否合适。 很抱歉发了这么长的帖子。

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

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