Свойства файла теряются, когда файл помещается в очередь JMS в Mule 3.5.

Я хочу использовать очередь JMS для хранения файла и последующей обработки. Я могу прочитать его из очереди, я получаю массив байтов и могу записать его в папку. Но имя файла теряется, когда я помещаю его в очередь, поскольку входящие свойства теряются.

<file:endpoint path="C:\Store" name="storage" responseTimeout="10000" doc:name="File"/>
<file:file-to-byte-array-transformer doc:name="File to Byte Array"/>
<jms:outbound-endpoint doc:name="Storage Queue" connector-ref="Active_MQ" queue="file.queue"/>

Как я могу снова связать исходное имя файла. Есть ли какой-нибудь преобразователь, который сохраняет имя файла перед отправкой в ​​Mule?


person shrinathM    schedule 21.08.2014    source источник
comment
Что ты прикалываешься делать?? .. пожалуйста, объясните четко .. Как вы можете отправить полезную нагрузку в очередь JMS, используя ‹jms:inbound-endpoint ? Это должно быть ‹jms:outbound-endpoint ..   -  person Anirban Sen Chowdhary    schedule 21.08.2014
comment
Вы правы, отредактировал. Итак, представьте, что я отправляю файл с именем sun.pdf в JMS. Теперь я получу его с помощью входящего JMS. Что происходит, так это то, что я получаю только байтовый массив файла. Когда я пишу его в папку, это имя файла записывается как нулевое. Я хочу сохранить имя файла.   -  person shrinathM    schedule 21.08.2014


Ответы (2)


Вам нужно что-то вроде следующего, чтобы прочитать из очереди и записать в файл с исходным именем файла... Простой пример здесь, где файл читается из потока и отправляется в очередь JMS, а следующий поток берет файл из очереди JMS и напишите в папку с исходным именем файла: -

  <?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file"
    xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking"
    xmlns:jms="http://www.mulesoft.org/schema/mule/jms" xmlns:http="http://www.mulesoft.org/schema/mule/http"
    xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.5.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/jms http://www.mulesoft.org/schema/mule/jms/current/mule-jms.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd">

    <jms:activemq-connector name="Active_MQ"
        brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ" />
    <flow name="JMSSender" doc:name="JMSSender">
        <file:inbound-endpoint responseTimeout="10000"
            doc:name="File" path="E:\backup\test">
            <file:filename-regex-filter pattern="sun.pdf,aa.txt" caseSensitive="false" />
        </file:inbound-endpoint>

        <file:file-to-byte-array-transformer /> <!-- This is necessary otherwise the output PDF file will be corrupted .. -->

        <set-session-variable variableName="FileName" value="#[message.inboundProperties.originalFilename]" doc:name="Session Variable" />

        <jms:outbound-endpoint queue="MyQueue"  connector-ref="Active_MQ" doc:name="JMS" exchange-pattern="request-response">
        </jms:outbound-endpoint>

    </flow>


    <flow name="JMSReceiver" doc:name="JMSReceiver">

        <jms:inbound-endpoint connector-ref="Active_MQ"
            doc:name="JMS" exchange-pattern="request-response" address="jms://tcp:MyQueue">
        </jms:inbound-endpoint>

        <file:outbound-endpoint path="E:\backup\test\ss" outputPattern="#[sessionVars['FileName']]" responseTimeout="10000"
            doc:name="File" />
    </flow>


</mule>

Здесь вы можете получить исходное имя файла, используя переменную сеанса...

person Anirban Sen Chowdhary    schedule 21.08.2014
comment
Вы получите исходное имя файла, используя переменную сеанса - person Anirban Sen Chowdhary; 21.08.2014

Попробуйте jms:outbound-endpoint следующим образом.

<jms:outbound-endpoint doc:name="Storage Queue" connector-ref="Active_MQ" queue="file.queue">
          <copy-properties propertyName="*"></copy-properties>
</jms:outbound-endpoint>

Это помогает сохранить все входящие свойства при отправке полезной нагрузки в очередь JMS.

Надеюсь это поможет.

person user1760178    schedule 21.08.2014
comment
Привет, спасибо за ответ, так что я использую эту вещь. Можете ли вы рассказать, как я могу связать это свойство с массивом байтов, который я получаю из очереди? - person shrinathM; 21.08.2014
comment
Это так же, как вы получили доступ к имени файла в первом (входящем файле) потоке #[message.inboundProperties.originalFilename] Во входящем потоке JMS вы также можете получить доступ к свойству имени файла таким же образом. - person user1760178; 21.08.2014
comment
На самом деле, когда этот Jms-outbound изменяется на Jms-inbound, мы теряем значение из входящих свойств. Для него устанавливается значение null. - person shrinathM; 21.08.2014
comment
Вот почему мы используем тег copyProperties внутри JMS Outbound. Этот тег копирует все входящие свойства в исходящие свойства. Затем в принимающем потоке (JMS INbound) эти свойства выходят как входящие свойства. - person user1760178; 21.08.2014
comment
хм, не похоже на это. На самом деле я хотел добиться этого, используя ваш метод, но не сработал, поэтому для сеансовых переменных. - person shrinathM; 21.08.2014