Mule ESB: файл outputpattern не переводит шаблон

Я использую Mule ESB CE 3.4. У меня есть требование, когда я читаю информацию о конфигурации из базы данных и использую ее в качестве имени файла для исходящей конечной точки файла. Вот пример кода (код может не работать, так как я дал только схему)

<file:connector name="File-Data" autoDelete="false" streaming="true" validateConnections="true" doc:name="File" />
.....
<!-- Gets the configuration from database using a transformer. The transformer populates the configuration entries in a POJO and puts that in a session.  -->
<custom-transformer  class="com.test.DbGetConfigsTransformer" doc:name="Get Integration Configs"/>
....<!-- some code to process data -->
<logger message="$$$: #[sessionVars['currentFeed'].getFilePattern()]" doc:name="Set JSON File Name" /> -->
<file:outbound-endpoint path="/temp" outputPattern="#[sessionVars['currentFeed'].getFilePattern()]" responseTimeout="10000" mimeType="text/plain" connector-ref="File-Data" doc:name="Save File"/>

Приведенный выше код выдает следующую ошибку:

1. The filename, directory name, or volume label syntax is incorrect (java.io.IOException)
  java.io.WinNTFileSystem:-2 (null)
2. Unable to create a canonical file for /temp/Test_User_#[function:datestamp:YYYYMMddhhmmss.sss] (org.mule.api.MuleRuntimeException)
  org.mule.util.FileUtils:354 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MuleRuntimeException.html)
3. Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=file:///temp, connector=FileConnector

В таблице базы данных имя поля называется FilePattern и имеет значение «Test_User_# [функция: отметка даты: ГГГГММддччммсс.sss]. Если я жестко запрограммирую значение или перенесу это значение в файл конфигурации мула

file.name=Test_User_#[function:datestamp:YYYYMMddhhmmss.sss]

и используйте синтаксис свойства конфигурации (например, ${file.name} в «outputpattern»), это работает. Но если я читаю то же самое из БД и использую его, он не работает и выдает ошибку. Регистратор отображает как (который читается из базы данных)

$$$: Test_#[function:datestamp:YYYYMMddhhmmss.sss]    

Любая помощь горячо приветствуется.


person Tech Matrix    schedule 17.03.2014    source источник
comment
Вы используете супер старый синтаксис выражений. Вместо этого попробуйте MEL. См.: mulesoft. org/documentation/display/current/   -  person David Dossot    schedule 18.03.2014
comment
Дэвид, возможно, я неправильно понял это, но как мне это использовать здесь, потому что фактический шаблон (Test_User_# [функция: отметка даты: ГГГГММддччммсс.сссс]) хранится в БД, и я назначаю этот шаблон из переменной сеанса в 'атрибут выходного шаблона'. Я попробовал #[server.dateTime.format(#[sessionVars['currentFeed'].getFilePattern()])], но это дало мне ошибку по очевидной причине, что в скороговорке есть текст ("Test_").   -  person Tech Matrix    schedule 18.03.2014
comment
Не нужно вкладывать выражения: #[server.dateTime.format(sessionVars['currentFeed'].getFilePattern())]   -  person David Dossot    schedule 18.03.2014
comment
Понял. Но это выражение завершилось ошибкой с сообщением об ошибке «Стек исключений: 1. Недопустимый символ шаблона« T »(java.lang.IllegalArgumentException) java.text.SimpleDateFormat:-1 (null)». Причина, по которой он должен исходить из базы данных, а не из файла конфигурации мула, заключается в том, что префикс этого шаблона файла (в этом примере — «Test_») будет меняться, и он будет настроен по мере поступления новой записи. Поток будет прочитайте эти записи, зациклите их и создайте эти файлы. Итак, то, что я храню в базе данных, будет указывать среду_‹дата-время›, чтобы однозначно различать файлы.   -  person Tech Matrix    schedule 18.03.2014


Ответы (1)


Если формат вашей метки даты не меняется, вы должны просто сохранить префикс среды в своей базе данных и использовать что-то вроде:

outputPattern="#[sessionVars['prefix']+server.dateTime.format('YYYYMMddhhmmss.sss')]"

Если вам нужно использовать текущие значения базы данных, вы можете использовать основные строковые методы Java для поиска правильных подстрок. Например:

#[sessionVars['currentFeed'].getFilePattern().substring(0,sessionVars['currentFeed'].getFilePattern().indexOf('function')-2)+server.dateTime.format('YYYYMMddhhmmss.sss')]

Если вы используете другие форматы меток даты, вы также можете найти эту часть, используя аналогичные методы String. Тем не менее, я все же предлагаю вам придумать реализацию, которая хранит только префикс среды в файле db.

person Anton Kupias    schedule 18.03.2014
comment
Спасибо Антон. Я почти пришел к такому же выводу (сохраняя только префикс). Спасибо Дэвиду, так как его комментарий также помог мне указать правильное направление. - person Tech Matrix; 18.03.2014