Java代码设计使用拨打mutliple Services的执行人员服务



我试图运行15个服务,每个服务都会向不同的客户发送邮件。提取标准将与每种服务不同

Service1,Service2,Service3 .... Service15 。每个类都扩展 Notificationationservice class。

notificationservice类具有extractrecipient(),sendmail(),sendsms(),lognotification()。

所有服务类[1至15] 具有process()方法,该方法将调用 notificationationservice 方法并完成他们的工作。

这是设计Java代码的正确方法吗?

及以下代码看起来很丑,是否有任何智能方法可以处理。请有人帮助我。

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) {
}
}

一些要改进的点(未完成):

我假设service1,service2,...类来自notificationservice,覆盖process方法。

Callable<Object>的匿名接口实现

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

应将其移至NotificationService类。然后,此代码将减少为:

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

编辑:

我想到的是此设置:

abstract class NotificationService implements Callable<Object>{
  // ...
  // 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;
  }
}

然后,您可以在Service1,Service2 ...以其特定方式处理该过程中的process

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

无尽的循环:

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

将在该循环中阻止startService的呼叫者,而将新任务添加到执行人 Forever 中。

如果每个执行都会向客户发送电子邮件,他将被淹没。


每分钟致电startService

将导致新的executorService 将每分钟无休止地淹没的任务!

这不仅会垃圾邮件垃圾邮件,而且还应该很快降低性能。


对于起动器,您可以像这样更改:

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();
}
}

一种替代方法是使用一个计划的ExexeCutorService,您可以安排每分钟每分钟执行每个服务的每个服务。

使用执行器服务的InvoKeall。

public void startService() {
try {
    List<Bean> 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();
}
}

相关内容

  • 没有找到相关文章

最新更新