簡體   English   中英

使用 Java 將 blob 文件上傳到 AmazonMQ 隊列 (ActiveMQ)

[英]Upload a blob file with Java to an AmazonMQ queue (ActiveMQ)

我必須使用 Amazon MQ。 Amazon MQ 基於 ActiveMQ。 我找到了一些代碼,它應該在隊列中放置一個 blob 消息(PDF 大小 230kB)。 但是如果我運行程序,它會在下面的錯誤堆棧中出錯。

這是我的代碼:

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沒有問題。

文檔所述,“blob”消息:

允許以某種帶外傳輸機制發送大量 BLOB(二進制大對象)。 可能的帶外機制可以是 HTTP 或 FTP 或 SCP 或某些其他點對點協議。

請注意,實際的二進制數據必須“以某種帶外傳輸機制”發送。 換句話說,blob 實際上並沒有進入隊列。 blob 上傳到其他地方,進入隊列的消息只是指向該位置。

您需要使用客戶端 URL 上的jms.blobTransferPolicy.uploadUrl參數配置傳輸策略。 默認傳輸策略的默認上傳 URL 是http://localhost:8080/uploads/ ,這是您的客戶端嘗試用來上傳二進制數據的 URL。

如果您想將任意大的消息直接發送到隊列而不是使用某些帶外機制,請考慮轉向支持該功能的ActiveMQ Artemis

如果您堅持使用 Amazon MQ,那么我認為除了某種手動解決方案之外,您沒有任何其他解決方案,您可以將文件分成更小的塊,然后將這些塊放入單獨的消息中,然后在稍后重新組合這些塊消費應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM