为什么XMLMessageProducer在被多个线程调用时关闭?

时间:2016-06-03 13:47:44

标签: solace

我在一个类中封装了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()后生产者是否关闭。我该如何使这个方法线程安全? 谢谢。

1 个答案:

答案 0 :(得分:0)

每次发送电话后,

> foo.bar() status: Symbol(Ready) -> Symbol(Running) value: 1 -> 11 status: Symbol(Running) -> Symbol(Ready) undefined > foo.bar() status: Symbol(Ready) -> Symbol(Running) value: 11 -> 21 status: Symbol(Running) -> Symbol(Ready) undefined 都不会关闭。

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

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