我想从服务总线中提取消息。消息只不过是 XML。我想使用该PEEK_LOCK
选项来实现目标。
目前,队列中没有消息。我的代码每 30 秒运行一次。如果队列中有任何消息,它将拉出消息,否则它将打印No more message。
ReceiveMessageOptions opts = ReceiveMessageOptions.DEFAULT;
opts.setReceiveMode(ReceiveMode.PEEK_LOCK);
service.getQueue(queueName).getValue().setMaxSizeInMegabytes((long) 1);
BrokeredMessage message;
message = service.receiveQueueMessage(queueName).getValue();
StreamSource source = null;
ResponseEntity<String> response = null;
LOG.debug("Message: " + message);
// LOG.debug("message.getMessageId(): " + message.getMessageId());
// try {
if (message != null) {
source = new StreamSource(message.getBody());
StringWriter outWriter = new StringWriter();
StreamResult result = new StreamResult(outWriter);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.transform(source, result);
StringBuffer sb = outWriter.getBuffer();
String finalstring = sb.toString();
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource src = new InputSource();
src.setCharacterStream(new StringReader(finalstring));
Document doc = builder.parse(src);
String ecnNo = doc.getElementsByTagName(xmlECNNoTag).item(0).getTextContent();
LOG.info(ecnNo + " Is pulled from queue ");
if (LOG.isDebugEnabled()) {
LOG.info("XML Content: " + finalstring);
}
}
service.deleteMessage(message);
如果我删除peek_lock
代码,我的代码可以正常工作。随着peek_lock
我得到这个错误:
javax.xml.transform.TransformerException:org.xml.sax.SAXParseException;行号:1;列号:50;publicId 和 systemId 之间需要空格。在 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:749) ~[na:1.8.0_66] 在 com.sun.org.apache.xalan.internal.xsltc。 trax.TransformerImpl.transform(TransformerImpl.java:351) ~[na:1.8.0_66] at com.jci.subscriber.service.PLMSubscriberMSServiceImpl.azureMessageSubscriber(PLMSubscriberMSServiceImpl.java:160) ~[classes/:na] at com.jci .subscriber.PLMSubscriberMSApplication.getXML(PLMSubscriberMSApplication.java:118) [classes/:na] at sun.reflect.GeneratedMethodAccessor101.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43) ~[na:1.8.0_66] 在 java.lang.reflect。ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_66] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_66] 在 java.lang.Thread。 run(Thread.java:745) [na:1.8.0_66] 原因:org.xml.sax.SAXParseException:publicId 和 systemId 之间需要空格。在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1239) ~[na:1.8.0_66] 在 com.sun.org.apache.xalan.internal.xsltc.trax。 TransformerImpl.transformIdentity(TransformerImpl.java:641) ~[na:1.8.0_66] at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737) ~[na:1.8 .0_66] ...省略了15个常用帧 在 java.lang.Thread.run(Thread.java:745) [na:1.8.0_66] 处运行(ThreadPoolExecutor.java:617)[na:1.8.0_66] 原因:org.xml.sax.SAXParseException:空格在 publicId 和 systemId 之间是必需的。在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1239) ~[na:1.8.0_66] 在 com.sun.org.apache.xalan.internal.xsltc.trax。 TransformerImpl.transformIdentity(TransformerImpl.java:641) ~[na:1.8.0_66] at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737) ~[na:1.8 .0_66] ...省略了15个常用帧 在 java.lang.Thread.run(Thread.java:745) [na:1.8.0_66] 处运行(ThreadPoolExecutor.java:617)[na:1.8.0_66] 原因:org.xml.sax.SAXParseException:空格在 publicId 和 systemId 之间是必需的。在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1239) ~[na:1.8.0_66] 在 com.sun.org.apache.xalan.internal.xsltc.trax。 TransformerImpl.transformIdentity(TransformerImpl.java:641) ~[na:1.8.0_66] at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737) ~[na:1.8 .0_66] ...省略了15个常用帧