Загрузите файл BLOB с Java в очередь AmazonMQ (ActiveMQ) - PullRequest
0 голосов
/ 18 марта 2020

Я должен работать с Amazon MQ. Amazon MQ основан на ActiveMQ. Я нашел некоторый код, и он должен поместить сообщение BLOB-объекта (размер PDF 230 КБ) в очередь. Но если я запускаю программу, она выдает ошибки в стеке ошибок ниже.

Это мой код:

private final static String WIRE_LEVEL_ENDPOINT = "ssl://<examplednsname>-1.amazonaws.com:61617";
private final static String ACTIVE_MQ_USERNAME = "test123";
private final static String ACTIVE_MQ_PASSWORD = "test123";

public static void sendFileViaQueue(String uri, String queueName) throws JMSException {
    File file = new File("test.pdf");
    ConnectionFactory connectionFactory = null;
    Connection connection = null;
    Session session = null;
    BlobMessage blobMsg = null;
    MessageProducer producer = null;
    try {
        connectionFactory = new ActiveMQConnectionFactory(ACTIVE_MQ_USERNAME, ACTIVE_MQ_PASSWORD, WIRE_LEVEL_ENDPOINT);
        connection = connectionFactory.createConnection();
        connection.start();
        session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
        producer = session.createProducer(session.createQueue(queueName));
        blobMsg = ((ActiveMQSession) session).createBlobMessage(file);
        blobMsg.setStringProperty("FILE.NAME", file.getName());
        blobMsg.setLongProperty("FILE.SIZE", file.length());
        producer.send(blobMsg);
        session.commit();
    } finally {
        closeQuietly(producer);
        closeQuietly(session);
        closeQuietly(connection);
    }
}

Кажется, что-то нужно загрузить на 8080, но я этого не сделал настроить что-нибудь локально. Это только должно загрузить PDF в очередь, которая это делает.

У кого-нибудь есть идея, чтобы исправить это? Это не должно быть так сложно, просто загрузите BLOB-объект в очередь.

Это трассировка стека, которую я получаю:

javax.jms.JMSException: PUT failed to: http://localhost:8080/uploads/ID:bpSligro-PC-50920-1584558692848-1:1:1:1:1
    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:72)
    at org.apache.activemq.command.ActiveMQBlobMessage.onSend(ActiveMQBlobMessage.java:177)
    at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1952)
    at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:288)
    at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:223)
    at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:241)
    at nl.bpittens.mq.AmazonMQExample.sendFileViaQueue(AmazonMQExample.java:81)
    at nl.bpittens.mq.AmazonMQExample.main(AmazonMQExample.java:52)
Caused by: java.io.IOException: PUT failed to: http://localhost:8080/uploads/ID:bpSligro-PC-50920-1584558692848-1:1:1:1:1
    at org.apache.activemq.blob.DefaultBlobUploadStrategy.uploadStream(DefaultBlobUploadStrategy.java:67)
    at org.apache.activemq.blob.DefaultBlobUploadStrategy.uploadFile(DefaultBlobUploadStrategy.java:44)
    at org.apache.activemq.blob.BlobUploader.upload(BlobUploader.java:53)
    at org.apache.activemq.command.ActiveMQBlobMessage.onSend(ActiveMQBlobMessage.java:174)
    ... 6 more
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1334)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1309)
    at org.apache.activemq.blob.DefaultBlobUploadStrategy.uploadStream(DefaultBlobUploadStrategy.java:60)
    ... 9 more

Отправка обычного JMS TextMessage работает без проблем.

1 Ответ

1 голос
/ 18 марта 2020

Как отмечено в документации , сообщение «blob»:

позволяет отправлять массивные большие двоичные объекты (большие двоичные объекты OB) в некотором внеполосном транспорте механизм. Возможными внеполосными механизмами могут быть HTTP, FTP или SCP или какой-либо другой двухточечный протокол.

Обратите внимание, что фактические двоичные данные должны отправляться "в некоторых исходящих механизм внутреннего перемещения . " Другими словами, BLOB-объект на самом деле не go в очередь. BLOB-объект загружается куда-то еще , и сообщение, которое отправляется в очередь, просто указывает на это местоположение.

Необходимо настроить политику передачи с помощью параметра jms.blobTransferPolicy.uploadUrl в URL-адресе клиента. URL-адрес загрузки по умолчанию для политики передачи по умолчанию: http://localhost:8080/uploads/, который ваш клиент пытается использовать для загрузки двоичных данных.

Если вы хотите отправить произвольно большое сообщение напрямую вместо использования какого-либо внешнего механизма рассмотрите возможность перехода на ActiveMQ Artemis , который поддерживает эту функциональность .

Если вы застряли с помощью Amazon MQ, тогда я не буду Не думаю, что у вас есть какое-либо иное решение, кроме какого-то ручного решения, где вы разбиваете файл на более мелкие порции, которые вы можете поместить в отдельные сообщения, а затем заново собираете эти порции позже в потребляющем приложении.

...