如何在自定义处理器中获取文件名?

How to get the file name in a custom processor?

我将文件序列化为字节数组并将其发送到 ActiveMQ 队列(我使用此示例中的代码:Apache ActiveMQ File Transfer Example):

private void sendFileAsBytesMessage(File file) throws JMSException, IOException {
    BytesMessage bytesMessage = session.createBytesMessage();

    // Set file name here
    bytesMessage.setStringProperty("fileName", file.getName());

    // Set file body here
    bytesMessage.writeBytes(fileManager.readfileAsBytes(file));

    MessageProduce msgProducer = 
        session.createProducer(session.createQueue(queueName));
    MessageProducer msgProducer.send(bytesMessage);
}

方法readfileAsBytes介绍如下:

public byte[] readfileAsBytes(File file) throws IOException {    
    try (RandomAccessFile accessFile = new RandomAccessFile(file, "r")) {
        byte[] bytes = new byte[(int) accessFile.length()];
        accessFile.readFully(bytes);
        return bytes;
    }
}

在我的 OSGi 包中,我有一个自定义处理器:

public class Deserializer implements Processor {    
    @Override
    public void process(Exchange exchange) throws Exception {
        // Get file body here
        byte[] bytes = exchange.getIn().getBody(byte[].class);
    }
}

我在我的 Spring DSL 路由中使用它如下:

<?xml version="1.0"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
             http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
             http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

    <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="brokerURL" value="tcp://localhost:61616" />
        <property name="userName" value="admin" />
        <property name="password" value="admin" />
    </bean> 

    <bean id="deserializer" class="org.fusesource.example.Deserializer"/>

    <camelContext id="blueprintContext" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
          <route id="testRoute">
            <from uri="activemq:source-queue"></from>
            <process ref="deserializer"/>
            <to uri="activemq:sink-queue"></to>
        </route>    
    </camelContext>    

</blueprint>

我需要在我的处理器中获取文件名。我该怎么做?

问题可以通过以下方式解决。例如,我将 README.html 文件发送到 alfresco-queue。然后可以得到文件的主体和文件名,以及一些额外的信息如下:

public class MyRouteBuilder extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("activemq:alfresco-queue?username=admin&password=admin")
        .process(new Processor() {
            public void process(Exchange exchange) throws Exception {

                // Get file body
                byte[] bytes = exchange.getIn().getBody(byte[].class);                  
                for(int i = 0; i < bytes.length; i++) {
                    System.out.print((char) bytes[i]);
                }

                // Get headers
                Map<String, Object> headers = exchange.getIn().getHeaders();
                Iterator iterator = headers.entrySet().iterator();
                while (iterator.hasNext()) {
                    Map.Entry pair = (Map.Entry)iterator.next();
                    System.out.println(pair.getKey() + " == " + pair.getValue());
                }
            }
        })
       // SKIPPED

它给出以下输出:

<head>
root<> title>README
</title>
</head>
<body>
Please refer to <A HREF="http://java.com/licensereadme">http://java.com/licensereadme</A>
</body>
</html>

breadcrumbId == ID:63-DP-TAV-59000-1531813754416-1:1:1:1:1
fileName == README.html
JMSCorrelationID == null
JMSCorrelationIDAsBytes == null
JMSDeliveryMode == 2
JMSDestination == queue://alfresco-queue
JMSExpiration == 0
JMSMessageID == ID:63-DP-TAV-59000-1531813754416-1:1:1:1:1
JMSPriority == 4
JMSRedelivered == false
JMSReplyTo == null
JMSTimestamp == 1531813754610
JMSType == null
JMSXGroupID == null
JMSXUserID == null