forum.bitel.ru
http://forum.bitel.ru/

Не исчезающая ошибка
http://forum.bitel.ru/viewtopic.php?f=44&t=10898
Страница 1 из 1

Автор:  madmax [ 16 сен 2015, 13:12 ]
Заголовок сообщения:  Не исчезающая ошибка

В error.log постоянно появляется ошибка. Судя по данным логов на договоре стоит статус Inet отключен но также прошлым месяцем дата закрытия и сервис должен перейти в статус удален но он не переходит.
При этом на это же устройства команды отрабатывают с других договоров
И вот ошибка которая никак не убирается.
Код:
connection 09-16/13:05:03  INFO [sa-p-11-t-14] ServiceActivatorSet - Invoking serviceCancel
connection 09-16/13:05:03 ERROR [sa-p-11-t-14] AcknowledgeConsumer - Error on device:4 - java.lang.NullPointerException
ru.bitel.bgbilling.common.BGException: Error on device:4 - java.lang.NullPointerException
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:495)
        at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTaskImpl(AsyncEventWorker.java:211)
        at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.notify(AsyncEventWorker.java:201)
        at ru.bitel.bgbilling.kernel.event.AcknowledgeConsumer.onMessage0(AcknowledgeConsumer.java:83)
        at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTask(AsyncEventWorker.java:176)
        at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.doTasks(AsyncEventWorker.java:109)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runWorker(ServiceActivatorDeviceWorker.java:245)
        at ru.bitel.bgbilling.kernel.event.EventWorker.internalRunWorker(EventWorker.java:139)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runImpl(ServiceActivatorDeviceWorker.java:151)
        at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
        at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46)
Caused by: java.lang.NullPointerException
        at java.util.ArrayList.addAll(ArrayList.java:559)
        at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TestTelnetServiceActivator.executeCommands(TestTelnetServiceActivator.java:195)
        at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.AbstractTerminalServiceActivator.serviceCancel(AbstractTerminalServiceActivator.java:878)
        at ru.bitel.bgbilling.modules.inet.dyn.device.misc.CompositeServiceActivator.serviceCancel(CompositeServiceActivator.java:215)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorSet.serviceCancel(ServiceActivatorSet.java:359)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doCommand(ServiceActivatorDeviceWorker.java:548)
        at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:491)
        ... 17 more
connection 09-16/13:05:03  INFO [sa-p-11-t-14] ServiceActivatorSet - Disconnecting from device
connection 09-16/13:05:03  INFO [sa-p-11-t-14] TelnetServiceActivator - executeAsync:
connection 09-16/13:05:03 DEBUG [sa-p-11-t-14] TelnetServiceActivator - Disconnected
connection 09-16/13:05:03  INFO [sa-p-11-t-14] ServiceActivatorDeviceWorker - Execution error - waiting 60000ms for next try.

Автор:  stark [ 16 сен 2015, 17:50 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

TestTelnetServiceActivator - это разве из нашей сборки? Это скорее всего какой-то ваш класс.

Автор:  madmax [ 16 сен 2015, 17:57 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

Да это с wiki где идет привязка к портам.
Он он везде на всех других договорах отрабатывает - только на одном договоре статус не переходит в состояние удален.
На этом договоре висит два сервиса и они оба не отрабатывают.

Автор:  stark [ 16 сен 2015, 18:05 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

madmax писал(а):
Да это с wiki где идет привязка к портам.
Он он везде на всех других договорах отрабатывает - только на одном договоре статус не переходит в состояние удален.
На этом договоре висит два сервиса и они оба не отрабатывают.


Без кода TestTelnetServiceActivator ничего не ясно, откуда мы знаем что у вам там и на чем падает.

Автор:  madmax [ 16 сен 2015, 18:12 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

Код:
package ru.bitel.bgbilling.modules.inet.dyn.device.terminal;

import java.util.Set;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Date;

import org.apache.log4j.Logger;

import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivator;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorEvent;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetConnection;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import ru.bitel.common.Utils;
import bitel.billing.common.TimeUtils;
import bitel.billing.server.util.telnet.TelnetSession;

/**
 *  {@inheritDoc}
 *  @see AbstractTerminalServiceActivator
 */
public class TestTelnetServiceActivator
    extends AbstractTerminalServiceActivator
    implements ServiceActivator
{
   private static final Logger logger = Logger.getLogger( TelnetServiceActivator.class );

   protected String endSequence;

   protected TelnetSession session;

   protected boolean lazyConnect;

   @Override
   public Object init( Setup setup, int moduleId, InetDevice device, InetDeviceType deviceType, ParameterMap config )
       throws Exception
   {
      super.init( setup, moduleId, device, deviceType, config );
      
      if( this.port <= 0 )
      {
         this.port = 23;
      }

      this.endSequence = config.get( "sa.endSequence", "#" );

      this.lazyConnect = config.getInt( "sa.lazyConnect", 0 ) > 0;

      return null;
   }

   @Override
   public Object destroy()
       throws Exception
   {
      return super.destroy();
   }

   @Override
   public Object connect()
       throws Exception
   {
      if( lazyConnect )
      {
         return null;
      }

      return connectImpl();
   }

   protected Object connectImpl()
       throws Exception
   {
      TelnetSession session = new TelnetSession( host, port );
      session.setTimeout( timeout );
      session.setReadWait( readWait );

      session.setEndString( ":" );

      session.connect();
      logger.info( "Connected" );
      
      this.session = session;

      logger.info( session.doCommand( username ) );
      logger.info( "Login entered" );

      if( Utils.notBlankString( endSequence ) )
      {
         session.setEndString( endSequence );
      }

      logger.info( session.doCommand( password ) );
      logger.info( "Password entered" );

      // logger.info( session.doCommand( "terminal length 0" ) );
      // logger.info( session.doCommand( "terminal width 0" ) );

      return super.connect();
   }

   protected TelnetSession getSession()
       throws Exception
   {
      if( session != null )
      {
         return session;
      }

      connectImpl();

      return session;
   }

   @Override
   public Object disconnect()
       throws Exception
   {
      if( session != null )
      {
         try
         {
            super.disconnect();
            
            logger.info( "executeAsync: " + this.exitCommand  );
            session.doCommandAsync( this.exitCommand );
         }
         finally
         {
            session.disconnect();

            session = null;

            logger.debug( "Disconnected" );
         }
      }

      return null;
   }

   @Override
   protected void executeCommand( final String command )
       throws Exception
   {
      final TelnetSession session = getSession();

      logger.info( "execute: " + command );
      logger.info( session.doCommand( command ) );
   }

@Override
   protected Object executeCommands( ServiceActivatorEvent e, InetServ serv, InetConnection connection, Set<Integer> options, String[] commands )
      throws Exception
   {
        if (  e == null )
        {
            return super.executeCommands( e, serv, connection, options, commands );
        }
       
      if( commands == null )
      {
         return null;
      }

      if( this.workingOptions != null )
      {
         options = new HashSet<Integer>( options );
         options.retainAll( this.workingOptions );
      }
      
      
      List<InetServ> childrens = serv.getChildren();
      
      List<InetServ> servs = new ArrayList<>();
      //если потомков у сервиса нет, то мы только его обрабатываем
   //   if( childrens.size() == 0 )
   //   {
         servs.add( serv );
   //   }// если есть дети , то обратывваем только детей
   //   else
   //   {
         servs.addAll( childrens );
   //   }
      //logger.info( "servs=" + servs );      
      String fullCommand = generateRule( commands, serv, servs, e, connection, options );      
      //fullCommand = fullCommand.replaceAll( "\\\\t", "\t" );
      //fullCommand = fullCommand.replaceAll( "\n", "|" );
      fullCommand = fullCommand.replaceAll( "ifaceTitle", Matcher.quoteReplacement("$ifaceTitle"));
      //logger.info( "fullCommand=" + fullCommand );
      fullCommand = this.macrosFormat.format( fullCommand, e, serv, connection, options );
      //logger.info( "fullCommand=" + fullCommand );
      if( Utils.notBlankString( fullCommand ) )
      {
         executeCommand( fullCommand.trim() );
      }
   
      return null;
   }   
   

public final String generateRule( String[] commands, InetServ mainServ, List<InetServ> servs, ServiceActivatorEvent e, InetConnection connection, Set<Integer> options )
   {
      String commandStr = "";
      for( String command : commands )
      {
         commandStr +=  command + "\n";
         //logger.info( "commandStr =" + commandStr);
      }
      
      //Если указан макрос multiParam, учитываем его
      //commandStr = getParamMulti( commandStr );
      
      StringBuffer resultBuf = null;
      resultBuf = new StringBuffer ();
      String loopPattern = "(<LOOP>.*?</LOOP>)?(.*?)<LOOP>(.*?)</LOOP>";
      Pattern pattern = Pattern.compile( loopPattern, Pattern.DOTALL );
      Matcher m = pattern.matcher( commandStr );
      boolean find = false;

      while( m.find() )
      {
         find = true;
         
         String block = m.group( 3 ).trim();
         //logger.info( "block =" + block + "qqq");
         block = processBlock( block, servs, e, connection, options ).toString();
         //logger.info( "block1 =" + block + "qqq");
         String beforeLoop =  m.group( 2 );
         beforeLoop = this.macrosFormat.format( beforeLoop, e, mainServ, connection, options );
         
         resultBuf.append( beforeLoop.trim() + "\n" );
         resultBuf.append( block.trim() );            
      }
      
      if (find)
      {
         //хвост(ищем жадным алгоритмом) или если вообще нет ни одного цикла
         loopPattern = "(?:<LOOP>(?:.*)</LOOP>)(.*)\\z";
         
         pattern = Pattern.compile( loopPattern, Pattern.DOTALL );
         m = pattern.matcher( commandStr );      
         
         if( m.find() )
         {
            String afterLoop =  m.group( 1 ).trim();
            afterLoop = this.macrosFormat.format( afterLoop, e, mainServ, connection, options );
            resultBuf.append( afterLoop.trim());
            //logger.info( "afterloop=" + afterLoop);
            
         }
      }
      else
      {   
         commandStr = this.macrosFormat.format( commandStr, e, mainServ, connection, options );
         
         resultBuf.append( commandStr );       
      }   
      
      return resultBuf.toString();
   }

private StringBuffer processBlock( String ruleText, List<InetServ> servs, ServiceActivatorEvent e, InetConnection connection, Set<Integer> options )
   {
      StringBuffer result = new StringBuffer();
      
      List<PatternItem> items = new ArrayList<PatternItem>( 10 );
      Map<String, Integer> letterMaxNumbers = new HashMap<String, Integer>();
      
      Pattern pattern = Pattern.compile( "\\{([A-Z]+)(\\d+)\\}" );
      Matcher m = pattern.matcher( ruleText );
      
      while( m.find() )
      {
         String letter = m.group( 1 );
         int number = Utils.parseInt( m.group( 2 ), 0 );
         
         PatternItem item = new PatternItem();
         item.number = number;
         item.letter = letter;
         
         items.add( item );
         
         Integer maxNumber = letterMaxNumbers.get( letter );
         if( maxNumber == null || maxNumber < number )
         {
            letterMaxNumbers.put( letter, number );
         }
      }
            
      final int size = servs.size();
      
      for( int i = 0; i < size; i++ )
      {
         //String address = IPUtils.convertLongIpToString( Utils.parseLong( addreses[i], 0 ) );
         String addressRule = new String( ruleText );
         InetServ serv = servs.get( i );
         
         for( PatternItem item : items )
         {
            int number = i*(letterMaxNumbers.get( item.letter ) + 1) + item.number;
            addressRule = addressRule.replaceAll(
                  "\\{" + item.letter + item.number + "\\}",
                  "{" + item.letter + number + "}" );
         }
         
         
         
         String str = addressRule;
         if ( TimeUtils.dateBeforeOrEq(new Date(), serv.getDateTo()) || serv.getDateTo() == null)
         {
         str = this.macrosFormat.format( str, e, serv, connection, options );
         result.append( str + "\n"  );
         }
      }
      return result;
   }   
   
private static class PatternItem
   {
      public String letter;
      public int number;
   }

   @Override
   protected Object getValue( ServiceActivatorEvent e, InetServ serv, InetConnection connection, Set<Integer> options, String macros, Object[] args, Object[] globalArgs )
       throws Exception
   {
      if( "setEndSequence".equals( macros ) )
      {
         if( args.length > 0 )
         {
            String endSequence = (String)args[0];
            if( Utils.notEmptyString( endSequence ) )
            {
               getSession().setEndString( (String)args[0] );
               return "";
            }
         }

         getSession().setEndString( this.endSequence );
         return "";
      }
      else
      {
         return super.getValue( e, serv, connection, options, macros, args, globalArgs );
      }
   }
}

Автор:  stark [ 16 сен 2015, 19:23 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

В 195 строке у вас ?
Код:
 servs.addAll( childrens );


Тогда возможно падает, потому что childrens null.

Автор:  madmax [ 17 сен 2015, 00:54 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

Точно, странно почему он выдавал null на определенных договорах.
Ну да ладно спасибо что показали на проблему

Автор:  stark [ 09 окт 2015, 13:53 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

У вас какая версия была? Подобная ошибка вылезла в нашем ManadServiceAcivator, исправили.

Автор:  madmax [ 09 окт 2015, 16:25 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

Версия 6,1.

Автор:  madmax [ 15 окт 2015, 11:09 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

Опять появилась ошибка.
Я сделал проверку, но почему-то на ней теперь и вылетает
Код:
if ( childrens.size() != 0 || childrens != null  ){
      servs.addAll( childrens );}

Автор:  Artur [ 15 окт 2015, 11:53 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

madmax писал(а):
Опять появилась ошибка.
Я сделал проверку, но почему-то на ней теперь и вылетает
Код:
if ( childrens.size() != 0 || childrens != null  ){
      servs.addAll( childrens );}


Вылетает с NullPointerException? Если да, то в вашем блоке if нужно поменять условия местами.

Автор:  madmax [ 15 окт 2015, 12:02 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

да именно эта ошибка.
Спасибо поменяли, сейчас все чисто.
Странно не знал что условия проверяются по порядку и если что не так код вываливается

Автор:  Artur [ 15 окт 2015, 14:13 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

Да, конечно, условия проверяются по порядку, если не установлена приоритетность проверки условий, например скобками. В Java компилятор может оптимизировать проверку условий, но не в данном случае.

Автор:  Jimson [ 16 окт 2015, 00:37 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

Походу я не знаю каких то особенностей java, поясните смысл условия if ( childrens != null || childrens.size() != 0 )
На мой взгляд || это обычный "or", если childrens не равен null, то все условие true, если же childrens равен null, то мы полезем за childrens.size() и получим эксепшен.
Может таки if ( childrens != null && childrens.size() != 0 ) хотелось?

Автор:  madmax [ 16 окт 2015, 10:38 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

Правильно это выборка если не равен null или не равен 0 то выпоняем команду.
А && что означает?

Автор:  Phricker [ 16 окт 2015, 12:36 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

тынц

Автор:  stark [ 16 окт 2015, 20:38 ]
Заголовок сообщения:  Re: Не исчезающая ошибка

Jimson писал(а):
Походу я не знаю каких то особенностей java, поясните смысл условия if ( childrens != null || childrens.size() != 0 )
На мой взгляд || это обычный "or", если childrens не равен null, то все условие true, если же childrens равен null, то мы полезем за childrens.size() и получим эксепшен.
Может таки if ( childrens != null && childrens.size() != 0 ) хотелось?


да , тут && было бы логичнее.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/