Исключение при извлечении сообщения из сервисного автобуса

Я хочу вытащить сообщение из сервисного автобуса. Сообщения - это не что иное, как XML. Я хочу использовать PEEK_LOCK вариант для достижения цели.

На данный момент в очереди нет сообщений. Мой код запускается по расписанию каждые 30 секунд. Если в очереди есть какое-либо сообщение, оно извлечет сообщение, в противном случае будет напечатано сообщение "Больше нет".

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] в com.jci.subscriber.service.PLMSubscriberMSServiceImpl.azureMessageSubscriber(PLMSubscriberMSServiceImpl.java:1: at: at.60: at:60).subscriber.PLMSubscriberMSApplication.getXML(PLMSubscriberMSApplication.java:118) [classes/:na] в sun.reflect.GeneratedMethodAccessor101.invoke(неизвестный источник) ~[na:na] в sun.reflect.DelegatingMethod 43) ~[na:1.8.0_66] в java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66] в org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) [spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE] at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE] в java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_66] в java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_66] по адресу java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_66] в java.NetExecoc. $ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_66] в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_66] в java.util.conol $Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_66] at 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] на com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737) ~[na:1.8.0_66] ... 15 общих кадров опущено

1 ответ

Согласно моему исключению, по моему опыту, проблема была вызвана проверкой схемы удаленного DTD сообщения из служебной шины с peek_lock режим через DocumentBuilder,

Есть некоторые обходные пути, как показано ниже.

  1. Попробуй использовать метод [DocumentBuilderFactory.setValidating(boolean validating) ] 1, чтобы отключить проверку сообщения, как показано ниже.

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(false);
    DocumentBuilder builder = factory.newDocumentBuilder();
    
  2. Попробуйте установить кастом EntityResolver объект для DocumentBuilder через метод DocumentBuilder.setEntityResolver(EntityResolver er) пожалуйста, обратитесь к ответчику SO потока. Make DocumentBuilder.parse игнорирует ссылки DTD.

builder.setEntityResolver(new EntityResolver() { @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { if (systemId.contains("foo.dtd")) { return new InputSource(new StringReader("")); } else { return null; } } });

  1. Попробуйте использовать сторонние библиотеки, такие как dom4j разобрать сообщение.

Надеюсь, поможет. Любая проблема, пожалуйста, не стесняйтесь, дайте мне знать.

Другие вопросы по тегам