Search code examples
apache-camelactivemq-classicjbossfusefuseesb

How to get the file name in a custom processor?


I serialize the files to a byte arrays and send it to the ActiveMQ queue (I using the code from this example: 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);
}

Method readfileAsBytes is presented below:

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;
    }
}

In my OSGi bundle I have a custom processor:

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

I use it in my Spring DSL route as follows:

<?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>

I need to get the file name in my processor. How can I do that?


Solution

  • The problem can be solved as follows. For example, I send the README.html file to the alfresco-queue. Then the body of the file and the file name, as well as some additional information can be obtained as follows:

    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
    

    It gives the following output:

    <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