powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
21 сообщений из 21, страница 1 из 1
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34236936
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе вермя суток!

Для посылки СМС использую следующий код ( SendMessage ):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
    
    public   void  init(){
        TCPIPConnection connection =  new  TCPIPConnection(smppHostIp, smppHostPort);
        connection.setReceiveTimeout( 7  *  1000 );
         this .session =  new  Session(connection);
    }
//---------------------------------------------------
     private   int  sendSMS(Session session, Address sourceAddress, Address destAddress, String messageText)
     throws  PDUException, IOException, WrongSessionStateException, TimeoutException {
         int  ret = - 1 ;

         if  (flag1){
            msg =  new  SubmitSM();
            msg.setServiceType("TYPE");
            msg.setSourceAddr(( byte ) 5 , ( byte ) 0 , "type");
            msg.setEsmClass(( byte )Data.SM_FORWARD_MODE);
            msg.setProtocolId(( byte )  0 );
            msg.setPriorityFlag(( byte )  2 );
            msg.setRegisteredDelivery(( byte )  0 );
            msg.setDataCoding(( byte )  0 );          
            flag1 = false;
        }
        msg.setDestAddr(destAddress);
        msg.setShortMessage(messageText);
        resp = session.submit(msg);//проблемная строка:((((
        ret = resp.getCommandStatus();
         return  ret;
    }
//---------------------------------------------------
 public   int  sendMessage(String from, String msisdn, String messageText){
         int  ret = - 1 ;
         try  {
             if  (flag){
            init();
           
            sourceAddress =  new  Address(Data.GSM_TON_NATIONAL, Data.GSM_NPI_ISDN, from);
            destAddress =  new  Address(Data.GSM_TON_INTERNATIONAL, Data.GSM_NPI_ISDN, "");

            BindRequest breq  =  new  BindTransmitter();
            breq.setSystemId(smppSystemId);
            breq.setPassword(smppPassword);
            breq.setSystemType("TEST");
            breq.setInterfaceVersion(( byte )0x34);
            breq.setAddressRange( new  AddressRange());
       
              BindResponse bresp = session.bind(breq);
       
            flag = false;
       
             }
            destAddress.setAddress(msisdn);
            ret =  0 ;
             int  resendAttemptsCount =  0 ;
             do  {
                ret = sendSMS(session, sourceAddress, destAddress, messageText);
                 try  {
                     if (ret !=  0 ) Thread.sleep( 1000 );
                }  catch  (InterruptedException e) {
                    VasLogger.exception(e);
                }
            }  while ( ret !=  0  && resendAttemptsCount++ <  5 );
        }  catch (Exception e){
           
        }
       return  ret;
    }

Флаги flag и flag1 исползуются для того, чтобы создавать коннект единожды, и не пересоздавать его при каждой отсылке СМС.

Проблема в строке resp = session.submit(msg); функции SendSMS , которая непостредственно и отсылает СМС на указанный номер.
Время ее выполнения - 4-6 секунд, т.е, отправка одного СМС происходит в течении этих 4-6 секунд, что очень долго.

Можно ли ускорить выполнения указанной комманды submit ? Т.к, стоит задача отослать порядка 50-100 СМС за секунду

(наброр СМС-ок берется из БД, или из текстового файла, время посылки сообщений от этого не меняется).


С уважением, Ihor
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34236954
ksm80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Распараллель задачу.
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34237099
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ksm80Распараллель задачу.Извините, а можно чуть по-подробнее?

Спасибо
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34237124
Ihor ksm80Распараллель задачу.Извините, а можно чуть по-подробнее?
Спасибо
Позволь мне?
Запускай sendSMS() в отдельном потоке.
Для пропихивания 50 СМС в секунду тебе нужно запустить как минимум 300 Thread'ов.
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34237129
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробую. если у когото будут еще идеи, высказывайтесь, пожалуйста
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34237139
Не забудь только про concurrency.
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34237187
ksm80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобная задача стоит. Скоро начну делать. Необходимо наличие j2ee сервера (у меня стоит Oracle Application Server).

Моё решение такое:

DB Oracle ---> WS ---> Send JMS ---> MDM ---> SendSMS

Много терминов, но в JDevelopere до точки старта SendSMS делается за 30 минут.
1. DB Oracle без проблем вызывает WS (<<1 сек) и передаёт параметры: String[] phones, String message
2. WS кидает в очередь JMS сообщение с параметрами.
3. Свободный MDB вытягивает из очереди следующее JMS сообщение и запускает функцию SendSMS (MDB имеет макс. кол. потоков. Можно установить, например, 100 потоков в единицу времени)
А потом залазишь в Enterprise Meneger тюнингуешь параметры и сотришь графики %)
Делать через класс Threads - громоздко. Лучше в среде j2ee сервера делать.

Есть встречный вопрос.
не используешь ли ты GPS модем?
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34237200
ksm80
Делать через класс Threads - громоздко. Лучше в среде j2ee сервера делать.

Про J2EE разговора у автора не было.
С одним замечанием. Через Threads — получится изящно (и ничего громоздкого здесь нет, знаете ли). И будет работать быстрее MDB (по-определениею). А вот разворачивать J2EE ради посылки SMS — глупо.
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34237901
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ksm80Есть встречный вопрос.
не используешь ли ты GPS модем?
нет, не использую
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238265
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а кто вам даст отправлять столько смс? или у вас в гос структурах друзья сидят?
у опсосов есть ограничение на пропускную способность (выдается им при получении лицензии), 50 смс вам никто не даст. От силы 5. А если вы проигнорируете это ограничение, то от SMSC вам придет ошибка buffer full.

С Thread действительно все быстро получается. Я в свое время так и делал.
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238270
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyа кто вам даст отправлять столько смс? или у вас в гос структурах друзья сидят?

есть возможность отсылать порядка 100 смс в секунду:) почему - это уже не суть важно:)

автор
С Thread действительно все быстро получается. Я в свое время так и делал.
можно небольшой пример кода?
Тот вариант, который удалось реализовать, берет запись из БД, отсылает СМС, получает результат ОК, сообтветственно, правит запись в БД, но фактически, ни одна СМС не отправляется
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238330
Ihor
можно небольшой пример кода?
Тот вариант, который удалось реализовать, берет запись из БД, отсылает СМС, получает результат ОК, сообтветственно, правит запись в БД, но фактически, ни одна СМС не отправляется
А можно посмотреть ваш код?
Ну, метод, куда на вход отправляется коллекция SMS для отправки (куда, текст сообщения и т.д.) и всё что он делает.
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238375
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В классе, из которого непосредственно отсылается СМС, создал внутренний класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    public   class  RunSMS  extends  Thread{
      private  String msisdn1,messageText1;
      private  SendSMS SMS1;
      public   int  rezultat;
     //ret = sendSMS(session, sourceAddress, destAddress, messageText);
      public  RunSMS(String msisdn_p, String messageText_p){
      VasLogger.log("*** RunSMS *** Starting CONSTRUCTOR");
      SMS1 =  new  SendSMS();
       this .msisdn1 = msisdn_p;
       this .messageText1 = messageText_p;
      VasLogger.log("*** RunSMS *** Ending CONSTRUCTOR");

     }
     public   void  run(){
       /*synchronized(SMS1)*/{
         VasLogger.log("*** RunSMS *** Starting RUN");
         rezultat = - 1 ;
          rezultat = SMS1.sendMessage("life",msisdn1,messageText1);
       }
        try {
         VasLogger.log("Tryign to sleep RunSMS, textSMS="+messageText1);
           sleep( 1000 );
       } catch  (InterruptedException ie){

       }
      VasLogger.log("*** RunSMS *** Ending RUN");
     }
   }

и, вместо строки посылки СМС
Код: plaintext
rezult=SMS.sendMessage("type", msisdn_s, smsText);

использую

Код: plaintext
1.
2.
RunSMS runSMS= new  RunSMS(msisdn_s,smsText);
rezult = runSMS.rezultat;


Строка
Код: plaintext
VasLogger.log("*** RunSMS *** Starting RUN");
в лог не выводится, но значение rezultat меняется на 0 (успешная отсылка СМС):
(строки из по)
Код: plaintext
1.
2.
resp = session.submit(msg);
                   ...
    return  resp.getCommandStatus();
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238377
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(строки из по)=последние строки функции SendSMS
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238388
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а где у вас поток стартует???
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238393
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторно значение rezultat меняется на 0 конечно ведь конструктор то его инициализирует
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238407
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В строке:
Код: plaintext
RunSMS runSMS= new  RunSMS(msisdn_s,smsText);

Бьюсь над этим уже второй день, все мысли закончились, остался только научный тык:(

Скорее всего, проблема решится небольшим изменением кода, но вот до этого еще надо додуматься:(
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238411
Сейчас я закончу свою работу — напишу как нужно делать.
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238476
Ihor
А может сами догадаетесь?

Всё вот это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
 private   int  sendSMS(Session session, Address sourceAddress, Address destAddress, String messageText)
     throws  PDUException, IOException, WrongSessionStateException, TimeoutException {
         int  ret = - 1 ;

         if  (flag1){
            msg =  new  SubmitSM();
            msg.setServiceType("TYPE");
            msg.setSourceAddr(( byte ) 5 , ( byte ) 0 , "type");
            msg.setEsmClass(( byte )Data.SM_FORWARD_MODE);
            msg.setProtocolId(( byte )  0 );
            msg.setPriorityFlag(( byte )  2 );
            msg.setRegisteredDelivery(( byte )  0 );
            msg.setDataCoding(( byte )  0 );          
            flag1 = false;
        }
        msg.setDestAddr(destAddress);
        msg.setShortMessage(messageText);
        resp = session.submit(msg);//проблемная строка:((((
        ret = resp.getCommandStatus();
         return  ret;
    }
//---------------------------------------------------
 public   int  sendMessage(String from, String msisdn, String messageText){
         int  ret = - 1 ;
         try  {
             if  (flag){
            init();
           
            sourceAddress =  new  Address(Data.GSM_TON_NATIONAL, Data.GSM_NPI_ISDN, from);
            destAddress =  new  Address(Data.GSM_TON_INTERNATIONAL, Data.GSM_NPI_ISDN, "");

            BindRequest breq  =  new  BindTransmitter();
            breq.setSystemId(smppSystemId);
            breq.setPassword(smppPassword);
            breq.setSystemType("TEST");
            breq.setInterfaceVersion(( byte )0x34);
            breq.setAddressRange( new  AddressRange());
       
              BindResponse bresp = session.bind(breq);
       
            flag = false;
       
             }
            destAddress.setAddress(msisdn);
            ret =  0 ;
             int  resendAttemptsCount =  0 ;
             do  {
                ret = sendSMS(session, sourceAddress, destAddress, messageText);
                 try  {
                     if (ret !=  0 ) Thread.sleep( 1000 );
                }  catch  (InterruptedException e) {
                    VasLogger.exception(e);
                }
            }  while ( ret !=  0  && resendAttemptsCount++ <  5 );
        }  catch (Exception e){
           
        }
       return  ret;
    }

должно находиться в отдельном потоке!

Если вы поделитесь ссылкой на используемые либы — я, быть может, напишу. Неохота что-то писать без возможности проверить компилятором.
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238529
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробую сам)
...
Рейтинг: 0 / 0
Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
    #34238596
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По аналогии с этим дёшево и сердито :)
Удачи.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как уменьшить время выполнения public final SubmitSMResp submit(SubmitSM submitSM)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]