четверг, 29 марта 2012 г.

Конфигурирование автоматической миграции JMS-серверов

Описание: WebLogic-кластере приложения и Data Source-ы могут быть распределены на всех узлах кластера, но есть несколько типов singleton-ресурсов, которые должны быть в единственном экземпляре в кластере:
  • JMS-сервера и их destinations;
  • JMS SAF-агенты;
  • Persistance store;
  • Менеджер транзакций и его логи;
  • Созданные пользователем классы (должен быть имплементирован интерфейс weblogic.cluster.singleton.SingletonService).
Для обеспечения высокой доступности данных ресурсов используются два подхода:
  • Миграция всего Managed-сервера;
  • Миграция сервисов (т.е. данных singleton-ресурсов с одного Managed-сервера на другой в Weblogic-кластере).

В данной статье пойдёт речь об автоматической миграцией JMS-ресурсов в конфигурации из двух физических серверов (с точки зрения операционной системы).

Последовательность шагов:
  1. Создадим два Managed-сервера, например jms_server1 и jms_server2:
  2. Создадим кластер, например JMS_Cluster и добавим ранее созданные Managed-сервера:
  3. Создадим две Machine и соотнесём их с каждым Managed-сервером:
  4. Создадим Data Source для целей миграции, например MigrationDS:
  5. Создадим JDBC Persistence Store, например JDBCStore1:
  6. Создадим JMS-сервер, например JMSServer1:
  7. Создадим JMS-модуль, например JMSModule1:
  8. Создадим в JMSModule1 новый Subdeployment, например JMSServer1Sub, и назначим его на JMSServer1:
  9. В JMSModule1 создадим Connection Factory и очередь, например JMSConnectionFactory и TestQueue соответственно, и соотвесём их с SubDeployment - JMSServer1Sub:
  10. Перейти в JMS_Cluster на страницу "Configuration"->"Migration" и выбрать тип механизма контроля миграции, в нашем случае будем использовать Database и выберем созданный (на шаге 4) Data Source - MigrationDS:
  11. Создадим необходимую служебную таблицу для механизма контроля миграции, для этого надо выполнить скрипт лежащий в $MW_HOME/wlserver_10.3/server/db/<СУБД>/leasing.ddl.
  12. Затем перейти в "Environment"->"Migratable Targets" выбрать "jms_server1 (migratable)" и изменить Service Migration Policy, например:
  13. Аналогично для "jms_server2 (migratable)":
  14. Перезапустить AdminServer, а после этого запустить jms_server1 и jms_server2:
  15. Тестируем миграцию JMS-сервера. Например с помощью данного консольного клиента.

среда, 28 марта 2012 г.

Простой консольный JMS-клиент для Weblogic Server

Возникла необходимость тестирования миграции JMS-очередей (queue-типа), для этого сделана утилита для:
  • отправки текстовых сообщений в очередь;
  • получения сообщений из очереди.
Скомпилированный jar-файл здесь, а исходный код здесь.

Как настроить соединение с сервером:
В jar-файле есть текстовый файл connection.properties - параметры соединения хранятся в нём.
Пример содержимого данного файла:
 url=t3://192.168.2.130:7501,192.168.2.96:7502  
 user=weblogic  
 password=welcome1  
 queue=jms/Queue  
 connectionFactory=jms/JMSConnectionFactory  
 textMessage=<elem><val1>#DATE_LONG#</val1><val2>#RND#</val2><val3>#DATE#</val3></elem>    
где textMessage - шаблон сообщения для отправки. Можно использовать следующие подстановочные значения:
  • #DATE_LONG# - текущая дата в формате количества милисекунд с 1 января 1970 года;
  • #DATE# - текущая дата в формате "ЧАСЫ:МИНУТЫ:СЕКУНДЫ.МИЛИСЕКУНДЫ ДЕНЬ-МЕСЯЦ-ГОД";
  • #RND# - произвольное целое число в диапазоне от 0 до 10000.

Как запустить:
  • Отправка сообщений в очередь, например:
     java -classpath C:\Apps\SimpleClientForJMS.jar;C:\Apps\Oracle\Weblogic\10.3.5\wlserver_10.3\server\lib\weblogic.jar com.blogspot.stan1slav.jms.testing.SimpleJMSClient send 12  
    
    где C:\Apps\Oracle\Weblogic\10.3.5\wlserver_10.3\server\lib\weblogic.jar - путь к weblogic.jar;
          12 - какое кол-во сообщений отправить в очередь.
  • Забрать сообщения из очереди, например:
     java -classpath C:\Apps\SimpleClientForJMS.jar;C:\Apps\Oracle\Weblogic\10.3.5\wlserver_10.3\server\lib\weblogic.jar com.blogspot.stan1slav.jms.testing.SimpleJMSClient receive 10  
    
    где 10 - сколько секунд ожидать получение новых сообщенийю

вторник, 27 марта 2012 г.

Ошибка "BEA-149265 java.lang.IllegalArgumentException: Cannot convert value of type" и вариант её решения

Ошибка:
После создания домена с SOA Suite (может быть и в других случаях) не стартует SOA-INFRA, а в логе серверы фигурирует ошибка:
 ...  
 WARNING: unable to read logging configuration from file '/u01/WLS/user_projects/domains/jms_domain/config/fmwconfig/servers/soa_server1/logging.xml'; exception: oracle.core.ojdl.logging.LoggingConfigurationException: ODL-52049: cannot create instance of class 'oracle.dfw.incident.IncidentDetectionLogFilter': java.lang.ExceptionInInitializerError  
 oracle.core.ojdl.logging.LoggingConfigurationException: ODL-52049: cannot create instance of class 'oracle.dfw.incident.IncidentDetectionLogFilter': java.lang.ExceptionInInitializerError  
      at oracle.core.ojdl.logging.impl.LoggingConfigurationImpl.getInstance(LoggingConfigurationImpl.java:651)  
      at oracle.core.ojdl.logging.impl.LoggingConfigurationImpl.access$000(LoggingConfigurationImpl.java:104)  
 ...  
 <Mar 26, 2012 3:46:31 PM MSD> <Critical> <WebLogicServer> <BEA-000286> <Failed to invoke startup class "DMS-Startup", java.lang.NoClassDefFoundError: oracle/dfw/impl/common/TempFileManager  
 java.lang.NoClassDefFoundError: oracle/dfw/impl/common/TempFileManager  
      at oracle.dfw.spi.portable.PortableDiagnosticsFrameworkProvider.init(PortableDiagnosticsFrameworkProvider.java:120)  
 ...  
 WARNING: Error during preRegister for MBean oracle.dfw:name=Streamer,type=oracle.dfw.jmx.Streaming  
 java.lang.RuntimeException: java.lang.NoClassDefFoundError: oracle/dfw/impl/common/TempFileManager  
      at oracle.as.jmx.framework.generic.spi.interceptors.LoggingMBeanInterceptor.internalPreRegister(LoggingMBeanInterceptor.java:663)  
 ...  
 Mar 26, 2012 3:46:33 PM oracle.as.jmx.framework.LoggerHelper log  
 WARNING: Error initializing MBean "oracle.dfw:name=Streamer,type=oracle.dfw.jmx.Streaming", declared in file "/u01/WLS/user_projects/domains/jms_domain/config/fmwconfig/servers/soa_server1/mbeans/dfw_mbeans.xml".  
 javax.management.RuntimeMBeanException: RuntimeException thrown in preRegister method  
      at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.preRegisterInvoke(DefaultMBeanServerInterceptor.java:1012)  
 ...  
 Mar 26, 2012 3:46:33 PM oracle.as.jmx.framework.LoggerHelper log  
 WARNING: Error during preRegister for MBean oracle.dfw:name=DiagnosticsConfig,type=oracle.dfw.jmx.DiagnosticsConfigMBean  
 java.lang.RuntimeException: java.lang.NoClassDefFoundError: oracle/dfw/impl/common/TempFileManager  
      at oracle.as.jmx.framework.generic.spi.interceptors.LoggingMBeanInterceptor.internalPreRegister(LoggingMBeanInterceptor.java:663)  
 ...  
 ...  
 WARNING: Error during postRegister for MBean oracle.adf.share.config:ApplicationName=soa-infra,name=ADFConfig,type=ADFConfig,Application=soa-infra  
 java.lang.RuntimeException: java.lang.NoClassDefFoundError: oracle/dfw/impl/common/TempFileManager  
      at oracle.as.jmx.framework.generic.spi.interceptors.LoggingMBeanInterceptor.internalPostRegister(LoggingMBeanInterceptor.java:703)  
 ...  
 SEVERE: Failed to register config mbean for soa-infra.  
 SEVERE:   
 javax.management.RuntimeMBeanException: RuntimeException thrown in postRegister method  
      at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.postRegisterInvoke(DefaultMBeanServerInterceptor.java:1037)  
 ...  
 Caused by: java.lang.NoClassDefFoundError: oracle/dfw/impl/common/TempFileManager  
      at oracle.dfw.spi.portable.PortableDiagnosticsFrameworkProvider.init(PortableDiagnosticsFrameworkProvider.java:120)  
 ...  

Причина:
Во временных директориях закончилось свободное место или нет привилегий.

Вариант решения:
  1. Остановить все Managed-серверы и Admin-сервер.
  2. Очистить временные директории и дать права записи:
      $ cd /var/tmp/  
      $ rm -rf ora*  
      $ chmod 777 /var/tmp/  
      $ cd /tmp  
      $ rm -rf *  
      $ chmod 777 /tmp  
    
  3. Запустить все Managed-серверы и Admin-сервер.

понедельник, 26 марта 2012 г.

Настройка NFS на Linux

  1. Залогиниться на сервер NFS (в нашем случае 192.168.2.95).
  2. Добавляем в файл /etc/exports на сервере:
     /u02/data         192.168.2.96(rw,no_root_squash)  
    
    где 192.168.2.96 - ip-адрес или доменное имя клиента;
           /u02/data - директория на сервере.
  3. Перезапустить сервер NFS:
     $ /etc/init.d/nfs restart  
     ..................................................................  
     Starting NFS services:                     [ OK ]  
     Starting NFS quotas:                       [ OK ]  
     Starting NFS daemon:                       [ OK ]  
     Starting NFS mountd:                       [ OK ]  
    
  4. Залогиниться на клиент NFS (в нашем случае 192.168.2.96).
  5. Необходимо подмонтировать данный ресурс в директорию:
     $ mount 192.168.2.95:/u02/data /share  
    
    где 192.168.2.95 - адрес сервера;
           /u02/data - расшаренная директория на сервере;
           /share - директория на клиенте.
  6. Если нужно чтобы сетевая папка монтировалась автоматически при старте системы, тогда добавляем в файл /etc/fstab:
     192.168.2.95:/u02/data /share nfs timeo=50,hard,intr  
    
  7. В случае невозможности подмонтирования сетевого ресурса необходимо разрешить доступ к портам (111, 2049) настройкой firewall (лучше) или выполнить следующую команду (хуже) на сервере:
     $ service iptables stop  
    
    Или отключить полность:
     $ chkconfig iptables off 
    

четверг, 15 марта 2012 г.

Клонирование Oracle Fusion Middleware 11g

Клонирование Oracle Fusion Middleware 11g (SOA Suite, ODI, IDM, Webcenter и т.д.) условно можно разделить на две логические части:
  • Клонирование Middleware Home;
  • Клонирование доменов.
Существует несколько ограничений по клонированию:
  • окружения должны быть идентичными, т.к. сервер назначения и сервер источник должны иметь одну и ту же операционную систему и разрядность (32 или 64);
  • система назначения и система источник должны иметь одного и того же административного пользователя (например, weblogic), но пароли могут быть различны. После завершения клонирования можно изменить пользователя.
Клонирование СУБД и других внешних систем, которые используются в приложениях/композитах выходят за рамки данной статьи.

Клонирование Middleware Home

Типовая структура Middleware Home (MW_HOME):
  1. Останавливаем все сервера (AdminServer и ManagedServer-а) всех доменов (на источнике), которые используют клонируемый Middleware Home;
  2. На источнике перейти в директорию:
     $ cd $MW_HOME/oracle_common/bin/  
  3. Затем выполнить команду:
     $ ./copyBinary.sh -javaHome /opt/jrockit-jdk1.6.0_26-R28.1.4-4.0.1/ 
    -archiveLoc /tmp/mw_copy.jar -sourceMWHomeLoc /opt/Middleware/
    где javaHome – директория c JDK;
          archiveLoc – имя файла для экспорта;
          sourceMWHomeLoc – директория в которой развернут MW_HOME.

  4. Скопировать файл экспорта с сервера источника на сервер назначения. А так же следующие файлы:
     $ ls $MW_HOME/oracle_common/bin/pasteBinary.sh  
     $ ls $MW_HOME/oracle_common/jlib/cloningclient.jar  
    

  5. Запускаем импорт Middleware Home на сервере назначения:
     $ ./pasteBinary.sh -javaHome /u01/jdk1.6.0_30/ 
    -archiveLoc mw_copy.jar -targetMWHomeLoc /u01/ofm  
    
    где javaHome – директория c JDK;
          archiveLoc – имя файла для импорта;
          targetMWHomeLoc – директория в которой будет развернут MW_HOME.

Клонирование доменов

  1. Проверяем, что все сервера домена (на источнике) для клонирования стартованы.
  2. Если в домене есть machine типа Unix Machine, то необходимо изменить её на тип Machine. Для этого необходимо:
     $ cp $DOMAIN_HOME/config/config.xml $DOMAIN_HOME/config/config.xml.bkp  
     $ vi $DOMAIN_HOME/config/config.xml  
    
    Далее найти следующую строку (или строки если несколько машин):
     <machine xsi:type="unix-machineType">  
    
    И заменить её (или их) на:
     <machine>  
    
    После этого перезапустить AdminServer.
  3. На сервере источнике перейти в директорию:
     $ cd $MW_HOME/oracle_common/bin/  
    
  4. Затем выполнить на источнике команду:
     $ ./copyConfig.sh -javaHome /opt/jrockit-jdk1.6.0_26-R28.1.4-4.0.1/  
                    -archiveLoc /tmp/soa_domain.jar 
                    -sourceDomainLoc /opt/user_projects/domains/soa_domain/     
                    -sourceMWHomeLoc /opt/Middleware/                         
                    -domainHostName oracle-sb.tsretail.ru    
                    -domainPortNum 9000 
                    -domainAdminUserName weblogic 
                    -domainAdminPassword /tmp/wlspwd.txt  
    
    где javaHome – директория c JDK;
          archiveLoc – имя файла для экспорта;
          sourceDomainLoc – директория домена;
          sourceMWHomeLoc – директория в которой развернут MW_HOME;
          domainHostName – хост домена;
          domainPortNum – порт AdminServer-а;
          domainAdminUserName – логин администратора;
          domainAdminPassword – путь к текстовому файлу с паролем администратора.
  5. Скопировать файл экспорта с сервера источника на сервер назначения.
  6. На сервере назначения перейти в директорию:
     $ cd $MW_HOME/oracle_common/bin/  
    
  7. Запускаем генерацию плана переноса домена на сервере назначения:
     $ ./extractMovePlan.sh -javaHome /u01/jdk1.6.0_30  
                   -archiveLoc /home/weblogic/clone_domain/soa_domain.jar
                   -planDirLoc /home/weblogic/clone_domain/plan  
    
    где javaHome – директория c JDK;
          archiveLoc – имя файла для экспорта;
          planDirLoc – директория в которую будет сгенерирован план.
  8. Редактируем сгенерированный план переноса:
     $ vi /home/weblogic/clone_domain/plan/moveplan.xml  
    
    Следует обратить внимание на создание текстовых файлов содержащих пароли к Data Source-ам и указание пути к файлу с паролем для каждого конкретного Data Source-а.
  9. Если требуется, то можно и изменить параметры адаптеров, композитов и деплоймент планов в соответствующих директориях:
     $ /home/weblogic/clone_domain/plan/  
     $ ls -l  
     total 312  
     drwxr-xr-x 2 weblogic app  4096 Mar 14 10:47 adapters  
     drwxr-xr-x 2 weblogic app 12288 Mar 14 10:47 composites  
     drwxr-xr-x 2 weblogic app  4096 Mar 14 10:48 deployment_plans  
     -rw-r--r-- 1 weblogic app 274543 Mar 14 10:44 moveplan.xml  
    
  10. Запускаем импорт домена на сервере назначения:
     $ ./pasteConfig.sh -javaHome /u01/jdk1.6.0_30   
          -archiveLoc /home/weblogic/clone_domain/soa_domain.jar   
          -movePlanLoc /home/weblogic/clone_domain/plan/moveplan.xml  
          -targetDomainLoc /u01/user_projects/domains/clonned_soa_domain  
          -targetMWHomeLoc /u01/ofm/   
          -domainAdminPassword /home/weblogic/clone_domain/plan/domainpwd.txt  
    
    где javaHome – директория c JDK;
          archiveLoc – имя файла для экспорта;
          sourceDomainLoc – директория домена;
          movePlanLoc – имя файла плана переноса;
          targetDomainLoc – директория в которую импортируется домен;
          targetMWHomeLoc – директория в которой развернут MW_HOME;
          domainAdminPassword – путь к текстовому файлу с паролем администратора.