使用Java将blob文件上载到AmazonMQ队列(ActiveMQ)

使用Java将blob文件上载到AmazonMQ队列(ActiveMQ),java,jms,activemq,amazon-mq,Java,Jms,Activemq,Amazon Mq,我必须与Amazon MQ合作。AmazonMQ基于ActiveMQ。我找到了一些代码,它应该在队列中放置一条PDF大小为230kB的blob消息。但是如果我运行程序,它会在下面的错误堆栈中出错 这是我的代码: 专用最终静态字符串线\级别\端点=ssl://-1.amazonaws.com:61617; 私有最终静态字符串ACTIVE_MQ_USERNAME=test123; 私有最终静态字符串ACTIVE_MQ_PASSWORD=test123; 公共静态void sendFileViaQue

我必须与Amazon MQ合作。AmazonMQ基于ActiveMQ。我找到了一些代码,它应该在队列中放置一条PDF大小为230kB的blob消息。但是如果我运行程序,它会在下面的错误堆栈中出错

这是我的代码:

专用最终静态字符串线\级别\端点=ssl://-1.amazonaws.com:61617; 私有最终静态字符串ACTIVE_MQ_USERNAME=test123; 私有最终静态字符串ACTIVE_MQ_PASSWORD=test123; 公共静态void sendFileViaQueueString uri,String queueName引发JMSExException{ File File=new Filetest.pdf; ConnectionFactory ConnectionFactory=null; 连接=空; 会话=空; BlobMessage blobMsg=null; MessageProducer=null; 试一试{ connectionFactory=新ActiveMQConnectionFactoryACTIVE\u MQ\u用户名、ACTIVE\u MQ\u密码、连线级别\u端点; connection=connectionFactory.createConnection; 连接启动; 会话=connection.createSessionBoolean.TRUE,session.AUTO\u确认; producer=session.createProducersession.createQueueName; blobMsg=ActiveMQSession session.createBlobMessagefile; blobMsg.setStringPropertyFILE.NAME,file.getName; blobMsg.setLongPropertyFILE.SIZE,file.length; producer.sendblobMsg; session.commit; }最后{ 亲密的生产者; 近距离安静休息; 近静连接; } } 看起来它想上传到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文本消息不会出现问题。

如中所述,blob消息:

允许在某些带外传输机制中发送大量BLOB二进制大型对象。可能的带外机制可以是HTTP、FTP、SCP或其他点对点协议

请注意,实际的二进制数据必须通过带外传输机制发送。换句话说,blob实际上不会进入队列。blob被上传到其他地方,发送到队列的消息只是指向该位置

您需要使用客户端URL上的jms.blobTransferPolicy.uploadUrl参数配置传输策略。默认传输策略的默认上载URL是您的客户端试图用来上载二进制数据的URL

如果您想将任意大消息直接发送到队列,而不是使用一些带外机制,请考虑移动到支持的。


如果您一直在使用Amazon MQ,那么除了手动解决方案之外,我认为您没有其他解决方案,您可以将文件分成更小的块,然后放入单独的消息中,然后在消费应用程序中重新组合这些块。

我想如果我想上传这样的文件,那么这是错误的解决方案似乎没有人使用这个,因为互联网上没有信息。如果您使用排队,那么您这样做是出于某种原因,例如为了获得可靠的消息传递解决方案。使用上载服务器不可靠。所以我的问题是,如果我想将大文件上传到Amazon MQ,那么最好的解决方案是什么?例如PDF文件。最好的解决方案是适合您并满足您要求的解决方案。您好,谢谢大家的评论。如果需要发送大于100MB的大XML文件,并且我们想要发送图像和pdf,那么我认为Amazon MQ不是适合我们的平台。我的结论正确吗?我还了解到,在Amazon MQ和ActiveMQ中,队列中消息的maxmessage大小为32 MB。如果您的要求包括发送大于100MB的文件的能力,并且您不想使用blob消息的带外传输机制,那么我认为Amazon MQ不适合。正如我前面提到的,ActiveMQ Artemis非常适合,因为它支持任意大的消息。谢谢Justin,但是如果我的信息是正确的,那么Artemis不是由Amazon MQ实现的吗?