barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

вторник, 17 декабря 2013 г.

WSO2 ESB JMS-прокси: использование transport.jms.ContentType для POX и SOAP-сообщений в очереди

Вопрос

Пусть есть некий JMS-to-XXX прокси-сервис (в роли XXX может быть HTTP или что-то более экзотическое). Вопрос: какое значение нужно устанавливать в параметре transport.jms.ContentType сервиса в зависимости от того, что лежит в JMS: готовое SOAP-сообщение или только полезная нагрузка (т.е. POX):
    <parameter name="transport.jms.ContentType">
        <rules xmlns="http://ws.apache.org/ns/synapse">
            <jmsProperty>contentType</jmsProperty>
            <default>???</default>
        </rules>
    </parameter>
Ответ
  • Для SOAP 1.1: text/xml
  • Для SOAP 1.2: application/soap+xml
  • Для POX: application/xml
(насчет SOAP 1.2 точно не уверен - сам не тестировал)

ЗЫ Описанное выше справедливо и для VFS-to-XXX прокси-сервиса.

суббота, 14 декабря 2013 г.

WSO2 ESB: редеплой сервиса, использующего VFS TransportReceiver

Проблема

Сделал редеплой прокси-сервиса (нажатием на соотв. кнопку в веб-консоли или просто изменив xml-ку конфигурации прокси и сохранив изменения, не суть), использующегося VFS в качестве входящего транспорта. После этого в логах стали наблюдаться ошибки вида:
2013-10-16 21:10:01,598 [-] [evfs-Worker-18] DEBUG VFSTransportListener Error receiving message
org.apache.axis2.AxisFault: The <Proxy_service_name> service, which is not valid, does not belong to the <Proxy_service_name> service group.
at org.apache.axis2.context.ServiceGroupContext.getServiceContext(ServiceGroupContext.java:143)
...
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:168)
at org.apache.axis2.transport.base.AbstractTransportListener.handleIncomingMessage(AbstractTransportListener.java:328)
at org.apache.synapse.transport.vfs.VFSTransportListener.processFile(VFSTransportListener.java:498)
...
2013-10-16 21:10:01,613 [-] [evfs-Worker-18] ERROR VFSTransportListener Error processing File URI : file:////10.xxx.yyy.zzz/some/path/file12345.pdf
org.apache.axis2.AxisFault: Transport out has not been set
at org.apache.axis2.engine.AxisEngine.sendFault(AxisEngine.java:522)
at org.apache.axis2.transport.base.AbstractTransportListener.handleIncomingMessage(AbstractTransportListener.java:336)
at org.apache.synapse.transport.vfs.VFSTransportListenerExtendable.processFile(VFSTransportListener.java:498)
at ...
Причина

Причина здесь вероятнее всего в том, что в момент редеплоя прокси-сервиса его входящий транспорт находился в процессе обработки файлов, находящихся в его входящей директории, и после передеплоя сервиса не произошло прозрачного для транспорта переключения со старой версии прокси-сервиса на новую версию. Такая ситуация чревата чем, что все файлы, которые транспорт обработал после редеплоя прокси-сервиса будут обработаны как ошибочные (будут удалены / перемещены в соотв. директорию в зависимости от настроек прокси-сервиса).

Выводы

Чтобы безболезненно редеплоить прокси-сервис, использующий VFS-транспорт в качестве входящего, нужно либо чтобы во входящей директории не было файлов для обработки, либо, по крайней мере, чтобы транспорт находился в состоянии ожидания следующего момента просмотра входящей папки, а не в цикле ее просмотра.

четверг, 5 декабря 2013 г.

Симуляция Connection Timout

Иногда для тестирования необходимо симулировать таймаут соединения. Наиболее просто способ это сделать - попытаться подключиться на любой порт немаршрутизируемого ip-адреса, например, 10.255.255.1. Другой вариант - на какой-нибудь заведомо непрослушиваемый порт публичного хоста, на котором пакеты просто дропаются, например, ya.ru:8280.
ЗЫ Немного оффтопа: ошибка WSO2 ESB "Connection timeout For : xxx.xxx.xxx.xxx:yyyy" говорит не о таймауте соединения, а о таймауте чтения ("Read timeout"). Таймаут соединения в терминах WSO2 ESB звучит как "Timeout connecting to : /xxx.xxx.xxx.xxx:yyyy".

среда, 4 декабря 2013 г.

WSO2 ESB: развертывание Message Store из CAR-ника

Проблема

WSO2 ESB 4.5.1. Пытаюсь развернуть CAR-ник, собранный WSO2 Developer Studio 3.2.0 и содержащий Message Store. Хранилище не деплоится.

Причина

Соответствующий артефакт распаковывается в папку
%WSO2_HOME%\repository\deployment\server\synapse-configs\default\message-store
вместо
 %WSO2_HOME%\repository\deployment\server\synapse-configs\default\message-stores
Причина - баг в Carbon'е (https://wso2.org/jira/browse/CARBON-14063), исправлен в версии 4.1.0, а, значит, исправление попало только в WSO2 ESB 4.7.0+.

Решение

Либо деплоить Message Store руками, либо пересобирать SynapseAppDeployerConstants.

Windows: установка атрибута "Accessed" ("Открыт") у файлов / папок

Лично у меня в винде по-умолчанию время последнего доступа к файлу/папке не обновляется, т.к. соответствующая настройка выключена. Проверяется это выполнением из-под администратора команды:
fsutil behavior query disablelastaccess
Если команда выводит: 
DisableLastAccess = 1
значит, обновление данного атрибута действительно выключено. 
Если его нужно включить (например, данный флаг используется каким-либо ПО), нужно выполнить (опять таки из-под админа):
fsutil behavior set disablelastaccess 0
и перезагрузиться.

вторник, 19 ноября 2013 г.

Maven: Compilation failure без объяснения причин

Проблема

При запуске компиляции с помощью mvn валится ошибка "Compilation failure", которой не предшествует какой бы то ни было ругани javac-а, как это обычно бывает при некомпилируемом коде. При использовании ключа -e валится stacktrace, не сильно информативнее:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.
0:compile (default-compile) on project project-core: Compilation failure -> [Help
1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal o
rg.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile) on p
roject project-core: Compilation failure
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:213)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:153)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:145)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
ct(LifecycleModuleBuilder.java:84)
        ...
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.jav
a:230)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(La
uncher.java:409)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:
352)
Caused by: org.apache.maven.plugin.compiler.CompilationFailureException: Compila
tion failure
        at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(Abstrac
tCompilerMojo.java:749)
        at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.ja
va:118)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(Default
BuildPluginManager.java:101)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor
.java:209)
        ... 19 more
[ERROR]
[ERROR]
[ERROR] For more information about the errors and possible solutions, please rea
d the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc
eption
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
Причина

Пролить свет на причину ошибки помог анализ вывода запуска mvn с ключем -X, включающим вывод кучи отладочной информации. В частности, в выводе обнаружилась следующая строчка:
[DEBUG]   (f) executable = C:/Program Files (x86)/Java/jdk1.6.0_25/bin/javac.exe
Она привлекла внимание по той причине, что JAVA_HOME смотрит вовсе не туда, и вообще указанный путь не существует. Залез в settings.xml, и действительно, увидел там вот это:
<properties>
   <java.1.6.home>C:/Program Files (x86)/Java/jdk1.6.0_25</java.1.6.home>
   <java.1.6.compiler>${java.1.6.home}/bin/javac.exe</java.1.6.compiler>
</properties>
Исправление данного пути на корректный поправило компиляцию (впрочем, можно было бы и удалить этот блок вообще и понадеяться на переменные окружения).

понедельник, 18 ноября 2013 г.

Weblogic: использование зашифрованного пароля в конфигурации DataSource

Хранить пароль от БД в конфигурации DataSource можно и в открытом виде, т.е.:
    <properties>
      <property>
        <name>user</name>
        <value>user1</value>
      </property>
      <property>
        <name>password</name>
        <value>11111</value>
      </property>
    </properties>
Однако, порой это недопустимо из соображений безопасности. В таком случае подойдет хранение зашифрованного пароля, для этого предназначен специальный тег <password-encrypted>:
<properties>
<property>
<name>user</name>
<value>user1</value>
</property>
</properties>
<password-encrypted>{3DES}IQHx+vYPxQI5k1W1Dbwubw==</password-encrypted>
Чтобы поместить туда пароль, его сначала нужно зашифровать. Делается это так:
  1. Идем в DOMAIN_HOME
  2. Выполняем:
    setDomainEnv.cmd
    или
    . ./setDomainEnv.sh
    Наличие точки в начале команды для Unix важно, т.к. скрипт устанавливает переменные окружения, и без точки они не будут видны в вызывающем shell'е, из-за чего при выполнении следующего шага получим:
    Could not find or load main class weblogic.security.Encrypt
  3. Выполняем:
    java weblogic.security.Encrypt 11111
  4. Используем полученный зашифрованный пароль внутри <password-encrypted>
Спасибо http://middlewaremagic.com/weblogic/?p=1400