我必须通过 ActiveMQ 发送大文件,为此我遵循了提供的文档 对于大消息,但它抛出错误,将文件打包在 BytesMessage 中。
ActiveMQ“经典”5.15.2 中发送文件的正确方法是什么?
BytesMessage message = session.createBytesMessage();
FileInputStream fileInputStream = new FileInputStream(txFile);
BufferedInputStream bufferedInput = new BufferedInputStream(fileInputStream);
message.setObjectProperty("JMS_AMQ_InputStream", bufferedInput);
producer.send(message);
pom.xml
:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.2</version>
</dependency>
例外:
Caught: javax.jms.MessageFormatException: Only objectified primitive objects, String, Map and List types are allowed but was: java.io.BufferedInputStream@445958d type: class java.io.BufferedInputStream
javax.jms.MessageFormatException: Only objectified primitive objects, String, Map and List types are allowed but was: java.io.BufferedInputStream@445958d type: class java.io.BufferedInputStream
at org.apache.activemq.command.ActiveMQMessage.checkValidObject(ActiveMQMessage.java:538)
at org.apache.activemq.command.ActiveMQMessage.setObjectProperty(ActiveMQMessage.java:504)
at org.apache.activemq.command.ActiveMQMessage.setObjectProperty(ActiveMQMessage.java:488)
at org.apache.activemq.command.ActiveMQBytesMessage.setObjectProperty(ActiveMQBytesMessage.java:918)
at com.svm.mq.test.Producer.run(Producer.java:80)
at java.lang.Thread.run(Thread.java:745)`
您粘贴的代码(即设置
JMS_AMQ_InputStream
对象属性)适用于 ActiveMQ Artemis 核心客户端。这不适用于 ActiveMQ“经典”。
如果您想使用 ActiveMQ“经典”“发送”大消息,那么您将需要使用另一个用户指出的“blob”消息。但是,这仍然需要您使用其他方法发送实际消息。 “blob”消息实际上只是消息的一种指针或引用。
Blob 消息是您的最佳选择。试试这个链接了解更多详情:
BlobMessage message = session.createBlobMessage(new File("/foo/bar");
producer.send(message);