Показаны сообщения с ярлыком weblogic. Показать все сообщения
Показаны сообщения с ярлыком weblogic. Показать все сообщения

четверг, 1 марта 2018 г.

Ошибка "sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target" и вариант её решения

Ошибка:
После включения HTTPS (и отключения HTTP) может возникнуть следующая ошибка:
 <oracle.soa.bpel.engine.ws> <BEA-000000> <got FabricInvocationException  
 sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  
     at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)  
     at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)  
     at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)  
     at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)  
     at sun.security.validator.Validator.validate(Validator.java:260)  
     at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)  
     at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)  
     at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)  
     at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1454)  
     at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:213)  
     at sun.security.ssl.Handshaker.processLoop(Handshaker.java:913)  
     at sun.security.ssl.Handshaker.process_record(Handshaker.java:849)  
     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1035)  
     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1344)  
     at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:721)  
     at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)  
     at java.io.ByteArrayOutputStream.writeTo(ByteArrayOutputStream.java:167)  
     at HTTPClient.HTTPConnection.sendRequest(HTTPConnection.java:3398)  
     at HTTPClient.HTTPConnection.handleRequest(HTTPConnection.java:3310)  
     at HTTPClient.HTTPConnection$10.run(HTTPConnection.java:3061)  
     at HTTPClient.HTTPConnection$10.run(HTTPConnection.java:3052)  
     at HTTPClient.HttpClientConfiguration.doAction(HttpClientConfiguration.java:708)  
     at HTTPClient.HTTPConnection.doAction(HTTPConnection.java:5497)  
     at HTTPClient.HTTPConnection.setupRequest(HTTPConnection.java:3052)  
     at HTTPClient.HTTPConnection.Get(HTTPConnection.java:927)  
     at HTTPClient.HTTPConnection.Get(HTTPConnection.java:831)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.openAsStreamConnection(WSDLReaderImpl.java:548)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.readDocument(WSDLReaderImpl.java:438)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:377)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:627)  
     at oracle.j2ee.ws.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:605)  
     at oracle.j2ee.ws.common.jaxws.WSDLMetadata.readWsdlDefinition(WSDLMetadata.java:377)  
     at oracle.j2ee.ws.common.jaxws.WSDLMetadata.initPortsFromWsdl(WSDLMetadata.java:202)  
     at oracle.j2ee.ws.common.jaxws.WSDLMetadata.initPorts(WSDLMetadata.java:171)  
     at oracle.j2ee.ws.common.jaxws.WSDLMetadata.getPort(WSDLMetadata.java:444)  
     at oracle.j2ee.ws.common.jaxws.ServiceDelegateImpl.createDispatch(ServiceDelegateImpl.java:275)  
     at javax.xml.ws.Service.createDispatch(Service.java:352)  
     at oracle.integration.platform.blocks.soap.AbstractWebServiceBindingComponent.dispatchRequest(AbstractWebServiceBindingComponent.java:558)  
     at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.processOutboundMessage(WebServiceExternalBindingComponent.java:314)  
     at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.sendSOAPMessage(WebServiceExternalBindingComponent.java:1230)  
     at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.request(WebServiceExternalBindingComponent.java:815)  
     at oracle.integration.platform.blocks.mesh.SynchronousMessageHandler.doRequest(SynchronousMessageHandler.java:139)  
     at oracle.integration.platform.blocks.mesh.MessageRouter.request(MessageRouter.java:182)  
     at oracle.integration.platform.blocks.mesh.MeshImpl.request(MeshImpl.java:190)  
     at sun.reflect.GeneratedMethodAccessor1787.invoke(Unknown Source)  
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
     at java.lang.reflect.Method.invoke(Method.java:606)  
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)  
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)  
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)  
     at oracle.integration.platform.metrics.PhaseEventAspect.invoke(PhaseEventAspect.java:71)  
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)  
     at com.sun.proxy.$Proxy390.request(Unknown Source)  
     at oracle.fabric.CubeServiceEngine.requestToMesh(CubeServiceEngine.java:859)  
     at com.collaxa.cube.ws.WSInvocationManager.invoke(WSInvocationManager.java:279)  
     at com.collaxa.cube.engine.ext.common.InvokeHandler.__invoke(InvokeHandler.java:1131)  
     at com.collaxa.cube.engine.ext.common.InvokeHandler.handleNormalInvoke(InvokeHandler.java:626)  
     at com.collaxa.cube.engine.ext.common.InvokeHandler.handle(InvokeHandler.java:131)  
     at com.collaxa.cube.engine.ext.bpel.common.wmp.BPELInvokeWMP.__executeStatements(BPELInvokeWMP.java:74)  
     at com.collaxa.cube.engine.ext.bpel.common.wmp.BaseBPELActivityWMP.perform(BaseBPELActivityWMP.java:173)  
     at com.collaxa.cube.engine.CubeEngine.performActivity(CubeEngine.java:2721)  
     at com.collaxa.cube.engine.CubeEngine._handleWorkItem(CubeEngine.java:1197)  
     at com.collaxa.cube.engine.CubeEngine.handleWorkItem(CubeEngine.java:1100)  
     at com.collaxa.cube.engine.dispatch.message.instance.PerformMessageHandler.handleLocal(PerformMessageHandler.java:76)  
     at com.collaxa.cube.engine.dispatch.DispatchHelper.handleLocalMessage(DispatchHelper.java:251)  
     at com.collaxa.cube.engine.dispatch.DispatchHelper.sendMemory(DispatchHelper.java:330)  
     at com.collaxa.cube.engine.CubeEngine.endRequest(CubeEngine.java:4653)  
     at com.collaxa.cube.engine.CubeEngine.endRequest(CubeEngine.java:4584)  
     at com.collaxa.cube.engine.CubeEngine._createAndInvoke(CubeEngine.java:714)  
     at com.collaxa.cube.engine.CubeEngine.createAndInvoke(CubeEngine.java:559)  
     at com.collaxa.cube.engine.delivery.DeliveryService.handleInvoke(DeliveryService.java:535)  
     at com.collaxa.cube.engine.ejb.impl.CubeDeliveryBean.handleInvoke(CubeDeliveryBean.java:319)  
     at sun.reflect.GeneratedMethodAccessor2242.invoke(Unknown Source)  
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
     at java.lang.reflect.Method.invoke(Method.java:606)  
     at com.bea.core.repackaged.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)  
     at com.oracle.pitchfork.intercept.MethodInvocationInvocationContext.proceed(MethodInvocationInvocationContext.java:103)  
     at oracle.security.jps.ee.ejb.JpsAbsInterceptor$1.run(JpsAbsInterceptor.java:113)  
     at java.security.AccessController.doPrivileged(Native Method)  
     at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:324)  
     at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:460)  
     at oracle.security.jps.ee.ejb.JpsAbsInterceptor.runJaasMode(JpsAbsInterceptor.java:100)  
     at oracle.security.jps.ee.ejb.JpsAbsInterceptor.intercept(JpsAbsInterceptor.java:154)  
     at oracle.security.jps.ee.ejb.JpsInterceptor.intercept(JpsInterceptor.java:113)  
     at sun.reflect.GeneratedMethodAccessor1196.invoke(Unknown Source)  
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
     at java.lang.reflect.Method.invoke(Method.java:606)  
     at com.bea.core.repackaged.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)  
     at com.oracle.pitchfork.intercept.JeeInterceptorInterceptor.invoke(JeeInterceptorInterceptor.java:68)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)  
     at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.oracle.pitchfork.spi.MethodInvocationVisitorImpl.visit(MethodInvocationVisitorImpl.java:34)  
     at weblogic.ejb.container.injection.EnvironmentInterceptorCallbackImpl.callback(EnvironmentInterceptorCallbackImpl.java:54)  
     at com.oracle.pitchfork.spi.EnvironmentInterceptor.invoke(EnvironmentInterceptor.java:42)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.bea.core.repackaged.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)  
     at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)  
     at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  
     at com.bea.core.repackaged.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)  
     at com.sun.proxy.$Proxy371.handleInvoke(Unknown Source)  
     at com.collaxa.cube.engine.ejb.impl.bpel.BPELDeliveryBean_5k948i_ICubeDeliveryLocalBeanImpl.__WL_invoke(Unknown Source)  
     at weblogic.ejb.container.internal.SessionLocalMethodInvoker.invoke(SessionLocalMethodInvoker.java:39)  
     at com.collaxa.cube.engine.ejb.impl.bpel.BPELDeliveryBean_5k948i_ICubeDeliveryLocalBeanImpl.handleInvoke(Unknown Source)  
     at com.collaxa.cube.engine.dispatch.message.invoke.InvokeInstanceMessageHandler.handle(InvokeInstanceMessageHandler.java:30)  
     at com.collaxa.cube.engine.dispatch.DispatchHelper.handleMessage(DispatchHelper.java:141)  
     at com.collaxa.cube.engine.dispatch.BaseDispatchTask.process(BaseDispatchTask.java:89)  
     at com.collaxa.cube.engine.dispatch.BaseDispatchTask.run(BaseDispatchTask.java:65)  
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)  
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)  
     at com.collaxa.cube.engine.dispatch.Dispatcher$ContextCapturingThreadFactory$2.run(Dispatcher.java:933)  
     at java.lang.Thread.run(Thread.java:745)  
 >  

Причина:
Не до конца завершена конфигурация HTTPS (TLS).

Вариант решения:
Необходимо добавить в параметры старта Weblogic-серверов следующие свойства:
 -Djavax.net.ssl.trustStoreType=JKS  
 -Djavax.net.ssl.trustStorePassword=XXXXX  

среда, 16 марта 2016 г.

Ошибка при создании домена по умолчанию в JDeveloper 12.2.1 на платформе Windows 10

Ошибка:
 wlst >   
 wlst > Initializing WebLogic Scripting Tool (WLST) ...  
 wlst >   
 wlst > Welcome to WebLogic Server Administration Scripting Shell  
 wlst >   
 wlst > Type help() for help on available commands  
 wlst >   
 wlst > Failed to get environment, environ will be empty: (0, u'Failed to execute command ([\'sh\', \'-c\', \'env\']): java.io.IOException: Cannot run program "sh": CreateProcess error=2, \u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u043D\u0430\u0439\u0442\u0438 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044B\u0439 \u0444\u0430\u0439\u043B')  
 wlst > Error: ADRS_DOMAIN_PASSWORD environment variable not set.  
 wlst >   
 wlst >   
 wlst > Exiting WebLogic Scripting Tool.  
 wlst >   

Варианты решения:
1. Изменить архиве
%JDEVELOPER_HOME%/wlserver/common/wlst/modules/jython-modules.jar следующий файл \Lib\javashell.py (добавленное выделено красным):
   ...
   os = str(os or sys.registry.getProperty( "python.os" ) or \  
         System.getProperty( "os.name" ))  
   _osTypeMap = (  
     ( "nt", ( 'nt', 'Windows NT', 'Windows NT 4.0', 'WindowsNT',  
          'Windows 2000', 'Windows 2003', 'Windows XP', 'Windows CE',  
          'Windows Vista', 'Windows Server 2008', 'Windows 7', 'Windows 8',   
          'Windows 10', 'Windows Server 2012' )),  
     ( "dos", ( 'dos', 'Windows 95', 'Windows 98', 'Windows ME' )),  
     ( "mac", ( 'mac', 'MacOS', 'Darwin' )),  
     ( "None", ( 'None', )),  
     )
   ...  

2. Открыть сервисный запрос (SR) в поддержку и получить официальный патч.

среда, 1 октября 2014 г.

Вторая часть освоения SOA

Требуется изучить:

Выполнить tutorial. Есть следующие полезные книги:
  • Getting Started With Oracle SOA Suite 11gR1 (главы 1-10,13-15,17)
  • Oracle SOA Suite 11g R1 Developers Guide (главы 1-8,11,13-14,18-21)
  • WS-BPEL 2.0 for SOA Composite Applications with Oracle SOA Suite 11g (главы 1-7 включительно)
Книги однотипные, главы связанные с BAM (Business Activity Monitorung) и OSB (Oracle Service Bus) пока не рассматриваем. Первые две книги содержат tutorial-ы. Пройдите от начала до конца одину из них (см. указанные главы). Обрати внимание, что оба tutorial-а по немного более старой версии SOA (например по 11.1.1.5), хотя на данный момент чаще всего используется версии 11.1.1.6 и 11.1.1.7 - поэтому скриншоты в книгах могут немного не совпадать.
После завершения tutorial просмотреть остальные книги на непроработанный/незатронутый функционал.

Выполнить задание:

  1. Создать две JMS Queue в Weblogic;
  2. Создать MDB, который перекладывает сообщения из одной очереди в другую;
  3. Развернуть на сервере и протестировать.

Полезные ссылки:

  1. Рекомендую использовать официальный developers guide по Oracle SOA, как справочник.
  2. Хороший блог по Oracle SOA на русском языке
  3. Блоги на английском:

вторник, 30 сентября 2014 г.

Первая часть освоения SOA

Требуется изучить:

Книг по XML много, в том числе и на русском. Дополнительно полезно знать XQuery. Нужно понимание функциональности и возможностей XQuery по сравнению с XSL. Рекомендую книгу «W3C XML: Xquery от экспертов. Руководство по языку запросов» или в оригинале «XQuery from the Experts: A Guide to the W3C XML Query Language».

  • Weblogic. Требуется разобраться:
    • Как минимум, в следующих технологиях:
      • JMS (Java Message Service)
      • MDB (Message Driven Bean)
      • JTA & JTS (Java Transaction API & Java Transaction Service)
    • В основах администрирования.

Полезные ссылки:

Освоение Oracle SOA

За основу данного набора статей взята моя переписка с начинающими разработчиками SOA, целью которой было вырастить разработчиков Oracle SOA Suite. Кроме переписки было обсуждение вопросов и задач через Skype. Формат следующий:

  • Что нужно изучить с ссылками на материалы;
  • Простейшие практические задачки;
  • Полезные ссылки.

Обращаю внимание, что этот набор статей не охватывает весь функционал Oracle SOA Suite, а включает только наиболее часто используемый функционал. Так же смотрите на полезные ссылки в постах пройдя по которым можно изучить неохваченный функционал.

Этот пост подержит ссылки на все посты из данного набора:

P.S. рекомендации приветствуются J

понедельник, 29 сентября 2014 г.

Список необходимых патчей для Oracle SOA & BPM Suite 11g PS6 (11.1.1.7)

Перечень патчей которые необходимо развернуть для Oracle SOA & BPM Suite 11g PS6 (11.1.1.7):
  • Patch 17294404: XSDCOMPLEXTYPE.GETCHILDELEMENTS() IS NOT THREAD SAFE
  • Patch 18325165: MERGE REQUEST ON TOP OF 11.1.1.7.0 FOR BUGS 16319620 16487002
  • Patch 18609527: SOA BUNDLE PATCH 11.1.1.7.4
  • Patch 18366461: NULLPOINTEREXCEPTION AT WEBSERVICEEXTERNALBINDINGCOMPONENT.GETINVOCATIONMETADATA
Скачать эти патчи можно c support.oracle.com.

P.S. список патчей будет дополняться (при необходимости).
P.P.S. рекомендации по патчам приветствуются :-)

понедельник, 6 января 2014 г.

Планировщик заданий в Weblogic Server

Реализовать планировщик заданий можно, как средствами встроенных в операционную систему(ОС) планировщиков заданий так и встроенных СУБД, но при изменении ОС (например, с Windows на AIX) либо изменении СУБД (например, с Oracle на MySQL) потребуется переработка компонента планировщика. Рассмотрим реализацию планировщика заданий работающего внутри Weblogic Server, который не зависит от ОС и СУБД.
Данный планировщик представляет собой простейшее Web-приложение и будет выполнять задачу через каждые 5 секунд, а задача при выполнении будет писать в лог строку с временем выполнения (никто не запрещает сделать более сложную логику). А так же будет создан сервлет для управления заданием (действия - остановить выполнение и запустить выполнение). Более того при создании не будут использоваться внешние библиотеки, только те которые есть в Weblogic Server.
  1. Открываем Oracle JDeveloper и создаём новое приложение (с именем SampleScheduler):
  2. Затем добавляем в проект необходимые библиотеки.
  3. Создаём новый класс для описания задания(с именем HelloWorldJob):
     package com.blogspot.stan1slav.sample.jobs;  
       
     import commonj.timers.CancelTimerListener;  
     import commonj.timers.Timer;  
     import commonj.timers.TimerListener;  
       
     import java.io.Serializable;  
       
     import java.util.Date;  
       
     public class HelloWorldJob implements Serializable, TimerListener,  
                        CancelTimerListener {  
       private Date timerDate = null;  
       
       public HelloWorldJob() {  
         super();  
       }  
       
       public void timerExpired(Timer timer) {  
         timerDate = new Date(timer.getScheduledExecutionTime());  
         System.out.println("HelloWorldJob timer expired called on " +  
                   timerDate);  
       }  
       
       public void timerCancel(Timer timer) {  
         timerDate = new Date(timer.getScheduledExecutionTime());  
         System.out.println("HelloWorldJob timer cancelled called on " +  
                   timerDate);  
       }  
     }  
    
    Следует обратить внимание на выделенное красным, это те классы которые должны быть имплементированы и методы которые должны быть реализованы (один при срабатывании задачи и другой для отмены/остановки задачи). Инициализацию задания можно вынести в конструктор.
  4. Создаём сервлет для старта/остановки задания, а так же автозапуска:
     package com.blogspot.stan1slav.sample;  
       
     import com.blogspot.stan1slav.sample.jobs.HelloWorldJob;  
       
     import commonj.timers.Timer;  
     import commonj.timers.TimerManager;  
       
     import java.io.IOException;  
     import java.io.PrintWriter;  
       
     import java.util.Date;  
       
     import javax.naming.InitialContext;  
       
     import javax.servlet.ServletConfig;  
     import javax.servlet.ServletException;  
     import javax.servlet.http.HttpServlet;  
     import javax.servlet.http.HttpServletRequest;  
     import javax.servlet.http.HttpServletResponse;  
       
     public class JobsServlet extends HttpServlet {  
       private Timer helloWorldJobTimer = null;  
       private TimerManager tm = null;  
       
       public void init(ServletConfig config) throws ServletException {  
         super.init(config);  
         System.out.println("InitJobsServlet is initialized ");  
       
         try {  
           InitialContext ic = new InitialContext();  
           tm = (TimerManager)ic.lookup("java:comp/env/tm/TimerManager");  
           helloWorldJobTimer =  
               tm.schedule(new HelloWorldJob(), new Date(), 5000); //5 seconds  
         } catch (Exception ne) {  
           ne.printStackTrace();  
         }  
       }  
       
       public void service(HttpServletRequest req,  
                 HttpServletResponse res) throws IOException {  
         res.setContentType("text/html");  
         PrintWriter out = res.getWriter();  
         out.println("<h4>JobsServlet is working!</h4>");  
         String cmd = req.getParameter("cmd");  
         if (cmd != null && cmd.equals("cancel") && helloWorldJobTimer != null) {  
           helloWorldJobTimer.cancel();  
           helloWorldJobTimer = null;  
         }  
         if (cmd != null && cmd.equals("start") && helloWorldJobTimer == null) {  
           helloWorldJobTimer =  
               tm.schedule(new HelloWorldJob(), new Date(), 5000);  
         }  
         if (helloWorldJobTimer != null) {  
           out.println("<h6>HelloWorldJob started</h6>");  
         } else {  
           out.println("<h6>HelloWorldJob calceled</h6>");  
         }  
       }  
     }  
    
  5. В web.xml прописать ссылку на ресурс (т.е. на наш TimerManager):
     <?xml version = '1.0' encoding = 'UTF-8'?>  
     <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
          version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">  
      <servlet>  
       <servlet-name>JobsServlet</servlet-name>  
       <servlet-class>com.blogspot.stan1slav.sample.JobsServlet</servlet-class>  
       <load-on-startup>100</load-on-startup>  
      </servlet>  
      <servlet-mapping>  
       <servlet-name>JobsServlet</servlet-name>  
       <url-pattern>/jobsservlet</url-pattern>  
      </servlet-mapping>  
      <resource-ref>  
       <res-ref-name>tm/TimerManager</res-ref-name>  
       <res-type>commonj.timers.TimerManager</res-type>  
       <res-auth>Container</res-auth>  
       <res-sharing-scope>Unshareable</res-sharing-scope>  
      </resource-ref>
     </web-app>  
    
  6. Деплоим на сервер (как WAR-архив) и проверяем работоспособность (смотрим в out-лог сервера)
    1. Задание выполняется после деплоя:
    2. С использованием сервлета остановим выполнение задания (для этого при вызове добавляем ?cmd=cancel):
    3. В логе появилась запись об остановке (отмене) задания:
    4. С использованием сервлета стартуем снова задание (для этого при вызове добавляем ?cmd=start):
    5. В логе появились записи о выполнении задания:
Полезная информация:

понедельник, 22 октября 2012 г.

Ошибка "java.lang.UnsupportedOperationException: Remote JDBC disabled" и варианты её решения

Ошибка:
При попытке удалённого доступа к DataSource-у Weblogic-сервера генерируется следующая ошибка:
 java.lang.UnsupportedOperationException: Remote JDBC disabled  
      at weblogic.rjvm.ResponseImpl.unmarshalReturn(ResponseImpl.java:234)  
      at weblogic.rmi.cluster.ClusterableRemoteRef.invoke(ClusterableRemoteRef.java:348)  
      at weblogic.rmi.cluster.ClusterableRemoteRef.invoke(ClusterableRemoteRef.java:259)  
      at weblogic.jdbc.common.internal.RmiDataSource_1036_WLStub.getConnection(Unknown Source)  
      at oracle.integration.platform.blocks.event.saq.SAQRemoteBusinessEventConnection.createConnection(SAQRemoteBusinessEventConnection.java:122)  
      at oracle.integration.platform.blocks.event.saq.SAQRemoteBusinessEventConnection.enqueueEvent(SAQRemoteBusinessEventConnection.java:67)  
      at oracle.integration.platform.blocks.event.saq.SAQRemoteBusinessEventConnection.publishEvent(SAQRemoteBusinessEventConnection.java:54)  
      ...  
 Caused by: java.lang.UnsupportedOperationException: Remote JDBC disabled  
      at weblogic.jdbc.common.internal.JDBCServerHelperImpl.<clinit>(JDBCServerHelperImpl.java:50)  
      at weblogic.jdbc.common.internal.JDBCService.initialize(JDBCService.java:91)  
      at weblogic.jdbc.common.internal.JDBCService.start(JDBCService.java:138)  
      at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)  
      at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)  
      at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)  
Причина:
Удалённый доступ к JDBC отключен в Weblogic Server.

Варианты решения:
Первый вариант:
  1. Перейти в директорию домена. Перейти в поддиректорию bin и изменить файл setDomainEnv.sh
  2. Найти свойство WLS_JDBC_REMOTE_ENABLED и изменить его значение с false на true:
     ...  
     WLS_JDBC_REMOTE_ENABLED="-Dweblogic.jdbc.remoteEnabled=true"  
     export WLS_JDBC_REMOTE_ENABLED  
     ...  
    
  3. Перестартовать все Managed-сервера домена.
Второй вариант:
  • Установить при запуске сервера системное свойство (как сделать см.здесь):
     -Dweblogic.jdbc.remoteEnabled=true  
    

воскресенье, 22 апреля 2012 г.

Рекомендации по настройке JVM для Weblogic Server в промышленном окружении

Внимание: описанные ниже рекомендации являются общими без учёта специфики конкретных приложений выполняющихся на сервере приложений Weblogic (например: некоторые фреймворки генерируют большое количество временных объектов, для этого случая, рекомендуется сделать размер nursery больше чем в общей рекомендации, но после проведения мониторинга JVM).

Общие рекомендации для любой JVM:
  • Установите одинаковый размер для initial heap size (параметр -Xms) и maximum heap size (параметр -Xmx);
  • Установить размер heap-а немного больше того, с которого нагрузочные тесты перестают получают исключение Out-of-Memory;
  • Не устанавливайте суммарный размер heap-а всех сервером на физической машине (с точки зрения ОС) больше чем 75% доступной памята.
Рекомендации для JRockit JVM:
  • Установите размер nursery (параметр -Xns) примерно 25-40% от размера heap-а;
  • Установите приоритетный уровень (параметр -XgcPrio) для сборщика мусора на значение по-умолчанию, т.е. throughput.
Рекомендации для Sun JVM:
  • Установите одинаковый размер для initial New Space (параметр -XX:NewSize) и maximum New Space (параметр -XX:MaxNewSize);
  • Установите значение New Space примерно 25% от размера heap-а;
  • Установите Survivor Ratio (параметр -XX:SurvivorRatio) значение 8.

среда, 18 апреля 2012 г.

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

Описание: Описана настройка автоматической миграции серверов в конфигуции с двумя физическими машинами.
ПО: RHEL 5.5, Weblogic 10.3.5.

Есть простой Weblogic-домен следующей конфигурации:
Weblogic сервера:
  • AdminServer - порт 7001;
  • mserver1 - порт 7100.
Есть две физические машины (с точки зрения ОС) с IP-адресами, например:
  • 192.168.2.130
  • 192.168.2.96

Последовательность шагов:
  1. Необходимо разрешить пользователю операционной системы под которым развернут Oracle FMW (в нашем случае - это weblogic) полномочия для запуска команд /sbin/ifconfig и /sbin/arping. Для этого пользователем root добавим в файл /etc/sudoers следующую строку (выделена красным):
     ......
     ## Next comes the main part: which users can run what software on  
     ## which machines (the sudoers file can be shared between multiple  
     ## systems).  
     ## Syntax:  
     ##  
     ##   user  MACHINE=COMMANDS  
     ##  
     ## The COMMANDS section may have other options added to it.  
     ##  
     ## Allow root to run any commands anywhere  
     root  ALL=(ALL)    ALL  
     weblogic    ALL=NOPASSWD:  /sbin/ifconfig,/sbin/arping  
    
     ## Allows members of the 'sys' group to run networking, software,  
     ## service management apps and more.  
     ...... 
  2. Для обеспечения работоспособности необходим дополнительный "плавающий"/виртуальный IP-адрес из той же подсети, например: 192.168.2.139. После этого выполнить следующие команды на первой машине:
     $ sudo /sbin/ifconfig eth0:1 192.168.2.139 netmask 255.255.252.0  
     $ sudo /sbin/arping -q -U -c 3 -I eth0 192.168.2.139  
    
  3. Добавить в переменную PATH следующее (лучше на уровне профиля пользователя, если используется bash, то это файл ~/.bash_profile):
     PATH=$PATH:$MW_HOME/wlserver_10.3/common/nodemanager:$MW_HOME/user_projects/domains/bam_domain/bin/server_migration:$MW_HOME/wlserver_10.3/common/bin  
     export PATH
    
  4. Зайти в mserver1 и ввести Server Listen Address - 192.168.2.139:
  5. Клонируем mserver1 (переходим в "Environment"->"Servers", выбираем mserver1 и нажимаем на кнопку "Clone"). Новый сервер:
    • Server Name - mserver2;
    • Server Listen Address - 192.168.2.96;
    • Server Listen Port - 7200.
  6. Создаем кластер:
    • Name - WLS_Cluster;
    • Messaging Mode - Unicast.
  7. Добавляем в данный кластер оба сервера - mserver1 и mserver2:
  8. На каждой физической машине (с т.з. операционной системы) сконфигурируем по Node Manager-у (подробнее здесь) и создадим две Weblogic-машины (Machines):
    • Machine1 - 192.168.2.130;
    • Machine2 - 192.168.2.96.
  9. Соотнесём Weblogic-сервера и Weblogic-машины следующий образом:
    • mserver1 - Machine1;
    • mserver2 - Machine2.
  10. Создать новый Data Source для механизма контроля миграции (если потребуется, то создать отдельного пользователя в СУБД. Не использовать административных пользователей, таких как SYS и SYSTEM) и соотнесём его с кластером WLS_Cluster:
  11. Создадим необходимую служебную таблицу для механизма контроля миграции, для этого надо выполнить скрипт лежащий в $MW_HOME/wlserver_10.3/server/db/<СУБД>/leasing.ddl.
  12. Если используется технология JMS, то перейти в "Services"->"Persistence Stores" и проверить какие типы Persistence Store-ов используются:
    • Если FileStore, то обеспечить доступ к директориям со второго сервера, как правило для этого используется раздел дискового массива или кластерной файловой системы.
    • Если JDBCStore, то соотнести используемый Data Source с кластером WLS_Cluster.
  13. Необходимо донастроить Node Manager-ы на каждой физической машине, добавить опции для сетевых интерфейсов в файл nodemanager.properties:
     Interface=eth0  
     NetMask=255.255.255.0  
     UseMACBroadcast=true  
    
    где eth0 - имя сетевого интерфейса на котором будет поднят "плавающий"/виртульный IP-адрес.
  14. Затем в Weblogic Console выбрать кластер WLS_Cluster и перейти в "Configuration"->"Migration" и заполнить поле "Data Source For Automatic Migration:", где выбрать созданный Data Source для механизма контроля миграции (см. пункт 11):
  15. Далее перейти в "Environment"->"Servers" выбрать mserver1. Перейти в "Configuration"->"Migration" и поставить галку "Automatic Server Migration Enabled". Аналогично для mserver1:
  16. Перезапустить сервера и протестировать миграцию.

среда, 11 апреля 2012 г.

Ошибка "BEA-149259 Server ... in cluster ... is being brought up in administration state due to failed deployments" и вариант её решения

Ошибка:
В Weblogic-кластере сервер (в моём случае soa_server) стартует в статус ADMIN, а в логе серверы фигурирует ошибка:
...
<Emergency> <Deployer> <BEA-149259> <Server 'soa_server' in cluster 'SOA_Cluster' is being brought up in administration state due to failed deployments.>   
...

Причина:
Особенность состояния ADMIN в Weblogic-сервере: ошибки возникающие в состоянии PREPARE заставляют сервер оставаться в фазе ADMIN.

Вариант решения:
Исправить ошибки в состоянии PREPARE (лучший вариант) или запускать сервер с ключом:
-Dweblogic.deployment.IgnorePrepareStateFailures=true

среда, 4 апреля 2012 г.

Weblogic Cluster: принцип работы Сonsensus leasing

В Weblogic Cluster есть два механизма контроля миграции:
  • Database - информация хранится/изменяется в СУБД;
  • Сonsensus - информация хранится в памяти.
В данной статье пойдёт речь об принципах работы механизма Сonsensus.

Принцип работы:
Допущение: для простоты восприятия принципа работы будем считать, что данные хранятся в виртуальной таблице в памяти мастера (никакого отношения к таблицам СУБД не имеет).

Все сервера кластера периодически отправляют информацию о статусе, так называемые лизы (от слова leasing) мастеру кластера, которую он кладёт в "виртуальную" таблицу в памяти, а от него в ответ получают текущую копию виртуальной таблицы - делается это для обеспечения отказоустойчивость при выходе из строя мастера.
Мастер выбирается всеми запущенными серверами кластера. Сервер становится мастером после одобрения большинства. Если Node Manager сообщает, что статус сервера:
  • остановлен (SHUTDOWN), то потенциальный мастер считает, что остановленный сервер одобрил его кандидатуру, как мастера;
  • неизвестен (UNKNOWN), то потенциальный мастер считает, что сервер не одобрил его кандидатуру;
  • запускается (STARTING), то состоится перевыбор мастера (так же это случится при выходе из строя самого мастера), где основной критерий выбора - наименьшее время старта сервера.
Механизм Сonsensus требует большинства серверов для продолжения функционирования: при выходе из строя (или невозможности доступа к мастеру) сервера кластер логически делится на две части - большая часть кластера продолжает, а меньшая завершает функционировать (переходит в статус FAILED).

В двухмашинной конфигурации использование Сonsensus Leasing проблематично и рекомендуется использование Database Leasing.

Пример:
При старте первого сервера он ищет остальных участников кластера, чтобы узнать есть ли мастер:
Если нет мастера, то он становится мастером:

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

воскресенье, 1 апреля 2012 г.

Кластеризация Oracle BAM 11g

Описание: Описана кластеризация BAM 11g в конфигуции с двумя физическими машинами.
ПО: RHEL 5.5, Weblogic 10.3.5, Oracle BAM 11.1.1.5 + некоторые патчи.

Есть простой BAM-домен следующей конфигурации:
Weblogic сервера:
  • AdminServer - порт 7001;
  • bam_server1 - порт 9001.
Есть две физические машины (с точки зрения ОС) с IP-адресами, например:
  • 192.168.2.130
  • 192.168.2.96
Создадим отказоустойчивую конфигурацию для Oracle BAM 11g.
Особенность: BAM Server является singleton-компонентом в Oracle BAM и может быть только один в Weblogic-домене. Его кластеризовать нельзя, обычно настраивается на него миграция сервера, а компоненты BAM Web кластеризуются как обычные Web-приложения.
Первоначальная конфигурация:
В случае выхода из строя первого физического сервера:

Последовательность шагов:
  1. Необходимо разрешить пользователю операционной системы под которым развернут Oracle BAM (в нашем случае - это weblogic) полномочия для запуска команд /sbin/ifconfig и /sbin/arping. Для этого пользователем root добавим в файл /etc/sudoers следующую строку (выделена красным):
     ......
     ## Next comes the main part: which users can run what software on  
     ## which machines (the sudoers file can be shared between multiple  
     ## systems).  
     ## Syntax:  
     ##  
     ##   user  MACHINE=COMMANDS  
     ##  
     ## The COMMANDS section may have other options added to it.  
     ##  
     ## Allow root to run any commands anywhere  
     root  ALL=(ALL)    ALL  
     weblogic    ALL=NOPASSWD:  /sbin/ifconfig,/sbin/arping  
    
     ## Allows members of the 'sys' group to run networking, software,  
     ## service management apps and more.  
     ...... 
  2. Для обеспечения работоспособности необходим дополнительный "плавающий"/виртуальный IP-адрес из той же подсети, например: 192.168.2.139. После этого выполнить следующие команды на первой машине:
     $ sudo /sbin/ifconfig eth0:1 192.168.2.139 netmask 255.255.252.0  
     $ sudo /sbin/arping -q -U -c 3 -I eth0 192.168.2.139  
    
  3. Добавить в переменную PATH следующее (лучше на уровне профиля пользователя, если используется bash, то это файл ~/.bash_profile):
     PATH=$PATH:$MW_HOME/wlserver_10.3/common/nodemanager:$MW_HOME/user_projects/domains/bam_domain/bin/server_migration:$MW_HOME/wlserver_10.3/common/bin  
     export PATH
    
  4. Зайти в bam_server1 и ввести Server Listen Address - 192.168.2.139.
  5. Клонируем bam_server1 (переходим в "Environment"->"Servers", выбираем bam_server1 и нажимаем на кнопку "Clone"). Новый сервер:
    • Server Name - bam_server2;
    • Server Listen Address - 192.168.2.96;
    • Server Listen Port - 9002.
  6. Создаем кластер:
    • Name - BAM_Cluster;
    • Messaging Mode - Unicast.
  7. Добавляем в данный кластер оба сервера - bam_server1 и bam_server2.
  8. На каждой физической машине (с т.з. операционной системы) сконфигурируем по Node Manager-у (подробнее здесь) и создадим две Weblogic-машины (Machines):
    • Machine1 - 192.168.2.130;
    • Machine2 - 192.168.2.96.
  9. Соотнесём Weblogic-сервера и Weblogic-машины следующий образом:
    • bam_server1 - Machine1;
    • bam_server2 - Machine2.
  10. Теперь соотнесём приложения и библиотеки с созданным нами кластером (BAM_Cluster), а не только с bam_server1:
    • DMS Application (11.1.1.1.0)
    • oracle-bam (11.1.1)
    • usermessagingdriver-email
    • usermessagingserver
    • wsil-wls
    • wsm-pm
  11. Соотнести приложение "oracle-bam (11.1.1)" следующим образом:
    oracle-bam(11.1.1)  BAM_Cluster
     /oracle/bam  bam_server1
     oracle-bam-adc-ejb.jar  bam_server1
     oracle-bam-ems-ejb.jar  bam_server1
     oracle-bam-eventengine-ejb.jar  bam_server1
     oracle-bam-reportcache-ejb.jar  bam_server1
     oracle-bam-statuslistener-ejb.jar  bam_server1
     OracleBAM  BAM_Cluster
     OracleBAMWS  BAM_Cluster
     sdpmessagingclient-ejb.jar  bam_server1
  12. Так же соотнести следующие Data Source-ы с кластером BAM_Cluster:
    • BAMDataSource;
    • mds-owsm;
    • OraSDPMDataSource.
  13. Соотнести следующие Startup and Shutdown Classes с BAM_Cluster:
    • JOC-Shutdown;
    • JOC-Startup
  14. Создать новый Data Source для механизма контроля миграции (если потребуется, то создать отдельного пользователя в СУБД. Не использовать административных пользователей, таких как SYS и SYSTEM) и соотнесём его с кластером BAM_Cluster.
  15. Создадим необходимую служебную таблицу для механизма контроля миграции, для этого надо выполнить скрипт лежащий в $MW_HOME/wlserver_10.3/server/db/<СУБД>/leasing.ddl.
  16. Перейти в "Services"->"Persistence Stores" и проверить какие типы Persistence Store-ов используются:
    • Если FileStore, то обеспечить доступ к директориям со второго сервера, как правило для этого используется раздел дискового массива или кластерной файловой системы.
    • Если JDBCStore, то соотнести используемый Data Source с кластером BAM_Cluster.
  17. Запустить bam_server1 и bam_server2.
  18. Зайти в Enterprise Manager (http://AdminServerHost:AdminServerPort/em) раскрыть меню BAM в нём должны быть три элемента:
    • OracleBamServer(bam_server1);
    • OracleBamWeb(bam_server1);
    • OracleBamWeb(bam_server2).
    Для каждого BAMWeb (OracleBamWeb(bam_server1) и OracleBamWeb(bam_server2)) нажать на них правой кнопкой мыши и выбрать "Mbean Browser" перейти в "oracle.bam.web"->"Server..."->"Application..."->"Config..." выбрать BAMWebConfig и изменить следующие параметры:
    • ServerName - IP-адрес или доменное имя BAM-сервера, в нашем случае это 192.168.2.139;
    • ServerPort - порт на котором запущен BAM-сервер, в нашем случае это 9001;
  19. Перезапустить AdminServer.
  20. Необходимо донастроить Node Manager-ы на каждой физической машине, добавить опции для сетевых интерфейсов в файл nodemanager.properties:
     Interface=eth0  
     NetMask=255.255.255.0  
     UseMACBroadcast=true  
    
    где eth0 - имя сетевого интерфейса на котором будет поднят "плавающий"/виртульный IP-адрес.
  21. Затем в Weblogic Console выбрать кластер BAM_Cluster и перейти в "Configuration"->"Migration" и заполнить поле "Data Source For Automatic Migration:", где выбрать созданный Data Source для механизма контроля миграции (см. пункт 13).
  22. Далее перейти в "Environment"->"Servers" выбрать bam_server1. Перейти в "Configuration"->"Migration" и поставить галку "Automatic Server Migration Enabled".
  23. Перезапустить сервера и протестировать миграцию.

четверг, 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-сервер.

четверг, 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 – путь к текстовому файлу с паролем администратора.