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