1

我将 JCSMP API 封装在一个类中,并为其他类提供发送和消费消息的方法。

我有以下方法:

    public void send(byte[] data, String queueName) throws JCSMPException {
    // Acquire a message producer
    if (producer == null) { //producer is an instance of XMLMessageProducer
        producer = session.getMessageProducer(new PublishCallback());
    }

    Queue queue = JCSMPFactory.onlyInstance().createQueue(queueName);
    BytesMessage msg = JCSMPFactory.onlyInstance().createMessage(BytesMessage.class);
    msg.setData(data);
    msg.setDeliveryMode(DeliveryMode.PERSISTENT);

    logger.info("Sending to \"{}\"", queueName);

    producer.send(msg, queue);
}

当我有多个线程调用此方法时,偶尔会注意到以下异常:

com.solacesystems.jcsmp.ClosedFacilityException:试图对关闭的 XML 消息生产者执行操作

我想知道每次调用 send() 后是否关闭了生产者。我应该如何使这个方法线程安全?谢谢你。

4

1 回答 1

0

XMLMessageProducer每次调用发送后不会自行关闭。

第一步是调查您XMLMessageProducer的关闭原因。执行此操作的最简单选项是启用 Solace API 日志记录到 INFO(甚至是 DEBUG),并编辑您的问题以在第一个ClosedFacilityException.

一个可能的原因是您的应用程序已断开连接,但无法自动重新连接到 Solace 设备/VMR。

于 2016-06-06T01:45:19.923 回答