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