Mutliple xizmatlarini taklif qiluvchi ExecutorService xizmatidan Java kodlash

Men 15 xizmatni parallel ravishda ishga tushirishga harakat qilaman va har bir xizmat turli xil mijozlar to'plamiga pochta orqali yuboradi. Ekstraksiya mezonlari har bir xizmatdan farq qiladi

Service1, Service2, Service3.... Service15. Each class extends NotificationService class.

NotificationService sinfida extractRecipients (), sendMail (), sendSMS (), logNotification() usullari mavjud.

All Service classes[1 to 15] have process() method that will call NotificationService methods and do their job.

Java kodini loyihalash uchun bu to'g'ri yo'ldirmi?

Quyidagi kod yomon ko'rinadi, u erda ishlaydigan aqlli usul bormi? Iltimos menga yordam bering.

public void startService() {

try {
    ExecutorService service = Executors.newFixedThreadPool(3);

    for (;;) {
        service.submit(new Service1(conn) {
                    public Object call(){
                        try {
                            process(conn, param2);//Passing connection & obj
                        } catch (Exception e) {
                            throw e;
                        }
                        return null;
                    }
                });

        service.submit(new Service2(conn) {
                    public Object call(){
                        try {
                            process(conn, param2);
                        } catch (Exception e) {
                            throw e;
                        }
                        return null;
                    }
                });

       //like above i have 15 services. so its ugly.
    }

} catch (InterruptedException e) {
    e.printStackTrace();
}
}

public boolean process(Connection conn) throws Exception {
try {
// getRecipientsList(serviceID);

// sendMail(recipientsList);

// logNotificationDetails(notificationList);
} catch (Exception e) {
}
}
0
Fildor Kechirasiz, iltimos, yuqoridagi startService() usuli bilan ushbu 15 xizmatni qanday boshqarishni ayta olasiz. Bu erda param2 fasol bo'lib, xizmat ko'rsatuvchi provayder, xizmatga oid elektron pochta mavzusi, tanasi va barchasi mavjud
qo'shib qo'ydi muallif DEADEND, manba
Fildor Kechirasiz, iltimos, yuqoridagi startService() usuli bilan ushbu 15 xizmatni qanday boshqarishni ayta olasiz. Bu erda param2 fasol bo'lib, xizmat ko'rsatuvchi provayder, xizmatga oid elektron pochta mavzusi, tanasi va barchasi mavjud
qo'shib qo'ydi muallif DEADEND, manba
Ha, Fildor i sinab ko'rdim va u xuddi shunday. Sizning fikringizni NotificationService-ga ko'chirish va Service1, Service2 classlarini e'tiborsiz qoldirishga rozilik berdim.
qo'shib qo'ydi muallif DEADEND, manba
Ha, Fildor i sinab ko'rdim va u xuddi shunday. Sizning fikringizni NotificationService-ga ko'chirish va Service1, Service2 classlarini e'tiborsiz qoldirishga rozilik berdim.
qo'shib qo'ydi muallif DEADEND, manba
startService ko'chadan har daqiqada ishlaydi, har bir daqiqada 15 ta xizmat parallel ravishda ishlaydi va xabarnoma yuboradi.
qo'shib qo'ydi muallif DEADEND, manba
startService ko'chadan har daqiqada ishlaydi, har bir daqiqada 15 ta xizmat parallel ravishda ishlaydi va xabarnoma yuboradi.
qo'shib qo'ydi muallif DEADEND, manba
"Nima uchun bu kodni NotificationService.java-ga almashtirmaslik kerak? Hamma ServiceN sinflari bir xil ilovani almashishadi" - Chunki startService() da turli xil paramterlarni o'tkazaman. va 15 ta xizmatni parallel ravishda amalga oshirishim kerak.
qo'shib qo'ydi muallif DEADEND, manba
"Nima uchun bu kodni NotificationService.java-ga almashtirmaslik kerak? Hamma ServiceN sinflari bir xil ilovani almashishadi" - Chunki startService() da turli xil paramterlarni o'tkazaman. va 15 ta xizmatni parallel ravishda amalga oshirishim kerak.
qo'shib qo'ydi muallif DEADEND, manba
"Nima uchun bu kodni NotificationService.java-ga almashtirmaslik kerak? Hamma ServiceN sinflari bir xil ilovani almashishadi" - Chunki startService() da turli xil paramterlarni o'tkazaman. va 15 ta xizmatni parallel ravishda amalga oshirishim kerak.
qo'shib qo'ydi muallif DEADEND, manba
startService ko'chadan har daqiqada ishlaydi, har bir daqiqada 15 ta xizmat parallel ravishda ishlaydi va xabarnoma yuboradi.
qo'shib qo'ydi muallif DEADEND, manba
Yo'q, startService() ichidagi har bir daqiqada ishlashni tekshiraman.
qo'shib qo'ydi muallif DEADEND, manba
@duffymo Yuqoridagi kod uchun biron-bir yechim bormi, uning ko'rinishi yomon. Chunki 15 ta xizmat ExecutorService tomonidan bir vaqtning o'zida chaqiriladi.
qo'shib qo'ydi muallif DEADEND, manba
@duffymo Yuqoridagi kod uchun biron-bir yechim bormi, uning ko'rinishi yomon. Chunki 15 ta xizmat ExecutorService tomonidan bir vaqtning o'zida chaqiriladi.
qo'shib qo'ydi muallif DEADEND, manba
@duffymo Yuqoridagi kod uchun biron-bir yechim bormi, uning ko'rinishi yomon. Chunki 15 ta xizmat ExecutorService tomonidan bir vaqtning o'zida chaqiriladi.
qo'shib qo'ydi muallif DEADEND, manba
15 ta elektron pochta xabarlari bir xil mijozga yuborilmaydi. Misol uchun. Turli xil iste'molchilar turli extraction kriteriyalariga ega. ekstraksiya mezonlari har bir xizmat sinfidan farq qiladi.
qo'shib qo'ydi muallif DEADEND, manba
15 ta elektron pochta xabarlari bir xil mijozga yuborilmaydi. Misol uchun. Turli xil iste'molchilar turli extraction kriteriyalariga ega. ekstraksiya mezonlari har bir xizmat sinfidan farq qiladi.
qo'shib qo'ydi muallif DEADEND, manba
Bu ish har daqiqa uchun bajariladi. Shunday qilib men cheksiz pastadir qo'ydim. Kechirasiz, men rejalashtirilgan Ijrochidan foydalanishni bilmayman
qo'shib qo'ydi muallif DEADEND, manba
Bu ish har daqiqa uchun bajariladi. Shunday qilib men cheksiz pastadir qo'ydim. Kechirasiz, men rejalashtirilgan Ijrochidan foydalanishni bilmayman
qo'shib qo'ydi muallif DEADEND, manba
@Fildor men umumiy sinfga ega Service1 xizmatini NotificationService xizmatini Callable -ni bajaradi
qo'shib qo'ydi muallif DEADEND, manba
15 ta elektron pochta xabarlari bir xil mijozga yuborilmaydi. Misol uchun. Turli xil iste'molchilar turli extraction kriteriyalariga ega. ekstraksiya mezonlari har bir xizmat sinfidan farq qiladi.
qo'shib qo'ydi muallif DEADEND, manba
reusabilty uchun, extractRecipients (), sendMail (), sendSMS (), logNotification() kabi usullarni yozdim. chunki u barcha xizmatlar uchun keng tarqalgan.
qo'shib qo'ydi muallif DEADEND, manba
reusabilty uchun, extractRecipients (), sendMail (), sendSMS (), logNotification() kabi usullarni yozdim. chunki u barcha xizmatlar uchun keng tarqalgan.
qo'shib qo'ydi muallif DEADEND, manba
Yo'q, startService() ichidagi har bir daqiqada ishlashni tekshiraman.
qo'shib qo'ydi muallif DEADEND, manba
@Fildor men umumiy sinfga ega Service1 xizmatini NotificationService xizmatini Callable -ni bajaradi
qo'shib qo'ydi muallif DEADEND, manba
@Fildor men umumiy sinfga ega Service1 xizmatini NotificationService xizmatini Callable -ni bajaradi
qo'shib qo'ydi muallif DEADEND, manba
Har bir xizmat klassi [Service1-15] o'z sqllarini chaqiradi va oluvchilarni chiqaradi. Shunday qilib, 15 sub sinf va bitta ota-ona sinf.
qo'shib qo'ydi muallif DEADEND, manba
Har bir xizmat klassi [Service1-15] o'z sqllarini chaqiradi va oluvchilarni chiqaradi. Shunday qilib, 15 sub sinf va bitta ota-ona sinf.
qo'shib qo'ydi muallif DEADEND, manba
Yo'q, startService() ichidagi har bir daqiqada ishlashni tekshiraman.
qo'shib qo'ydi muallif DEADEND, manba
15 ta elektron pochta xabari bormi? Xuddi shu mijozga? Qanday bezovta qiluvchi. Ularni birlashtirish uchun ba'zi mantiqlardan foydalanishni tavsiya qilaman. Bundan tashqari, men xizmat jarayonini elektron pochta orqali jo'natishdan ham ajralib qolaman. Ushbu alohida qadamni bajaring. NotifyingService xizmatini uzatmasligi kerak.
qo'shib qo'ydi muallif duffymo, manba
15 ta elektron pochta xabari bormi? Xuddi shu mijozga? Qanday bezovta qiluvchi. Ularni birlashtirish uchun ba'zi mantiqlardan foydalanishni tavsiya qilaman. Bundan tashqari, men xizmat jarayonini elektron pochta orqali jo'natishdan ham ajralib qolaman. Ushbu alohida qadamni bajaring. NotifyingService xizmatini uzatmasligi kerak.
qo'shib qo'ydi muallif duffymo, manba
15 ta elektron pochta xabari bormi? Xuddi shu mijozga? Qanday bezovta qiluvchi. Ularni birlashtirish uchun ba'zi mantiqlardan foydalanishni tavsiya qilaman. Bundan tashqari, men xizmat jarayonini elektron pochta orqali jo'natishdan ham ajralib qolaman. Ushbu alohida qadamni bajaring. NotifyingService xizmatini uzatmasligi kerak.
qo'shib qo'ydi muallif duffymo, manba
NotificationService nima uchun Callable dasturini amalga oshirmaydi? Ilovalar bir xil ko'rinadi.
qo'shib qo'ydi muallif Fildor, manba
Va qachon to'xtaysan? Va qanday? startService loopda chaqiruvchini blokirovka qilishni to'xtatadi.
qo'shib qo'ydi muallif Fildor, manba
NotificationService nima uchun Callable dasturini amalga oshirmaydi? Ilovalar bir xil ko'rinadi.
qo'shib qo'ydi muallif Fildor, manba
NotificationService nima uchun Callable dasturini amalga oshirmaydi? Ilovalar bir xil ko'rinadi.
qo'shib qo'ydi muallif Fildor, manba
Va qachon to'xtaysan? Va qanday? startService loopda chaqiruvchini blokirovka qilishni to'xtatadi.
qo'shib qo'ydi muallif Fildor, manba
Va qachon to'xtaysan? Va qanday? startService loopda chaqiruvchini blokirovka qilishni to'xtatadi.
qo'shib qo'ydi muallif Fildor, manba
Xo'sh, shundaymi? jurnali , har bir ServiceN uchun bir xil turga ega bo'lsa, u kodni ko'chirishingiz mumkin bo'lsa, yana ham param2 va conn iboralaridan foydalanadi. Va aslida, siz kerak deb o'ylayman. process , NotificationService ilovasida mavhum usul bo'lganmi?
qo'shib qo'ydi muallif Fildor, manba
Xo'sh, shundaymi? jurnali , har bir ServiceN uchun bir xil turga ega bo'lsa, u kodni ko'chirishingiz mumkin bo'lsa, yana ham param2 va conn iboralaridan foydalanadi. Va aslida, siz kerak deb o'ylayman. process , NotificationService ilovasida mavhum usul bo'lganmi?
qo'shib qo'ydi muallif Fildor, manba
Xo'sh, shundaymi? jurnali , har bir ServiceN uchun bir xil turga ega bo'lsa, u kodni ko'chirishingiz mumkin bo'lsa, yana ham param2 va conn iboralaridan foydalanadi. Va aslida, siz kerak deb o'ylayman. process , NotificationService ilovasida mavhum usul bo'lganmi?
qo'shib qo'ydi muallif Fildor, manba
Siz haqiqatan ham bu kodni sinab ko'rdingizmi?
qo'shib qo'ydi muallif Fildor, manba
Siz haqiqatan ham bu kodni sinab ko'rdingizmi?
qo'shib qo'ydi muallif Fildor, manba
Siz haqiqatan ham bu kodni sinab ko'rdingizmi?
qo'shib qo'ydi muallif Fildor, manba
"Bu ish har daqiqa uchun bajariladi." Ya'ni, process ichida so'nggi tekshiruvdan keyin bir daqiqa o'tishi mumkinmi? ScheduledExecutorService docs-ga qarang: docs.oracle.com/ javase/8/docs/api/java/util/concurrent/& hellip; scheduleAtFixedRate (vazifa, 0, 1 TimeUnit.MINUTES)
qo'shib qo'ydi muallif Fildor, manba
"Bu ish har daqiqa uchun bajariladi." Ya'ni, process ichida so'nggi tekshiruvdan keyin bir daqiqa o'tishi mumkinmi? ScheduledExecutorService docs-ga qarang: docs.oracle.com/ javase/8/docs/api/java/util/concurrent/& hellip; scheduleAtFixedRate (vazifa, 0, 1 TimeUnit.MINUTES)
qo'shib qo'ydi muallif Fildor, manba
Yo'q, bunday bo'lmaydi. 3 xizmat parallel ravishda bajariladi. Biroq, 15 kishi qayta-qayta qatl qilinadi. Va har daqiqada bu yomonlashadi.
qo'shib qo'ydi muallif Fildor, manba
Yo'q, bunday bo'lmaydi. 3 xizmat parallel ravishda bajariladi. Biroq, 15 kishi qayta-qayta qatl qilinadi. Va har daqiqada bu yomonlashadi.
qo'shib qo'ydi muallif Fildor, manba
Xo'sh, boshlang'ich sifatida, for (;;) dan qutulishingiz va oxirida ijrochini o'chirishingiz mumkin. O'ylaymanki, har bir daqiqada ushbu kodni chaqirishga harakat qilayotgan startService usulidan foydalanmoqchi bo'lsangiz, xatti-harakatni yaxshilaydi.
qo'shib qo'ydi muallif Fildor, manba
Xo'sh, boshlang'ich sifatida, for (;;) dan qutulishingiz va oxirida ijrochini o'chirishingiz mumkin. O'ylaymanki, har bir daqiqada ushbu kodni chaqirishga harakat qilayotgan startService usulidan foydalanmoqchi bo'lsangiz, xatti-harakatni yaxshilaydi.
qo'shib qo'ydi muallif Fildor, manba
Shuningdek, takliflarim uchun javobimni ham ko'ring.
qo'shib qo'ydi muallif Fildor, manba
Shuningdek, takliflarim uchun javobimni ham ko'ring.
qo'shib qo'ydi muallif Fildor, manba
Shuningdek, takliflarim uchun javobimni ham ko'ring.
qo'shib qo'ydi muallif Fildor, manba
"Public1 Class1 xizmatini kengaytirmoqda NotificationService Callable amalga oshiradi. Ha, lekin siz Callable dasturini qo'llaysiz. Nima uchun bu kodni NotificationService.java ga o'zgartirmaysiz? Xizmatning barcha sinflari bir xil ilovani o'z ichiga oladi.
qo'shib qo'ydi muallif Fildor, manba
"Public1 Class1 xizmatini kengaytirmoqda NotificationService Callable amalga oshiradi. Ha, lekin siz Callable dasturini qo'llaysiz. Nima uchun bu kodni NotificationService.java ga o'zgartirmaysiz? Xizmatning barcha sinflari bir xil ilovani o'z ichiga oladi.
qo'shib qo'ydi muallif Fildor, manba
Shundan keyin siz yagona shooting vazifalarini yuborish uchun cheksiz pastadir ishlatasiz. Rejali Ijrochidan foydalanmaslik va ularni takrorlashni rejalashtirish kerakmi?
qo'shib qo'ydi muallif Fildor, manba
Shundan keyin siz yagona shooting vazifalarini yuborish uchun cheksiz pastadir ishlatasiz. Rejali Ijrochidan foydalanmaslik va ularni takrorlashni rejalashtirish kerakmi?
qo'shib qo'ydi muallif Fildor, manba
Nima uchun bir xil vazifani (elektron pochta) amalga oshirish uchun turli xil xizmatlar mavjud?
qo'shib qo'ydi muallif Shubham Chaurasia, manba
Nima uchun bir xil vazifani (elektron pochta) amalga oshirish uchun turli xil xizmatlar mavjud?
qo'shib qo'ydi muallif Shubham Chaurasia, manba

7 javoblar

Yaxshilash uchun ba'zi bir fikrlar (to'liq emas):

Service1, Service2, ... sinflari NotificationService'dan olingan, process usuli o'chirib tashlangan deb taxmin qilyapman.

anonymous interface implementation of Callable:

service.submit(new Service1(conn) {
                public Object call(){
                    try {
                        process(conn, param2);//Passing connection & obj
                    } catch (Exception e) {
                        throw e;
                    }
                    return null;
                }
            });

NotificationService sinfiga ko'chirish kerak. Ushbu kod quyidagi hollarda kamayadi:

service.submit(new Service1(conn));//Will call Service1's "process" implementation
service.submit(new Service2(conn));//Will call Service2's "process" implementation
...

Tartibga solish:

Menda quyidagilar mavjud:

abstract class NotificationService implements Callable{
 //...

 //I don't know what types conn and param2 are, so ...
  protected abstract void process( ConnType conn, Param2Type param2 );

  @Override
  public Object call(){
      try {
              process(conn, param2);//Passing connection & obj
      } catch (Exception e) {
              throw e;
      }
      return null;
  }
}

Keyin jarayonni o'zlarining maxsus usullari bilan ishlashi uchun process xizmatida 1-xizmatni bekor qilishingiz mumkin.

class Service1 extends NotificationService{
    @Override
    protected void process( ConnType conn, Param2Type param2 ){
       //do process according to Service1's needs.
    }
}

Sonsuz pastadir:

for(;;){
   service.submit(...
}

abadiy Ijrochiga yangi vazifalar qo'shilganda, bu ko'chadan startService qidiruvchini blokirovka qiladi.

Har bir ijro mijozga elektron pochta orqali yuborilsa, u allaqachon suv ostida qoladi.


har bir daqiqada startService ga qo'ng'iroq qilish:

har bir daqiqada topshiriqlarni bajaradigan yangi ExecutorService bilan yakunlanadi endlessly flooded !

Bu sizning mijozlaringizni nafaqat spam-u, balki ishlashni ham tezroq tushirishi kerak.


For a starter, you could change like so:

public void startService() {

try {
    ExecutorService service = Executors.newFixedThreadPool(3);


        service.submit(new Service1(conn));//assuming callable impl is moved

        service.submit(new Service2(conn));

       //like above i have 15 services. so its ugly.
    service.shutdown();

} catch (InterruptedException e) {
    e.printStackTrace();
}
}

Har bir daqiqada bajariladigan har bir xizmat N ni rejalashtirgan bir ScheduledExecutorService ni ishlatish mumkin.

1
qo'shib qo'ydi
Fildor, iltimos, mening javobimga qarang. Bu to'g'ri bo'ladi.
qo'shib qo'ydi muallif DEADEND, manba
Siz da'vat etiladigan usulni jarayon uslubiga o'tkazishingiz kerak va jarayon uslubi NotificationService-da bo'lishi kerakligini aytdingiz.
qo'shib qo'ydi muallif DEADEND, manba
Fildor, param2 qanday ishlashi uchun (conn, param2). startService() usuli bilan param2 olishim mumkin.
qo'shib qo'ydi muallif DEADEND, manba
Fildorga juda minnatdorman. Sizning maslahatingiz ajoyib. Buning uchun sarflagan vaqtingiz uchun minnatdorman va buning uchun juda xursandman.
qo'shib qo'ydi muallif DEADEND, manba
Ok Fildor, startService() usuli bilan param2 olishim mumkin. So'ngra, har bir ServiceN sinfidagi konstruktorda connam & param2 (ConnType conn, Param2Type param2) jarayonida paramteres o'rniga, men o'ngman.
qo'shib qo'ydi muallif DEADEND, manba
Fildor, iltimos, yuqoridagi jarayon usulini qarang.
qo'shib qo'ydi muallif DEADEND, manba
Ok Fildor, Keyin eski kodim siz aytgan narsaga o'xshaydi. ServiceN sinfida qo'ng'iroq va operatsiya uslubi va param yangi Service1 (conn, param2)
qo'shib qo'ydi muallif DEADEND, manba
@Siva mening tahrirlarni ko'rish. Umid qilamanki, bu aniqroq bo'ladi.
qo'shib qo'ydi muallif Fildor, manba
Men qaerdan param e'lon qilinganligini bilmayman, shuning uchun men aytmoqchi bo'lgan qiyin. NotificationService xizmatida himoyalangan maydon bo'lsa, uni to'g'ridan-to'g'ri ServiceN sinflarida olishingiz mumkin. Men buni conn kabi qilishni xohlayman deb o'ylayman.
qo'shib qo'ydi muallif Fildor, manba
Yo'q. call() NotificationService-da bo'lishi kerak. Sizning ServiceN sinflaringiz turli xil ilovalarga ega bo'lish uchun hali ham jarayon usulini bekor qilishlari kerak.
qo'shib qo'ydi muallif Fildor, manba

Yaxshilash uchun ba'zi bir fikrlar (to'liq emas):

Service1, Service2, ... sinflari NotificationService'dan olingan, process usuli o'chirib tashlangan deb taxmin qilyapman.

anonymous interface implementation of Callable:

service.submit(new Service1(conn) {
                public Object call(){
                    try {
                        process(conn, param2);//Passing connection & obj
                    } catch (Exception e) {
                        throw e;
                    }
                    return null;
                }
            });

NotificationService sinfiga ko'chirish kerak. Ushbu kod quyidagi hollarda kamayadi:

service.submit(new Service1(conn));//Will call Service1's "process" implementation
service.submit(new Service2(conn));//Will call Service2's "process" implementation
...

Tartibga solish:

Menda quyidagilar mavjud:

abstract class NotificationService implements Callable{
 //...

 //I don't know what types conn and param2 are, so ...
  protected abstract void process( ConnType conn, Param2Type param2 );

  @Override
  public Object call(){
      try {
              process(conn, param2);//Passing connection & obj
      } catch (Exception e) {
              throw e;
      }
      return null;
  }
}

Keyin jarayonni o'zlarining maxsus usullari bilan ishlashi uchun process xizmatida 1-xizmatni bekor qilishingiz mumkin.

class Service1 extends NotificationService{
    @Override
    protected void process( ConnType conn, Param2Type param2 ){
       //do process according to Service1's needs.
    }
}

Sonsuz pastadir:

for(;;){
   service.submit(...
}

abadiy Ijrochiga yangi vazifalar qo'shilganda, bu ko'chadan startService qidiruvchini blokirovka qiladi.

Har bir ijro mijozga elektron pochta orqali yuborilsa, u allaqachon suv ostida qoladi.


har bir daqiqada startService ga qo'ng'iroq qilish:

har bir daqiqada topshiriqlarni bajaradigan yangi ExecutorService bilan yakunlanadi endlessly flooded !

Bu sizning mijozlaringizni nafaqat spam-u, balki ishlashni ham tezroq tushirishi kerak.


For a starter, you could change like so:

public void startService() {

try {
    ExecutorService service = Executors.newFixedThreadPool(3);


        service.submit(new Service1(conn));//assuming callable impl is moved

        service.submit(new Service2(conn));

       //like above i have 15 services. so its ugly.
    service.shutdown();

} catch (InterruptedException e) {
    e.printStackTrace();
}
}

Har bir daqiqada bajariladigan har bir xizmat N ni rejalashtirgan bir ScheduledExecutorService ni ishlatish mumkin.

1
qo'shib qo'ydi
Siz da'vat etiladigan usulni jarayon uslubiga o'tkazishingiz kerak va jarayon uslubi NotificationService-da bo'lishi kerakligini aytdingiz.
qo'shib qo'ydi muallif DEADEND, manba
Fildorga juda minnatdorman. Sizning maslahatingiz ajoyib. Buning uchun sarflagan vaqtingiz uchun minnatdorman va buning uchun juda xursandman.
qo'shib qo'ydi muallif DEADEND, manba
Ok Fildor, startService() usuli bilan param2 olishim mumkin. So'ngra, har bir ServiceN sinfidagi konstruktorda connam & param2 (ConnType conn, Param2Type param2) jarayonida paramteres o'rniga, men o'ngman.
qo'shib qo'ydi muallif DEADEND, manba
Fildor, param2 qanday ishlashi uchun (conn, param2). startService() usuli bilan param2 olishim mumkin.
qo'shib qo'ydi muallif DEADEND, manba
Fildor, iltimos, yuqoridagi jarayon usulini qarang.
qo'shib qo'ydi muallif DEADEND, manba
Ok Fildor, Keyin eski kodim siz aytgan narsaga o'xshaydi. ServiceN sinfida qo'ng'iroq va operatsiya uslubi va param yangi Service1 (conn, param2)
qo'shib qo'ydi muallif DEADEND, manba
Fildor, iltimos, mening javobimga qarang. Bu to'g'ri bo'ladi.
qo'shib qo'ydi muallif DEADEND, manba
Yo'q. call() NotificationService-da bo'lishi kerak. Sizning ServiceN sinflaringiz turli xil ilovalarga ega bo'lish uchun hali ham jarayon usulini bekor qilishlari kerak.
qo'shib qo'ydi muallif Fildor, manba
@Siva mening tahrirlarni ko'rish. Umid qilamanki, bu aniqroq bo'ladi.
qo'shib qo'ydi muallif Fildor, manba
Men qaerdan param e'lon qilinganligini bilmayman, shuning uchun men aytmoqchi bo'lgan qiyin. NotificationService xizmatida himoyalangan maydon bo'lsa, uni to'g'ridan-to'g'ri ServiceN sinflarida olishingiz mumkin. Men buni conn kabi qilishni xohlayman deb o'ylayman.
qo'shib qo'ydi muallif Fildor, manba

Yaxshilash uchun ba'zi bir fikrlar (to'liq emas):

Service1, Service2, ... sinflari NotificationService'dan olingan, process usuli o'chirib tashlangan deb taxmin qilyapman.

anonymous interface implementation of Callable:

service.submit(new Service1(conn) {
                public Object call(){
                    try {
                        process(conn, param2);//Passing connection & obj
                    } catch (Exception e) {
                        throw e;
                    }
                    return null;
                }
            });

NotificationService sinfiga ko'chirish kerak. Ushbu kod quyidagi hollarda kamayadi:

service.submit(new Service1(conn));//Will call Service1's "process" implementation
service.submit(new Service2(conn));//Will call Service2's "process" implementation
...

Tartibga solish:

Menda quyidagilar mavjud:

abstract class NotificationService implements Callable{
 //...

 //I don't know what types conn and param2 are, so ...
  protected abstract void process( ConnType conn, Param2Type param2 );

  @Override
  public Object call(){
      try {
              process(conn, param2);//Passing connection & obj
      } catch (Exception e) {
              throw e;
      }
      return null;
  }
}

Keyin jarayonni o'zlarining maxsus usullari bilan ishlashi uchun process xizmatida 1-xizmatni bekor qilishingiz mumkin.

class Service1 extends NotificationService{
    @Override
    protected void process( ConnType conn, Param2Type param2 ){
       //do process according to Service1's needs.
    }
}

Sonsuz pastadir:

for(;;){
   service.submit(...
}

abadiy Ijrochiga yangi vazifalar qo'shilganda, bu ko'chadan startService qidiruvchini blokirovka qiladi.

Har bir ijro mijozga elektron pochta orqali yuborilsa, u allaqachon suv ostida qoladi.


har bir daqiqada startService ga qo'ng'iroq qilish:

har bir daqiqada topshiriqlarni bajaradigan yangi ExecutorService bilan yakunlanadi endlessly flooded !

Bu sizning mijozlaringizni nafaqat spam-u, balki ishlashni ham tezroq tushirishi kerak.


For a starter, you could change like so:

public void startService() {

try {
    ExecutorService service = Executors.newFixedThreadPool(3);


        service.submit(new Service1(conn));//assuming callable impl is moved

        service.submit(new Service2(conn));

       //like above i have 15 services. so its ugly.
    service.shutdown();

} catch (InterruptedException e) {
    e.printStackTrace();
}
}

Har bir daqiqada bajariladigan har bir xizmat N ni rejalashtirgan bir ScheduledExecutorService ni ishlatish mumkin.

1
qo'shib qo'ydi
Siz da'vat etiladigan usulni jarayon uslubiga o'tkazishingiz kerak va jarayon uslubi NotificationService-da bo'lishi kerakligini aytdingiz.
qo'shib qo'ydi muallif DEADEND, manba
Fildor, iltimos, mening javobimga qarang. Bu to'g'ri bo'ladi.
qo'shib qo'ydi muallif DEADEND, manba
Fildorga juda minnatdorman. Sizning maslahatingiz ajoyib. Buning uchun sarflagan vaqtingiz uchun minnatdorman va buning uchun juda xursandman.
qo'shib qo'ydi muallif DEADEND, manba
Ok Fildor, startService() usuli bilan param2 olishim mumkin. So'ngra, har bir ServiceN sinfidagi konstruktorda connam & param2 (ConnType conn, Param2Type param2) jarayonida paramteres o'rniga, men o'ngman.
qo'shib qo'ydi muallif DEADEND, manba
Fildor, param2 qanday ishlashi uchun (conn, param2). startService() usuli bilan param2 olishim mumkin.
qo'shib qo'ydi muallif DEADEND, manba
Fildor, iltimos, yuqoridagi jarayon usulini qarang.
qo'shib qo'ydi muallif DEADEND, manba
Ok Fildor, Keyin eski kodim siz aytgan narsaga o'xshaydi. ServiceN sinfida qo'ng'iroq va operatsiya uslubi va param yangi Service1 (conn, param2)
qo'shib qo'ydi muallif DEADEND, manba
@Siva mening tahrirlarni ko'rish. Umid qilamanki, bu aniqroq bo'ladi.
qo'shib qo'ydi muallif Fildor, manba
Men qaerdan param e'lon qilinganligini bilmayman, shuning uchun men aytmoqchi bo'lgan qiyin. NotificationService xizmatida himoyalangan maydon bo'lsa, uni to'g'ridan-to'g'ri ServiceN sinflarida olishingiz mumkin. Men buni conn kabi qilishni xohlayman deb o'ylayman.
qo'shib qo'ydi muallif Fildor, manba
Yo'q. call() NotificationService-da bo'lishi kerak. Sizning ServiceN sinflaringiz turli xil ilovalarga ega bo'lish uchun hali ham jarayon usulini bekor qilishlari kerak.
qo'shib qo'ydi muallif Fildor, manba
public void startService() {

try {
    List list = getServicesNotificationList();

    ExecutorService service = Executors.newFixedThreadPool(list.size); here list size should be 15

    for (int i=0; i < list.size(); i++) {

        service.submit(new NotificationService(conn, list[i]));
    }

    service.shutdown();

} catch (InterruptedException e) {
    e.printStackTrace();
}
}
0
qo'shib qo'ydi

Ijrochi xizmatidan foydalanishingiz mumkin.

0
qo'shib qo'ydi
Iltimos, uni batafsil ishlab chiqing.
qo'shib qo'ydi muallif DEADEND, manba

Ijrochi xizmatidan foydalanishingiz mumkin.

0
qo'shib qo'ydi
Iltimos, uni batafsil ishlab chiqing.
qo'shib qo'ydi muallif DEADEND, manba

Ijrochi xizmatidan foydalanishingiz mumkin.

0
qo'shib qo'ydi
Iltimos, uni batafsil ishlab chiqing.
qo'shib qo'ydi muallif DEADEND, manba