Commit 373c60d4 authored by chenkai's avatar chenkai

send message

parent 9828ad32
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
<profile default="false" name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<processorPath useClasspath="true" />
<module name="fund-manage-sdk" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="fund-manage-sdk" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/fund-manage-sdk.iml" filepath="$PROJECT_DIR$/fund-manage-sdk.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
......@@ -23,8 +23,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EntityScan(basePackages = {"cn.quantgroup.fundmanage.entity"})
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages = {"cn.quantgroup.fundmanage.repository"})
@PropertySource({"classpath:application.properties",
"classpath:fundmanage.properties"})
@PropertySource({"classpath:application.properties", "classpath:fundmanage.properties"})
@EnableTransactionManagement
@EnableScheduling
@EnableAsync
......@@ -61,7 +60,7 @@ public class Bootstrap {
}
public static void main(String[] args) throws ParseException {
parseOptions(args);
// parseOptions(args);
SpringApplication.run(Bootstrap.class, args);
}
}
package cn.quantgroup.config.http;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.cookie.Cookie;
import org.apache.http.cookie.CookieOrigin;
import org.apache.http.cookie.CookieSpecProvider;
import org.apache.http.cookie.MalformedCookieException;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.cookie.BestMatchSpecFactory;
import org.apache.http.impl.cookie.BrowserCompatSpec;
import org.apache.http.impl.cookie.BrowserCompatSpecFactory;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.boot.context.embedded.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.ConverterRegistry;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.session.web.http.HeaderHttpSessionStrategy;
import org.springframework.web.filter.CharacterEncodingFilter;
import javax.net.ssl.SSLContext;
import javax.servlet.MultipartConfigElement;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
/**
* Created by Miraculous on 15/7/12.
*/
@Configuration
public class HttpConfig {
@Bean
HeaderHttpSessionStrategy sessionStrategy() {
return new HeaderHttpSessionStrategy();
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
registrationBean.setFilter(characterEncodingFilter);
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
registrationBean.setOrder(Integer.MIN_VALUE);
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
/**
* 该方法主要对对象json序列化产生影响,其功能如下:
* 1. 禁用缩进输出
* 2. 日期格式排版
* 3. null被过滤掉
* 4. 将enum转为其ordinal
*
* @return Jackson2ObjectMapperBuilder
*/
@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.indentOutput(false)
.dateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))
.defaultViewInclusion(false)
.serializationInclusion(JsonInclude.Include.NON_NULL)
.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_INDEX,
DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS);
return builder;
}
// hack spring mvc.
@Bean
public IntegerToEnumConverterFactory getIntegerToEnumConverterFactory(
ConverterRegistry defaultConversionService, ConverterRegistry mvcConversionService, ConverterRegistry integrationConversionService) {
IntegerToEnumConverterFactory factory = new IntegerToEnumConverterFactory();
defaultConversionService.removeConvertible(String.class, Enum.class);
mvcConversionService.removeConvertible(String.class, Enum.class);
integrationConversionService.removeConvertible(String.class, Enum.class);
defaultConversionService.addConverterFactory(factory);
mvcConversionService.addConverterFactory(factory);
integrationConversionService.addConverterFactory(factory);
return factory;
}
@Bean(name = "httpClient")
public CloseableHttpClient httpClient() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
// socket factory
ConnectionSocketFactory plainSocketFactory = new PlainConnectionSocketFactory();
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(
null, (x509Certificates, authType) -> true).build();
LayeredConnectionSocketFactory sslSocketFactory =
new SSLConnectionSocketFactory(sslContext, new AllowAllHostnameVerifier());
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", plainSocketFactory)
.register("https", sslSocketFactory).build();
// cookie specification
Registry<CookieSpecProvider> cookieSpecProviderRegistry = RegistryBuilder.<CookieSpecProvider>create()
.register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory())
.register(CookieSpecs.BROWSER_COMPATIBILITY, new BrowserCompatSpecFactory())
.register("easy", httpContext -> new BrowserCompatSpec() {
public void validate(Cookie cookie, CookieOrigin origin) throws MalformedCookieException {
}
}).build();
// connection manager
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
connectionManager.setMaxTotal(10000);
connectionManager.setDefaultMaxPerRoute(1000);
// retry handler
HttpRequestRetryHandler retryHandler = new StandardHttpRequestRetryHandler(3, false);
// keep alive strategy
ConnectionKeepAliveStrategy keepAliveStrategy = new DefaultConnectionKeepAliveStrategy();
// httpclient
return HttpClients.custom()
.setConnectionManager(connectionManager)
.setRetryHandler(retryHandler)
.setKeepAliveStrategy(keepAliveStrategy)
.setDefaultCookieSpecRegistry(cookieSpecProviderRegistry).build();
}
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("5MB");
factory.setMaxRequestSize("5MB");
return factory.createMultipartConfig();
}
}
package cn.quantgroup.config.http;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
/**
* Created by Miraculous on 15/7/12.
*/
final class IntegerToEnumConverterFactory implements ConverterFactory<String, Enum> {
IntegerToEnumConverterFactory() {
}
public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
Class<?> enumType = targetType;
while (enumType != null && !enumType.isEnum()) {
enumType = enumType.getSuperclass();
}
if (enumType == null) {
throw new IllegalArgumentException("The target type " + targetType.getName() + " does not refer to an enum");
} else {
return new IntegerToEnumConverterFactory.IntegerToEnum(enumType);
}
}
private class IntegerToEnum<T extends Enum> implements Converter<String, T> {
private final Class<T> enumType;
public IntegerToEnum(Class<T> enumType) {
this.enumType = enumType;
}
public T convert(String source) {
T[] ts = enumType.getEnumConstants();
int ordinal = Integer.parseInt(source);
return ordinal < ts.length && ordinal >= 0 ? ts[ordinal] : null;
}
}
}
\ No newline at end of file
package cn.quantgroup.fundmanage.config.rabbitmq;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Created by Rocky on 2016/9/5.
*/
@Configuration
public class RabbitMqConfig {
@Value("${baitiaodebt.rabbitmq.queue.quanarorder}")
private String qunarBTQueue;
@Value("${baitiaodebt.rabbitmq.exchange.quanarorder}")
private String baitiaodebtExchange;
@Value("${rabbitmq.connection.host}")
private String host;
@Value("${rabbitmq.connection.port}")
private Integer port;
@Value("${rabbitmq.connection.user}")
private String user;
@Value("${rabbitmq.connection.password}")
private String password;
@Value("${rabbitmq.connection.virtual-host}")
private String virtualHost;
@Bean
public CachingConnectionFactory cachingConnectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port);
connectionFactory.setChannelCacheSize(1024);
connectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CONNECTION);
connectionFactory.setChannelCacheSize(180 * 1000);
connectionFactory.setConnectionCacheSize(1024);
connectionFactory.setUsername(user);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
connectionFactory.setPublisherReturns(false);
connectionFactory.setPublisherConfirms(false);
return connectionFactory;
}
@Bean
public RabbitAdmin rabbitAdmin(CachingConnectionFactory cachingConnectionFactory) {
return new RabbitAdmin(cachingConnectionFactory);
}
@Bean
public DirectExchange directExchange() {
return new DirectExchange(baitiaodebtExchange, true, false);
}
@Bean(name = "rabbitTemplate")
public RabbitTemplate qunarBTRabbitTemplate(CachingConnectionFactory cachingConnectionFactory) {
RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory);
template.setExchange(baitiaodebtExchange);
return template;
}
@Bean(name = "qunarBTQueue")
public Queue qunarBTQueue() { //还款的queue
return new Queue(qunarBTQueue);
}
@Bean(name = "qunarBTQueueBinding")
public Binding bindingQunarBT(RabbitAdmin rabbitAdmin, @Qualifier("qunarBTQueue")Queue qunarBTQueue, DirectExchange directExchange) {
Binding binding = BindingBuilder.bind(qunarBTQueue).to(directExchange).with(qunarBTQueue.getName());
rabbitAdmin.declareBinding(binding);
return binding;
}
}
package cn.quantgroup.fundmanage.model;
/**
* Created by Rocky on 2016/9/6.
*/
public enum BaiTiaoType {
QUNAR_BNAITIAO,
BAITIAO,
LINE_BAITIAO
}
package cn.quantgroup.fundmanage.model;
import java.io.Serializable;
/**
* Created by Miraculous on 15/7/5.
*/
public class JsonResult implements Serializable {
private static final Long SUCCESS_CODE = 0L;
private static final Long ERROR_STATE_CODE = 1L;
private static final Long SUCCESS_BUSSINESS_CODE = 0L;
private static final Long ERROR_BUSSINESS_CODE = 1L;
private static final long serialVersionUID = -1L;
private static final String ZERO_FILL_TEMPLATE = "%04d";
private String msg = "";
// 0成功,1失败
private String code = "0000";
// 业务错误码
private String businessCode = "0000";
private Object data = null;
public JsonResult() {
}
/**
* @param msg
* @param code
* @param data
*/
public JsonResult(String msg, Long code, Object data) {
this.msg = msg;
this.code = String.format(ZERO_FILL_TEMPLATE, code);
this.data = data;
}
public JsonResult(String msg, Long code, Object data, Long businessCode) {
this.msg = msg;
this.code = String.format(ZERO_FILL_TEMPLATE, code);
this.data = data;
this.businessCode = String.format(ZERO_FILL_TEMPLATE, businessCode);
}
/**
* 构造成功的JsonResult
*
* @param msg String
* @param data Object
* @return JsonResult
*/
public static JsonResult buildSuccessResult(String msg, Object data) {
return new JsonResult(msg, SUCCESS_CODE, data, SUCCESS_BUSSINESS_CODE);
}
public static JsonResult buildSuccessResult(String msg, Object data, Long bussinessId) {
return new JsonResult(msg, SUCCESS_CODE, data, bussinessId);
}
/**
* 构造状态不正确的JsonResult
*
* @param msg String
* @param data Object
* @return JsonResult
*/
public static JsonResult buildErrorStateResult(String msg, Object data) {
return new JsonResult(msg, SUCCESS_CODE, data, ERROR_BUSSINESS_CODE);
}
public static JsonResult buildErrorStateResult(String msg, Object data, Long busniessId) {
return new JsonResult(msg, SUCCESS_CODE, data, busniessId);
}
public static JsonResult buildFatalErrorStateResult(String msg, Object data, Long busniessId) {
return new JsonResult(msg, ERROR_STATE_CODE, data, busniessId);
}
public JsonResult(Object data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getBusinessCode() {
return businessCode;
}
public void setBusinessCode(String businessCode) {
this.businessCode = businessCode;
}
@Override
public String toString() {
return "JsonResult{" +
"businessCode='" + businessCode + '\'' +
", code='" + code + '\'' +
", data=" + data +
'}';
}
public boolean isSuccess() {
return "0000".equals(code) && "0000".equals(businessCode);
}
}
package cn.quantgroup.fundmanage.service.message;
/**
* Created by Rocky on 2016/9/5.
*/
public interface IMessageHandler {
void handle(String msg);
}
package cn.quantgroup.fundmanage.service.message.impl;
import cn.quantgroup.fundmanage.service.message.IMessageHandler;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by Rocky on 2016/9/5.
*/
public class GenContractSuccessHandler implements IMessageHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(GenContractSuccessHandler.class);
private static final ObjectMapper MAPPER = new ObjectMapper();
static {
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public void handle(String message){
}
}
package cn.quantgroup.fundmanage.service.rabbitmq;
import cn.quantgroup.fundmanage.model.BaiTiaoType;
import cn.quantgroup.fundmanage.model.JsonResult;
/**
* Created by Rocky on 2016/9/6.
*/
public interface IRabbitMQ {
JsonResult send(String content,BaiTiaoType type);
}
package cn.quantgroup.fundmanage.service.rabbitmq.impl;
import cn.quantgroup.fundmanage.model.BaiTiaoType;
import cn.quantgroup.fundmanage.model.JsonResult;
import cn.quantgroup.fundmanage.service.rabbitmq.IRabbitMQ;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
/**
* Created by Rocky on 2016/9/6.
*/
@Service
public class RabbitMQImpl implements IRabbitMQ{
private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQImpl.class);
@Autowired
@Qualifier("rabbitTemplate")
private RabbitTemplate rabbitTemplate;
@Autowired
@Qualifier("qunarBTQueue")
private Queue qunarBTQueue;
private String queueName ;
public JsonResult send(String content,BaiTiaoType type){
queueName= qunarBTQueue.getName();
if(type == BaiTiaoType.QUNAR_BNAITIAO){
queueName= qunarBTQueue.getName();
}
// other baitiao channel-- begin
// other baitiao channel-- end
try{
rabbitTemplate.convertAndSend(queueName, content);
}catch (Exception e){
LOGGER.error(e.getMessage(),e);
return JsonResult.buildErrorStateResult(e.getMessage(),e);
}
return JsonResult.buildSuccessResult("success",null);
}
}
......@@ -6,3 +6,4 @@ rabbitmq.connection.port=5672
rabbitmq.connection.user=rabbitadmin
rabbitmq.connection.password=123456
rabbitmq.connection.virtual-host=baitiao_debt
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份)-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/tmp/logs/fund_manage.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/tmp/logs/fund_manage.log.%d{yyyy-MM-dd}.bak</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{ISO8601} [%thread] [%-5level] %logger - %msg%n</Pattern>
<pattern>%d{ISO8601} [%thread] [%-5level] %logger - %msg%n</pattern>
</layout>
</appender>
<!--这里指定logger name 是为jmx设置日志级别做铺垫 -->
<!--<logger name="root">
<level value="INFO" />
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger>-->
<!-- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/quant_group/logs/di_ting.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/quant_group/logs/fund_manage_sdk.log.%d{yyyy-MM-dd}.bak</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{ISO8601} [%thread] [%-5level] %logger - %msg%n</Pattern>
</layout>
</appender>-->
<logger name="com.atomikos" level="warn"/>
<logger name="org.springframework" level="warn"/>
<logger name="org.hibernate" level="warn"/>
<logger name="org.apache" level="warn"/>
<logger name="ch.qos.logback" level="warn"/>
<root level="info">
<appender-ref ref="FILE"/>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<!-- <appender-ref ref="FILE"/>-->
</root>
</configuration>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment