четверг, 29 ноября 2012 г.

Полезные команды Solaris (для консультантов)

В дополнение к статье по полезным командам Unix-систем.
  • Управление пакетами ПО:
    • Установить пакет:
       pkgadd -G -d VBoxSolarisAdditions.pkg  
      
    • Удалить пакет:
       pkgrm SUNWvboxguest  
      
    • Список установленных пакетов:
       pkginfo  
      
  • Сеть и удалённый доступ:
    • Вывести список активных сетевых адаптеров:
       ifconfig -a  
      
    • Перезапустить демона сетевых соединений:
       svcadm restart network  
      
    • Перезапустить SSH-сервер:
       svcadm restart ssh
      
  • Выключение/перезапуск:
    • Выключить ОС:
       poweroff  
      
    • Перезапуск ОС:
       reboot
      

четверг, 1 ноября 2012 г.

Проблема с сохранением изменений в Oracle SQL Developer

Проблема:
При сохранить изменения в таблице через Oracle SQL Developer получается ошибка:
 One error saving changes to table "SCHEMA"."TABLENAME":
 Row 1: Data got commited in another/same session, cannot update row.
Вариант решения:
  1. В SQL Developer перейти в меню "Tools"->"Preferences":
  2. В настройках "Database"->"Object Viewer" убрать галку "Use ORA_ROWSCN for DataEditor":

понедельник, 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  
    

воскресенье, 7 октября 2012 г.

Публикация события в EDN из Java

Рассмотрим пример публикации события в EDN из Java для AQ и JMS на примере события:
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
 <definitions xmlns="http://schemas.oracle.com/events/edl" targetNamespace="http://schemas.oracle.com/events/edl/TestEvent">  
   <schema-import namespace="http://nl.xenta/events" location="xsd/TestEvent.xsd"/>  
   <event-definition name="EventElement">  
     <content xmlns:ns0="http://nl.xenta/events" element="ns0:TestEvent"/>  
   </event-definition>  
 </definitions>  
По-умолчанию используется механизм AQ, но можно настроить и с использованием JMS (см. 41.3.6 How to Configure JMS-based EDN Implementations)

Класс реализующий отправку события:
 import oracle.fabric.blocks.event.BusinessEventConnection;  
 import oracle.fabric.blocks.event.BusinessEventConnectionFactory;  
 import oracle.integration.platform.blocks.event.BusinessEventBuilder;  
 import oracle.integration.platform.blocks.event.jms.JmsRemoteBusinessEventConnectionFactory;  
 import oracle.integration.platform.blocks.event.saq.SAQRemoteBusinessEventConnectionFactory;  
 import oracle.soa.common.util.XMLUtil;  
 import org.w3c.dom.Element;  
 import java.util.Date;  
 import java.util.Properties;  
 import javax.jms.Queue;  
 import javax.jms.QueueConnectionFactory;  
 import javax.naming.Context;  
 import javax.naming.InitialContext;  
 import javax.naming.NamingException;  
 import javax.sql.DataSource;  
 import javax.transaction.UserTransaction;  
 import javax.xml.namespace.QName;  
   
 public class EdnUtils {  
   private static final String EDN_JMS_CONNECTION_FACTORY_NAME = "jms/fabric/EDNConnectionFactory";  
   private static final String EDN_JMS_XA_CONNECTION_FACTORY_NAME = "jms/fabric/xaEDNConnectionFactory";  
   private static final String EDN_QUEUE_NAME = "jms/fabric/EDNQueue"; 
   private static final String EDN_DATASOURCE = "jdbc/EDNDataSource";
   private static final String EDN_LOCALTX_DATASOURCE = "jdbc/EDNLocalTxDataSource"; 
   
   public static void main(String[] args) {  
     Properties props = new Properties();  
   
     props.put(Context.PROVIDER_URL, "t3://127.0.0.1:8001");  
     props.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");  
     props.put(Context.SECURITY_PRINCIPAL, "weblogic");  
     props.put(Context.SECURITY_CREDENTIALS, "welcome1");  
   
     try{  
       String eventName = "EventElement";  
       String eventNamespace = "http://schemas.oracle.com/events/edl/TestEvent";  
       String eventBodyStr = "<TestEvent xmlns=\"http://nl.xenta/events\">\n"  
                   + "<action>action from java</action> \n"   
                   + "<description>description at [" + new Date() + "]</description> \n"   
                   + "</TestEvent>";  
       Element eventBody = XMLUtil.parseDocumentFromXMLString(eventBodyStr.toString()).getDocumentElement();  
        
       InitialContext context = new InitialContext(props);  
   
       EdnUtils.publishEvent(context, false, eventName, eventNamespace, eventBody);  
     } catch (Exception e) {  
       e.printStackTrace();  
     }  
   }  
   
   public static void publishEvent(InitialContext context, boolean isJmsEdnMode, String eventName,  
                   String eventNamespace, Element eventBody) throws NamingException {  
     BusinessEventConnectionFactory factory = null;  
     UserTransaction userTransaction =  
       (UserTransaction) context.lookup("javax.transaction.UserTransaction");  
   
     if (!isJmsEdnMode) {  
       DataSource ds = (DataSource) context.lookup(EDN_DATASOURCE);  
       DataSource localTxDs = (DataSource) context.lookup(EDN_LOCALTX_DATASOURCE);  
   
       factory = new SAQRemoteBusinessEventConnectionFactory(ds, localTxDs, userTransaction);  
     } else {  
       QueueConnectionFactory queueConnectionFactory =  
         ((QueueConnectionFactory) context.lookup(EDN_JMS_CONNECTION_FACTORY_NAME));  
       QueueConnectionFactory xaQueueConnectionFactory =  
         ((QueueConnectionFactory) context.lookup(EDN_JMS_XA_CONNECTION_FACTORY_NAME));  
       Queue jmsQueue = ((Queue) context.lookup(EDN_QUEUE_NAME));  
   
       factory = new JmsRemoteBusinessEventConnectionFactory(queueConnectionFactory, xaQueueConnectionFactory,  
           jmsQueue, userTransaction);  
     }  
   
     BusinessEventConnection conn = factory.createBusinessEventConnection();  
   
     BusinessEventBuilder builder = BusinessEventBuilder.newInstance();  
   
     builder.setEventName(new QName(eventNamespace, eventName));  
     builder.setBody(eventBody);  
   
     conn.publishEvent(builder.createEvent(), 3);  
     conn.close();  
   }  
 }  
Для сборки и запуска примера из JDeveloper потребуются следующие библиотеки:
Данное приложение-пример для JDeveloper содержащее два проекта (здесь):
  • EventToFile - композит который при получении события пишет в файл на файловой системе, так же через него можно отправить событие;
  • PublishEventFromJava - проект содержащий данный пример.