跳到主要内容

直接传输行为

本节提供了有关直接传输模式的行为以及在设计应用程序时应考虑的一些功能交互的额外信息。

发布直接消息

当发布客户端使用直接传输模式时,JMS非持久消息作为非保证消息发送(即,事件代理在接收到消息时不确认消息,消息不会为消费者暂存,并且可能会被丢弃)。

该客户端发布的任何JMS持久消息仍然按保证传输处理(即,事件代理仍然执行消息确认和暂存)。但是,如果事件代理未安装保证交付刀片(ADB)、启用保证消息传递和消息暂存,则这些持久消息将被拒绝。

消费直接消息

当消费客户端使用直接传输时,会发生以下行为:

  • 对于非持久消费者(即,非持久主题订阅者和临时队列的消费者),事件代理会添加以下类型的主题订阅之一:
    • 与主题订阅者相关联的主题
    • 临时队列名称
  • 对于持久主题订阅者或队列的持久消费者,直接传输没有影响。也就是说,接收到的JMS持久消息仍然像使用保证传输一样处理(即,仍然执行消息确认和暂存,以保证消息传递)。

当使用Solace PubSub+设备时,如果没有ADB(或启用),则不能创建持久消费者,但仍然可以创建非持久消费者。

使用直接传输时的功能交互

以下部分概述了使用直接传输模式时使用某些JMS或Solace功能的限制。在Solace JMS实现中,这些特定的JMS或Solace功能依赖于事件代理的保证消息传递功能,而直接传输模式不使用这些功能。

  • 无本地 使用直接传输模式时,客户端不能创建一个将noLocal设置为true的非持久消费者。尝试这样做将返回com.solacesystems.jms.ConfigurationException

  • 队列浏览 使用直接传输模式时,客户端不能创建一个临时队列的队列浏览器。尝试这样做将返回com.solacesystems.jms.ConfigurationException

  • 选择器 使用直接传输模式时,客户端不能创建带有选择器的非持久消费者。尝试创建带有选择器的非持久消费者将返回com.solacesystems.jms.ConfigurationException

  • 主题序列号 使用直接传输模式时,非持久消费者接收到的消息不包含主题序列号。

  • 会话恢复 Session.recover()停止消息传递,并从最早的未确认消息重新开始。使用直接传输模式时,Session.recover()没有效果(即,不会重新传递非持久消息)。

  • 优化直接传输 使用直接传输模式且启用了优化直接传输属性时,尝试创建多个生产者或多个非持久消费者将返回com.solacesystems.jms.ConfigurationException

    有关优化直接传输属性的信息,请参阅直接传输优化。

  • 延迟启动 延迟启动是为了解决Solace JMS实现中以下编程模式的处理方式而开发的:

    Connection connection = connectionFactory.createConnection();
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    connection.start(); // 在所有消费者上启动消息流动
    MessageConsumer consumer = session.createConsumer(destination);
    consumer.setMessageListener(listener);

    在上面的代码片段中,当创建消费者时,它被隐式启动并标记为同步消费者(即,没有消息监听器)。因此,当设置消息监听器时,似乎是一个错误,因为消费者已经被标记为同步的,而不是异步消费者。

    使用保证传输模式时,启用延迟启动属性可以防止在创建消费者时隐式启动连接。相反,连接通过控制保证交付流保持在停止状态。当调用receive(...)setMessageListener(...)时,才开始消息流动,并且消费者被正确标记为同步或异步。

    延迟启动属性仅影响使用保证传输模式的客户端。它不适用于直接传输模式,因为只有通过在不停止消息传递的情况下避免丢弃,才能实现流控制。

  • 连接启动和停止 使用保证传输模式时,Connection.Start()Connection.stop()控制来自事件代理的所有消费者的消息流。使用直接传输模式时,没有流控制,因此当连接处于停止状态时,API丢弃所有接收到的非持久消息。当连接启动时,消息流动正常。

  • 事务 使用直接传输模式时,客户端不能创建事务会话。尝试这样做将返回com.solacesystems.jms.ConfigurationException