package com.ctrip.framework.apollo.portal.spi.ctrip; import com.ctrip.framework.apollo.portal.component.config.PortalConfig; import com.ctrip.framework.apollo.portal.entity.bo.Email; import com.ctrip.framework.apollo.portal.spi.EmailService; import com.ctrip.framework.apollo.tracer.Tracer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import java.lang.reflect.Method; import javax.annotation.PostConstruct; public class CtripEmailService implements EmailService { private static final Logger logger = LoggerFactory.getLogger(CtripEmailService.class); private Object emailServiceClient; private Method sendEmailAsync; private Method sendEmail; @Autowired private CtripEmailRequestBuilder emailRequestBuilder; @Autowired private PortalConfig portalConfig; @PostConstruct public void init() { try { initServiceClientConfig(); Class emailServiceClientClazz = Class.forName("com.ctrip.framework.apolloctripservice.emailservice.EmailServiceClient"); Method getInstanceMethod = emailServiceClientClazz.getMethod("getInstance"); emailServiceClient = getInstanceMethod.invoke(null); Class sendEmailRequestClazz = Class.forName("com.ctrip.framework.apolloctripservice.emailservice.SendEmailRequest"); sendEmailAsync = emailServiceClientClazz.getMethod("sendEmailAsync", sendEmailRequestClazz); sendEmail = emailServiceClientClazz.getMethod("sendEmail", sendEmailRequestClazz); } catch (Throwable e) { logger.error("init ctrip email service failed", e); Tracer.logError("init ctrip email service failed", e); } } private void initServiceClientConfig() throws Exception { Class serviceClientConfigClazz = Class.forName("com.ctriposs.baiji.rpc.client.ServiceClientConfig"); Object serviceClientConfig = serviceClientConfigClazz.newInstance(); Method setFxConfigServiceUrlMethod = serviceClientConfigClazz.getMethod("setFxConfigServiceUrl", String.class); setFxConfigServiceUrlMethod.invoke(serviceClientConfig, portalConfig.soaServerAddress()); Class serviceClientBaseClazz = Class.forName("com.ctriposs.baiji.rpc.client.ServiceClientBase"); Method initializeMethod = serviceClientBaseClazz.getMethod("initialize", serviceClientConfigClazz); initializeMethod.invoke(null, serviceClientConfig); } @Override public void send(Email email) { try { Object emailRequest = emailRequestBuilder.buildEmailRequest(email); Object sendResponse = portalConfig.isSendEmailAsync() ? sendEmailAsync.invoke(emailServiceClient, emailRequest) : sendEmail.invoke(emailServiceClient, emailRequest); logger.info("Email server response: " + sendResponse); } catch (Throwable e) { logger.error("send email failed", e); Tracer.logError("send email failed", e); } } }