Here are the examples of the java api org.springframework.kafka.core.KafkaTemplate taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
273 Examples
19
View Source File : SpringKafkaTaskScheduler.java
License : MIT License
Project Creator : zidoshare
License : MIT License
Project Creator : zidoshare
/**
* Spring Kafka Communication Manager
*
* @author zido
*/
public clreplaced SpringKafkaTaskScheduler extends AbstractScheduler {
private String bootstrapServers;
private String groupId = "Elise";
private String topicreplacedyzer = "__replacedyzer__";
private String topicDownload = "__download__";
private KafkaTemplate<Long, Seed> template;
private KafkaMessageListenerContainer<Long, Seed> replacedyzerContainer;
private KafkaMessageListenerContainer<Long, Seed> downloaderContainer;
public SpringKafkaTaskScheduler setBootstrapServers(String bootstrapServers) {
this.bootstrapServers = bootstrapServers;
this.template = createTemplate();
return this;
}
public SpringKafkaTaskScheduler setGroupId(String groupId) {
this.groupId = groupId;
return this;
}
public SpringKafkaTaskScheduler setTopicreplacedyzer(String topicreplacedyzer) {
this.topicreplacedyzer = topicreplacedyzer;
return this;
}
public SpringKafkaTaskScheduler setTopicDownload(String topicDownload) {
this.topicDownload = topicDownload;
return this;
}
@Override
public synchronized void setResponseProcessor(ResponseProcessor responseProcessor) {
// TODO not work,and fix this
// super.setResponseProcessor(responseProcessor);
if (this.replacedyzerContainer == null) {
this.replacedyzerContainer = runContainer(topicreplacedyzer, message -> {
Seed seed = message.value();
super.onProcess(seed.getTask(), seed.getRequest(), seed.getResponse());
});
}
if (!this.replacedyzerContainer.isRunning()) {
this.replacedyzerContainer.start();
}
}
public synchronized void setDownloader(Downloader downloader) {
// TODO not work,and fix this
// super.setDownloader(downloader);
if (this.downloaderContainer == null) {
this.downloaderContainer = runContainer(topicDownload, message -> {
Seed seed = message.value();
super.onDownload(seed.getTask(), seed.getRequest());
});
}
if (!this.downloaderContainer.isRunning()) {
this.downloaderContainer.start();
}
}
private KafkaMessageListenerContainer<Long, Seed> runContainer(String topic, MessageListener<Long, Seed> listener) {
ContainerProperties containerProps = new ContainerProperties(topic);
containerProps.setMessageListener(listener);
KafkaMessageListenerContainer<Long, Seed> tmp = createContainer(containerProps);
tmp.setBeanName(topic + "message-listener");
return tmp;
}
@Override
protected void pushWhenNoDuplicate(Task task, Request request) {
template.send(topicDownload, new Seed().setTask((DefaultTask) task).setRequest(request));
}
private KafkaMessageListenerContainer<Long, Seed> createContainer(ContainerProperties containerProps) {
Map<String, Object> props = consumerProps();
DefaultKafkaConsumerFactory<Long, Seed> cf = new DefaultKafkaConsumerFactory<>(props);
return new KafkaMessageListenerContainer<>(cf, containerProps);
}
private KafkaTemplate<Long, Seed> createTemplate() {
Map<String, Object> senderProps = senderProps();
ProducerFactory<Long, Seed> pf = new DefaultKafkaProducerFactory<>(senderProps);
return new KafkaTemplate<>(pf, true);
}
private Map<String, Object> consumerProps() {
if (bootstrapServers == null) {
throw new IllegalArgumentException("bootstrapServers can not be null");
}
Map<String, Object> props = new HashMap<>(7);
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "100");
props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "15000");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLreplaced_CONFIG, LongDeserializer.clreplaced);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLreplaced_CONFIG, JsonDeserializer.clreplaced);
props.put(JsonDeserializer.TRUSTED_PACKAGES, "site.zido.elise.kafka.pojo");
return props;
}
private Map<String, Object> senderProps() {
if (bootstrapServers == null) {
throw new IllegalArgumentException("bootstrapServers can not be null");
}
Map<String, Object> props = new HashMap<>(7);
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ProducerConfig.RETRIES_CONFIG, 0);
props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
props.put(ProducerConfig.LINGER_MS_CONFIG, 1);
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
props.put(ProducerConfig.KEY_SERIALIZER_CLreplaced_CONFIG, LongSerializer.clreplaced);
props.put(ProducerConfig.VALUE_SERIALIZER_CLreplaced_CONFIG, JsonSerializer.clreplaced);
props.put(JsonSerializer.ADD_TYPE_INFO_HEADERS, true);
return props;
}
@Override
public void cancel(boolean ifRunning) {
if (this.replacedyzerContainer != null && this.replacedyzerContainer.isRunning()) {
this.replacedyzerContainer.stop();
}
if (this.downloaderContainer != null && this.downloaderContainer.isRunning()) {
this.downloaderContainer.stop();
}
}
}
19
View Source File : KafkaSender.java
License : Apache License 2.0
Project Creator : yangyl7239
License : Apache License 2.0
Project Creator : yangyl7239
/**
*/
@Component("kafkaSender")
public clreplaced KafkaSender implements ISender {
@Value("${adconf.kafka.topic}")
private String topic;
private final KafkaTemplate<String, String> kafkaTemplate;
@Autowired
public KafkaSender(KafkaTemplate<String, String> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
@Override
public void sender(MySqlRowData rowData) {
kafkaTemplate.send(topic, JSON.toJSONString(rowData));
}
@KafkaListener(topics = { "ad-search-mysql-data" }, groupId = "ad-search")
public void processMysqlRowData(ConsumerRecord<?, ?> record) {
Optional<?> kafkaMessage = Optional.ofNullable(record.value());
if (kafkaMessage.isPresent()) {
Object message = kafkaMessage.get();
MySqlRowData rowData = JSON.parseObject(message.toString(), MySqlRowData.clreplaced);
System.out.println("kafka processMysqlRowData: " + JSON.toJSONString(rowData));
}
}
}
19
View Source File : KafkaService.java
License : Apache License 2.0
Project Creator : yanghaiji
License : Apache License 2.0
Project Creator : yanghaiji
/**
* @author Dylan Yang
* @Description: KafkaService
* @replacedle: KafkaService
* @ProjectName javayh-cloud
* @date 2019/7/16 23:26
*/
@Slf4j
@Service
public clreplaced KafkaService {
@Autowired
private KafkaTemplate kafkaTemplate;
/**
* 生产者
* @param data
*/
public void send(SysMenu data) {
ListenableFuture send = kafkaTemplate.send(StaticNumber.JAVAYOHO, data);
send.addCallback(new ListenableFutureCallback() {
@Override
public void onSuccess(Object result) {
log.info("send success");
}
@Override
public void onFailure(Throwable ex) {
log.info("send failure");
}
});
log.info("send success");
}
// public void sendString(String data){
// ListenableFuture send = kafkaTemplate.send(StaticNumber.YANGHJ, data);
// send.addCallback(new ListenableFutureCallback(){
// @Override
// public void onSuccess(Object result) {
// log.info("send success");
// }
// @Override
// public void onFailure(Throwable ex) {
// log.info("send failure");
// }
// });
// log.info("send success");
// }
}
19
View Source File : WithdrawController.java
License : Apache License 2.0
Project Creator : xunibidev
License : Apache License 2.0
Project Creator : xunibidev
/**
* @author GS
* @date 2020年01月26日
*/
@RestController
@Slf4j
@RequestMapping(value = "/withdraw", method = RequestMethod.POST)
public clreplaced WithdrawController {
@Autowired
private MemberAddressService memberAddressService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private MemberService memberService;
@Autowired
private CoinService coinService;
@Autowired
private MemberWalletService memberWalletService;
@Autowired
private WithdrawRecordService withdrawApplyService;
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private LocaleMessageSourceService sourceService;
@Autowired
private MemberTransactionService memberTransactionService;
/**
* 增加提现地址
* @param address
* @param unit
* @param remark
* @param code
* @param aims
* @param user
* @return
*/
@RequestMapping("address/add")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult addAddress(String address, String unit, String remark, String code, String aims, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
hasText(address, sourceService.getMessage("MISSING_COIN_ADDRESS"));
hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
hasText(code, sourceService.getMessage("MISSING_VERIFICATION_CODE"));
hasText(aims, sourceService.getMessage("MISSING_PHONE_OR_EMAIL"));
ValueOperations valueOperations = redisTemplate.opsForValue();
Member member = memberService.findOne(user.getId());
if (member.getMobilePhone() != null && aims.equals(member.getMobilePhone())) {
Object info = valueOperations.get(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
if (info == null || !info.toString().equals(code)) {
return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
} else {
valueOperations.getOperations().delete(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
}
} else if (member.getEmail() != null && aims.equals(member.getEmail())) {
Object info = valueOperations.get(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
if (!info.toString().equals(code)) {
return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
} else {
valueOperations.getOperations().delete(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
}
} else {
return MessageResult.error(sourceService.getMessage("ADD_ADDRESS_FAILED"));
}
MessageResult result = memberAddressService.addMemberAddress(user.getId(), address, unit, remark);
if (result.getCode() == 0) {
result.setMessage(sourceService.getMessage("ADD_ADDRESS_SUCCESS"));
} else if (result.getCode() == 500) {
result.setMessage(sourceService.getMessage("ADD_ADDRESS_FAILED"));
} else if (result.getCode() == 600) {
result.setMessage(sourceService.getMessage("COIN_NOT_SUPPORT"));
}
return result;
}
/**
* 删除提现地址
* @param id
* @param user
* @return
*/
@RequestMapping("address/delete")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult deleteAddress(long id, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
MessageResult result = memberAddressService.deleteMemberAddress(user.getId(), id);
if (result.getCode() == 0) {
result.setMessage(sourceService.getMessage("DELETE_ADDRESS_SUCCESS"));
} else {
result.setMessage(sourceService.getMessage("DELETE_ADDRESS_FAILED"));
}
return result;
}
/**
* 提现地址分页信息
* @param user
* @param pageNo
* @param pageSize
* @param unit
* @return
*/
@RequestMapping("address/page")
public MessageResult addressPage(@SessionAttribute(SESSION_MEMBER) AuthMember user, int pageNo, int pageSize, String unit) {
Page<MemberAddress> page = memberAddressService.pageQuery(pageNo, pageSize, user.getId(), unit);
Page<ScanMemberAddress> scanMemberAddresses = page.map(x -> ScanMemberAddress.toScanMemberAddress(x));
MessageResult result = MessageResult.success();
result.setData(scanMemberAddresses);
return result;
}
/**
* 支持提现的地址
* @return
*/
@RequestMapping("support/coin")
public MessageResult queryWithdraw() {
List<Coin> list = coinService.findAllCanWithDraw();
List<String> list1 = new ArrayList<>();
list.stream().forEach(x -> list1.add(x.getUnit()));
MessageResult result = MessageResult.success();
result.setData(list1);
return result;
}
/**
* 提现币种详细信息
* @param user
* @return
*/
@RequestMapping("support/coin/info")
public MessageResult queryWithdrawCoin(@SessionAttribute(SESSION_MEMBER) AuthMember user) {
List<Coin> list = coinService.findAllCanWithDraw();
List<MemberWallet> list1 = memberWalletService.findAllByMemberId(user.getId());
long id = user.getId();
List<WithdrawWalletInfo> list2 = list1.stream().filter(x -> list.contains(x.getCoin())).map(x -> WithdrawWalletInfo.builder().balance(x.getBalance()).withdrawScale(x.getCoin().getWithdrawScale()).maxTxFee(x.getCoin().getMaxTxFee()).minTxFee(x.getCoin().getMinTxFee()).minAmount(x.getCoin().getMinWithdrawAmount()).maxAmount(x.getCoin().getMaxWithdrawAmount()).name(x.getCoin().getName()).nameCn(x.getCoin().getNameCn()).threshold(x.getCoin().getWithdrawThreshold()).unit(x.getCoin().getUnit()).accountType(x.getCoin().getAccountType()).canAutoWithdraw(x.getCoin().getCanAutoWithdraw()).addresses(memberAddressService.queryAddress(id, x.getCoin().getName())).build()).collect(Collectors.toList());
MessageResult result = MessageResult.success();
result.setData(list2);
return result;
}
/**
* 申请提币(请到PC端提币或升级APP)
* 没有验证码校验
* @param user
* @param unit
* @param address
* @param amount
* @param fee
* @param remark
* @param jyPreplacedword
* @return
* @throws Exception
*/
@RequestMapping("apply")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult withdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword) throws Exception {
return MessageResult.success(sourceService.getMessage("WITHDRAW_TO_PC"));
}
/**
* 申请提币(添加验证码校验)
* @param user
* @param unit
* @param address
* @param amount
* @param fee
* @param remark
* @param jyPreplacedword
* @return
* @throws Exception
*/
@RequestMapping("apply/code")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult withdrawCode(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword, @RequestParam("code") String code) throws Exception {
hasText(jyPreplacedword, sourceService.getMessage("MISSING_JYPreplacedWORD"));
hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
Coin coin = coinService.findByUnit(unit);
amount.setScale(coin.getWithdrawScale(), BigDecimal.ROUND_DOWN);
notNull(coin, sourceService.getMessage("COIN_ILLEGAL"));
isTrue(coin.getStatus().equals(CommonStatus.NORMAL) && coin.getCanWithdraw().equals(BooleanEnum.IS_TRUE), sourceService.getMessage("COIN_NOT_SUPPORT"));
isTrue(compare(fee, new BigDecimal(String.valueOf(coin.getMinTxFee()))), sourceService.getMessage("CHARGE_MIN") + coin.getMinTxFee());
isTrue(compare(new BigDecimal(String.valueOf(coin.getMaxTxFee())), fee), sourceService.getMessage("CHARGE_MAX") + coin.getMaxTxFee());
isTrue(compare(coin.getMaxWithdrawAmount(), amount), sourceService.getMessage("WITHDRAW_MAX") + coin.getMaxWithdrawAmount());
isTrue(compare(amount, coin.getMinWithdrawAmount()), sourceService.getMessage("WITHDRAW_MIN") + coin.getMinWithdrawAmount());
MemberWallet memberWallet = memberWalletService.findByCoinAndMemberId(coin, user.getId());
isTrue(compare(memberWallet.getBalance(), amount), sourceService.getMessage("INSUFFICIENT_BALANCE"));
// isTrue(memberAddressService.findByMemberIdAndAddress(user.getId(), address).size() > 0, sourceService.getMessage("WRONG_ADDRESS"));
isTrue(memberWallet.getIsLock() == BooleanEnum.IS_FALSE, "钱包已锁定");
Member member = memberService.findOne(user.getId());
RealNameStatus realNameStatus = member.getRealNameStatus();
if (!"已认证".equals(realNameStatus.getCnName())) {
return MessageResult.error(sourceService.getMessage("NO_REALNAM"));
}
String mbPreplacedword = member.getJyPreplacedword();
replacedert.hasText(mbPreplacedword, sourceService.getMessage("NO_SET_JYPreplacedWORD"));
replacedert.isTrue(Md5.md5Digest(jyPreplacedword + member.getSalt()).toLowerCase().equals(mbPreplacedword), sourceService.getMessage("ERROR_JYPreplacedWORD"));
ValueOperations valueOperations = redisTemplate.opsForValue();
String phone = member.getMobilePhone();
Object codeRedis = valueOperations.get(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
notNull(codeRedis, sourceService.getMessage("VERIFICATION_CODE_NOT_EXISTS"));
if (!codeRedis.toString().equals(code)) {
return error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
} else {
valueOperations.getOperations().delete(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
}
MessageResult result = memberWalletService.freezeBalance(memberWallet, amount);
if (result.getCode() != 0) {
throw new InformationExpiredException("Information Expired");
}
WithdrawRecord withdrawApply = new WithdrawRecord();
withdrawApply.setCoin(coin);
withdrawApply.setFee(fee);
withdrawApply.setArrivedAmount(sub(amount, fee));
withdrawApply.setMemberId(user.getId());
withdrawApply.setTotalAmount(amount);
withdrawApply.setAddress(address);
withdrawApply.setRemark(remark);
withdrawApply.setCanAutoWithdraw(coin.getCanAutoWithdraw());
// 提币数量低于或等于阈值并且该币种支持自动提币
if (amount.compareTo(coin.getWithdrawThreshold()) <= 0 && coin.getCanAutoWithdraw().equals(BooleanEnum.IS_TRUE)) {
withdrawApply.setStatus(WithdrawStatus.WAITING);
withdrawApply.setIsAuto(BooleanEnum.IS_TRUE);
withdrawApply.setDealTime(withdrawApply.getCreateTime());
WithdrawRecord withdrawRecord = withdrawApplyService.save(withdrawApply);
JSONObject json = new JSONObject();
json.put("uid", user.getId());
// 提币总数量
json.put("totalAmount", amount);
// 手续费
json.put("fee", fee);
// 预计到账数量
json.put("arriveAmount", sub(amount, fee));
// 币种
json.put("coin", coin);
// 提币地址
json.put("address", address);
// 提币记录id
json.put("withdrawId", withdrawRecord.getId());
// 如果是USDT提现,并且地址符合ERC20地址格式,则走ERC20通道提现
if (coin.getUnit().equals("USDT") && address.substring(0, 2).equals("0x")) {
kafkaTemplate.send("withdraw", "EUSDT", json.toJSONString());
} else {
kafkaTemplate.send("withdraw", coin.getUnit(), json.toJSONString());
}
return MessageResult.success(sourceService.getMessage("APPLY_SUCCESS"));
} else {
withdrawApply.setStatus(WithdrawStatus.PROCESSING);
withdrawApply.setIsAuto(BooleanEnum.IS_FALSE);
if (withdrawApplyService.save(withdrawApply) != null) {
return MessageResult.success(sourceService.getMessage("APPLY_AUDIT"));
} else {
throw new InformationExpiredException("Information Expired");
}
}
}
/**
* 提币记录
* @param user
* @param page
* @param pageSize
* @return
*/
@GetMapping("record")
public MessageResult pageWithdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, int page, int pageSize) {
MessageResult mr = new MessageResult(0, "success");
Page<WithdrawRecord> records = withdrawApplyService.findAllByMemberId(user.getId(), page, pageSize);
records.map(x -> ScanWithdrawRecord.toScanWithdrawRecord(x));
mr.setData(records);
return mr;
}
}
19
View Source File : WithdrawCodeController.java
License : Apache License 2.0
Project Creator : xunibidev
License : Apache License 2.0
Project Creator : xunibidev
/**
* @author Hevin QQ:390330302 E-mail:[email protected]
* @date 2020年01月26日
*/
@RestController
@Slf4j
@RequestMapping(value = "/withdrawcode", method = RequestMethod.POST)
public clreplaced WithdrawCodeController {
@Autowired
private MemberAddressService memberAddressService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private MemberService memberService;
@Autowired
private CoinService coinService;
@Autowired
private MemberWalletService memberWalletService;
@Autowired
private WithdrawCodeRecordService withdrawApplyService;
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private LocaleMessageSourceService sourceService;
@Autowired
private MemberTransactionService memberTransactionService;
/**
* 支持提现的地址
* @return
*/
@RequestMapping("support/coin")
public MessageResult queryWithdraw() {
List<Coin> list = coinService.findAllCanWithDraw();
List<String> list1 = new ArrayList<>();
list.stream().forEach(x -> list1.add(x.getUnit()));
MessageResult result = MessageResult.success();
result.setData(list1);
return result;
}
/**
* 提现币种详细信息
* @param user
* @return
*/
@RequestMapping("support/coin/info")
public MessageResult queryWithdrawCoin(@SessionAttribute(SESSION_MEMBER) AuthMember user) {
List<Coin> list = coinService.findAllCanWithDraw();
List<MemberWallet> list1 = memberWalletService.findAllByMemberId(user.getId());
long id = user.getId();
List<WithdrawWalletInfo> list2 = list1.stream().filter(x -> list.contains(x.getCoin())).map(x -> WithdrawWalletInfo.builder().balance(x.getBalance()).withdrawScale(x.getCoin().getWithdrawScale()).maxTxFee(x.getCoin().getMaxTxFee()).minTxFee(x.getCoin().getMinTxFee()).minAmount(x.getCoin().getMinWithdrawAmount()).maxAmount(x.getCoin().getMaxWithdrawAmount()).name(x.getCoin().getName()).nameCn(x.getCoin().getNameCn()).threshold(x.getCoin().getWithdrawThreshold()).unit(x.getCoin().getUnit()).accountType(x.getCoin().getAccountType()).canAutoWithdraw(x.getCoin().getCanAutoWithdraw()).addresses(memberAddressService.queryAddress(id, x.getCoin().getName())).build()).collect(Collectors.toList());
MessageResult result = MessageResult.success();
result.setData(list2);
return result;
}
/**
* 申请提币(添加验证码校验)
* @param user
* @param unit 币种单位
* @param amount 提币数量
* @param jyPreplacedword 交易密码
* @return
* @throws Exception
*/
@RequestMapping("apply/code")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult withdrawCode(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, BigDecimal amount, String jyPreplacedword) throws Exception {
hasText(jyPreplacedword, sourceService.getMessage("MISSING_JYPreplacedWORD"));
hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
Coin coin = coinService.findByUnit(unit);
amount.setScale(coin.getWithdrawScale(), BigDecimal.ROUND_DOWN);
notNull(coin, sourceService.getMessage("COIN_ILLEGAL"));
isTrue(coin.getStatus().equals(CommonStatus.NORMAL) && coin.getCanWithdraw().equals(BooleanEnum.IS_TRUE), sourceService.getMessage("COIN_NOT_SUPPORT"));
isTrue(compare(coin.getMaxWithdrawAmount(), amount), sourceService.getMessage("WITHDRAW_MAX") + coin.getMaxWithdrawAmount());
isTrue(compare(amount, coin.getMinWithdrawAmount()), sourceService.getMessage("WITHDRAW_MIN") + coin.getMinWithdrawAmount());
MemberWallet memberWallet = memberWalletService.findByCoinAndMemberId(coin, user.getId());
isTrue(compare(memberWallet.getBalance(), amount), sourceService.getMessage("INSUFFICIENT_BALANCE"));
// isTrue(memberAddressService.findByMemberIdAndAddress(user.getId(), address).size() > 0, sourceService.getMessage("WRONG_ADDRESS"));
isTrue(memberWallet.getIsLock() == BooleanEnum.IS_FALSE, "钱包已锁定");
Member member = memberService.findOne(user.getId());
String mbPreplacedword = member.getJyPreplacedword();
replacedert.hasText(mbPreplacedword, sourceService.getMessage("NO_SET_JYPreplacedWORD"));
replacedert.isTrue(Md5.md5Digest(jyPreplacedword + member.getSalt()).toLowerCase().equals(mbPreplacedword), sourceService.getMessage("ERROR_JYPreplacedWORD"));
// 冻结用户资产
MessageResult result = memberWalletService.freezeBalance(memberWallet, amount);
if (result.getCode() != 0) {
throw new InformationExpiredException("Information Expired");
}
// 生成提现码记录
WithdrawCodeRecord withdrawApply = new WithdrawCodeRecord();
withdrawApply.setCoin(coin);
withdrawApply.setMemberId(user.getId());
withdrawApply.setWithdrawAmount(amount);
withdrawApply.setStatus(WithdrawStatus.PROCESSING);
// 生成提现码(MD5)
String withdrawCode = Md5.md5Digest(System.currentTimeMillis() + Math.random() + "");
withdrawApply.setWithdrawCode(withdrawCode);
if (withdrawApplyService.save(withdrawApply) != null) {
MessageResult mr = new MessageResult(0, "success");
mr.setData(withdrawApply);
return mr;
} else {
throw new InformationExpiredException("Information Expired");
}
}
/**
* 提币码充值
* @param user
* @param withdrawCode 提币码
* @param withdrawCode
* @return
* @throws Exception
*/
@RequestMapping("apply/recharge")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult withdrawCodeRecharge(@SessionAttribute(SESSION_MEMBER) AuthMember user, String withdrawCode) throws Exception {
hasText(withdrawCode, sourceService.getMessage("MISSING_JYPreplacedWORD"));
Member member = memberService.findOne(user.getId());
WithdrawCodeRecord record = withdrawApplyService.findByWithdrawCode(withdrawCode);
if (record != null) {
if (record.getStatus() != WithdrawStatus.PROCESSING) {
return MessageResult.error("该充值码已被使用或删除!");
}
withdrawApplyService.withdrawSuccess(record.getId(), user.getId());
return MessageResult.success("充值码充值成功!");
} else {
return MessageResult.error("充值码不存在!");
}
}
/**
* 获取提币码信息
* @param user
* @param withdrawCode 提币码
* @param withdrawCode
* @return
* @throws Exception
*/
@RequestMapping("apply/info")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult getWithdrawCodeInfo(@SessionAttribute(SESSION_MEMBER) AuthMember user, String withdrawCode) throws Exception {
hasText(withdrawCode, sourceService.getMessage("MISSING_JYPreplacedWORD"));
Member member = memberService.findOne(user.getId());
WithdrawCodeRecord record = withdrawApplyService.findByWithdrawCode(withdrawCode);
if (record != null) {
MessageResult ret = new MessageResult(0, "获取成功!");
ret.setData(record);
return ret;
} else {
return MessageResult.error("充值码不存在!");
}
}
/**
* 提币码记录
* @param user
* @param page 页码
* @param pageSize 数量
* @return
*/
@GetMapping("record")
public MessageResult pageWithdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, int page, int pageSize) {
MessageResult mr = new MessageResult(0, "success");
Page<WithdrawCodeRecord> records = withdrawApplyService.findAllByMemberId(user.getId(), page, pageSize);
mr.setData(records);
return mr;
}
}
19
View Source File : OrderController.java
License : Apache License 2.0
Project Creator : xunibidev
License : Apache License 2.0
Project Creator : xunibidev
/**
* 委托订单处理类
*/
@Slf4j
@RestController
@RequestMapping("/order")
public clreplaced OrderController {
@Autowired
private ExchangeOrderService orderService;
@Autowired
private MemberWalletService walletService;
@Autowired
private ExchangeCoinService exchangeCoinService;
@Autowired
private CoinService coinService;
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private ExchangeOrderDetailService exchangeOrderDetailService;
@Value("${exchange.max-cancel-times:-1}")
private int maxCancelTimes;
@Autowired
private LocaleMessageSourceService msService;
@Autowired
private MemberService memberService;
@Autowired
private RestTemplate restTemplate;
@Autowired
private RedisTemplate redisTemplate;
private SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 添加委托订单
* @param authMember
* @param direction
* @param symbol
* @param price
* @param amount
* @param type
* usedisCount 暂时不用
* @return
*/
@RequestMapping("add")
public MessageResult addOrder(@SessionAttribute(SESSION_MEMBER) AuthMember authMember, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
// int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
// ValueOperations valueOperations = redisTemplate.opsForValue();
if (direction == null || type == null) {
return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
}
Member member = memberService.findOne(authMember.getId());
// if(member.getMemberLevel()== MemberLevelEnum.GENERAL){
// return MessageResult.error(500,msService.getMessage("REAL_NAME_AUTHENTICATION"));
// }
// 是否被禁止交易
if (member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)) {
return MessageResult.error(500, msService.getMessage("CANNOT_TRADE"));
}
ExchangeOrder order = new ExchangeOrder();
// 判断限价输入值是否小于零
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
// 判断数量小于零
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
// 根据交易对名称(symbol)获取交易对儿信息
ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
if (exchangeCoin == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
if (exchangeCoin.getEnable() != 1 || exchangeCoin.getExchangeable() != 1) {
return MessageResult.error(500, msService.getMessage("COIN_FORBIDDEN"));
}
// 不允许卖
if (exchangeCoin.getEnableSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, msService.getMessage("STOP_SELLING"));
}
// 不允许买
if (exchangeCoin.getEnableBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, msService.getMessage("STOP_BUYING"));
}
// 获取基准币
String baseCoin = exchangeCoin.getBaseSymbol();
// 获取交易币
String exCoin = exchangeCoin.getCoinSymbol();
Coin coin;
// 根据交易方向查询币种信息
if (direction == ExchangeOrderDirection.SELL) {
coin = coinService.findByUnit(exCoin);
} else {
coin = coinService.findByUnit(baseCoin);
}
if (coin == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
// 设置价格精度
price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 委托数量和精度控制
if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 最小成交额控制
if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
return MessageResult.error(500, msService.getMessage("LOWEST_TURNOVER") + exchangeCoin.getMinTurnover());
}
} else {
amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
// 成交量范围控制
if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
}
if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
}
}
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
if (baseCoinWallet == null || exCoinWallet == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
}
// 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
return MessageResult.error(500, msService.getMessage("FLOOR_PRICE") + exchangeCoin.getMinSellPrice());
}
// 如果有最高买价限制,出价不能高于此价,且禁止市场价格买
if (direction == ExchangeOrderDirection.BUY && exchangeCoin.getMaxBuyPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMaxBuyPrice()) > 0) || type == ExchangeOrderType.MARKET_PRICE)) {
return MessageResult.error(500, msService.getMessage("PRICE_CEILING") + exchangeCoin.getMaxBuyPrice());
}
// 查看是否启用市价买卖
if (type == ExchangeOrderType.MARKET_PRICE) {
if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, msService.getMessage("NO_MARKET_PRICE_BUY"));
} else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, msService.getMessage("NO_MARKET_PRICE_SELL"));
}
}
// 限制委托数量
if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(member.getId(), symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
return MessageResult.error(500, msService.getMessage("MAXIMUM_QUANreplacedY") + exchangeCoin.getMaxTradingOrder());
}
// 抢购模式活动订单限制(用户无法在活动前下买单)
// 当前时间戳
long currentTime = Calendar.getInstance().getTimeInMillis();
// 抢购模式下,无法在活动开始前下买单,仅限于管理员下卖单
if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.QIANGGOU) {
// 抢购模式订单
try {
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
if (direction == ExchangeOrderDirection.BUY) {
// 抢购未开始
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
return MessageResult.error(500, msService.getMessage("ACTIVITY_NOT_STARTED"));
}
} else {
// 此处2是管理员用户的ID
if (member.getId() != 2) {
return MessageResult.error(500, msService.getMessage("UNABLE_TO_PLACE_BUY_ORDER"));
}
}
} else {
// 活动进行期间,无法下卖单 + 无法下市价单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
if (direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, msService.getMessage("UNABLE_TO_PLACE_SELL_ORDER"));
}
if (type == ExchangeOrderType.MARKET_PRICE) {
return MessageResult.error(500, msService.getMessage("ITS_NOT_MARKETABLE"));
}
} else {
// 清盘期间,无法下单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
return MessageResult.error(500, msService.getMessage("WINDING_UP"));
}
}
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR0"));
}
}
// 分摊模式活动订单限制(开始前任何人无法下单)
if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.FENTAN) {
try {
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
// UNABLE_TO_PLACE_BUY_ORDER
return MessageResult.error(500, msService.getMessage("ACTIVITY_NOT_STARTED"));
} else {
// 活动开始后且在结束前,无法下卖单 + 下单金额必须符合规定
if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
if (direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, msService.getMessage("ACTIVITY_STARTED_CANT_SELL"));
} else {
if (type == ExchangeOrderType.MARKET_PRICE) {
return MessageResult.error(500, msService.getMessage("ITS_NOT_MARKETABLE"));
} else {
if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
return MessageResult.error(500, msService.getMessage("ORDER_PRICE") + exchangeCoin.getPublishPrice());
}
}
}
} else {
// 清盘期间,普通用户无法下单,仅有管理员用户ID可下单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
// 此处2和10001是管理员用户的ID
if (member.getId() != 2 && member.getId() != 10001) {
return MessageResult.error(500, msService.getMessage("WINDING_UP"));
} else {
if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
return MessageResult.error(500, msService.getMessage("ORDER_PRICE") + exchangeCoin.getPublishPrice());
}
if (direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, msService.getMessage("PERIOD_LIQUIDATION"));
}
}
}
}
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR1"));
}
}
order.setMemberId(member.getId());
order.setSymbol(symbol);
order.setBaseSymbol(baseCoin);
order.setCoinSymbol(exCoin);
order.setType(type);
order.setDirection(direction);
if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
order.setPrice(BigDecimal.ZERO);
} else {
order.setPrice(price);
}
order.setUseDiscount("0");
// 限价买入单时amount为用户设置的总成交额
order.setAmount(amount);
MessageResult mr = orderService.addOrder(member.getId(), order);
if (mr.getCode() != 0) {
return MessageResult.error(500, msService.getMessage("ORDER_FAILED") + mr.getMessage());
}
log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
MessageResult result = MessageResult.success(msService.getMessage("EXAPI_SUCCESS"));
result.setData(order.getOrderId());
return result;
}
/**
* 行情机器人专用:添加委托订单
* @param uid
* @param direction
* @param symbol
* @param price
* @param amount
* @param type
* usedisCount 暂时不用
* @return
*/
@RequestMapping("mockaddydhdnskd")
public MessageResult addOrderMock(Long uid, String sign, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
// int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
// ValueOperations valueOperations = redisTemplate.opsForValue();
if (direction == null || type == null) {
return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
}
// Member member=memberService.findOne(uid);
// if(member.getMemberLevel()== MemberLevelEnum.GENERAL){
// return MessageResult.error(500,msService.getMessage("REAL_NAME_AUTHENTICATION"));
// }
if (uid != 1 && uid != 10001) {
return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
}
if (!sign.equals("77585211314qazwsx")) {
return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
}
// //是否被禁止交易
// if(member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)){
// return MessageResult.error(500,msService.getMessage("CANNOT_TRADE"));
// }
ExchangeOrder order = new ExchangeOrder();
// 判断限价输入值是否小于零
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
// 判断数量小于零
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
// 根据交易对名称(symbol)获取交易对儿信息
ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
if (exchangeCoin == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
if (exchangeCoin.getEnable() != 1 || exchangeCoin.getExchangeable() != 1) {
return MessageResult.error(500, msService.getMessage("COIN_FORBIDDEN"));
}
// 获取基准币
String baseCoin = exchangeCoin.getBaseSymbol();
// 获取交易币
String exCoin = exchangeCoin.getCoinSymbol();
Coin coin;
// 根据交易方向查询币种信息
if (direction == ExchangeOrderDirection.SELL) {
coin = coinService.findByUnit(exCoin);
} else {
coin = coinService.findByUnit(baseCoin);
}
if (coin == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
// 设置价格精度
price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 委托数量和精度控制
if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 最小成交额控制
if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
return MessageResult.error(500, msService.getMessage("MINIMUM_TURNOVER") + exchangeCoin.getMinTurnover());
}
} else {
amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
// 成交量范围控制
if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
}
if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
}
}
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
// MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
// MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
// if (baseCoinWallet == null || exCoinWallet == null) {
// return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
// }
// if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
// return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
// }
// 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
// 如果有最高买价限制,出价不能高于此价,且禁止市场价格买
if (direction == ExchangeOrderDirection.BUY && exchangeCoin.getMaxBuyPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMaxBuyPrice()) > 0) || type == ExchangeOrderType.MARKET_PRICE)) {
return MessageResult.error(500, msService.getMessage("NO_PRICE_CEILING"));
}
// 查看是否启用市价买卖
if (type == ExchangeOrderType.MARKET_PRICE) {
if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, msService.getMessage("NO_MARKET_PRICE_BUY"));
} else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, msService.getMessage("NO_MARKET_PRICE_SELL"));
}
}
// //限制委托数量
// if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(uid, symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
// return MessageResult.error(500, msService.getMessage("MAXIMUM_QUANreplacedY") + exchangeCoin.getMaxTradingOrder());
// }
// 抢购模式活动订单限制(用户无法在活动前下买单)
// 当前时间戳
long currentTime = Calendar.getInstance().getTimeInMillis();
// 抢购模式下,无法在活动开始前下买单,仅限于管理员下卖单
if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.QIANGGOU) {
// 抢购模式订单
try {
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
if (direction == ExchangeOrderDirection.BUY) {
// 抢购未开始
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
return MessageResult.error(500, msService.getMessage("ACTIVITY_NOT_STARTED"));
}
} else {
// 此处2是管理员用户的ID
if (uid != 2 && uid != 1 && uid != 10001) {
return MessageResult.error(500, msService.getMessage("UNABLE_TO_PLACE_BUY_ORDER"));
}
}
} else {
// 活动进行期间,无法下卖单 + 无法下市价单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
if (direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, msService.getMessage("UNABLE_TO_PLACE_SELL_ORDER"));
}
if (type == ExchangeOrderType.MARKET_PRICE) {
return MessageResult.error(500, msService.getMessage("ITS_NOT_MARKETABLE"));
}
} else {
// 清盘期间,无法下单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
return MessageResult.error(500, msService.getMessage("WINDING_UP"));
}
}
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR0"));
}
}
// 分摊模式活动订单限制(开始前任何人无法下单)
if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.FENTAN) {
try {
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
// UNABLE_TO_PLACE_BUY_ORDER
return MessageResult.error(500, msService.getMessage("ACTIVITY_NOT_STARTED"));
} else {
// 活动开始后且在结束前,无法下卖单 + 下单金额必须符合规定
if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
if (direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, msService.getMessage("ACTIVITY_STARTED_CANT_SELL"));
} else {
if (type == ExchangeOrderType.MARKET_PRICE) {
return MessageResult.error(500, msService.getMessage("ITS_NOT_MARKETABLE"));
} else {
if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
return MessageResult.error(500, msService.getMessage("ORDER_PRICE") + exchangeCoin.getPublishPrice());
}
}
}
} else {
// 清盘期间,普通用户无法下单,仅有管理员用户ID可下单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
// 此处2是超级管理员用户的ID
if (uid != 2 && uid != 1 && uid != 10001) {
return MessageResult.error(500, msService.getMessage("WINDING_UP"));
} else {
if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
return MessageResult.error(500, msService.getMessage("ORDER_PRICE") + exchangeCoin.getPublishPrice());
}
if (direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, msService.getMessage("PERIOD_LIQUIDATION"));
}
}
}
}
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR1"));
}
}
order.setMemberId(uid);
order.setSymbol(symbol);
order.setBaseSymbol(baseCoin);
order.setCoinSymbol(exCoin);
order.setType(type);
order.setDirection(direction);
if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
order.setPrice(BigDecimal.ZERO);
} else {
order.setPrice(price);
}
order.setUseDiscount("0");
// 限价买入单时amount为用户设置的总成交额
order.setAmount(amount);
MessageResult mr = orderService.addOrder(uid, order);
if (mr.getCode() != 0) {
return MessageResult.error(500, msService.getMessage("ORDER_FAILED") + mr.getMessage());
}
log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
MessageResult result = MessageResult.success(msService.getMessage("EXAPI_SUCCESS"));
result.setData(order.getOrderId());
return result;
}
/**
* 历史委托
*/
@RequestMapping("history")
public Page<ExchangeOrder> historyOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
Page<ExchangeOrder> page = orderService.findHistory(member.getId(), symbol, pageNo, pageSize);
/*
page.getContent().forEach(exchangeOrder -> {
//获取交易成交详情
exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
});
*/
return page;
}
/**
* 个人中心历史委托
*/
@RequestMapping("personal/history")
public Page<ExchangeOrder> personalHistoryOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "status", required = false) ExchangeOrderStatus status, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
Page<ExchangeOrder> page = orderService.findPersonalHistory(member.getId(), symbol, type, status, startTime, endTime, direction, pageNo, pageSize);
/*
page.getContent().forEach(exchangeOrder -> {
//获取交易成交详情
exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
});
*/
return page;
}
/**
* 个人中心当前委托
* @param member
* @param symbol
* @param type
* @param startTime
* @param endTime
* @param pageNo
* @param pageSize
* @return
*/
@RequestMapping("personal/current")
public Page<ExchangeOrder> personalCurrentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
Page<ExchangeOrder> page = orderService.findPersonalCurrent(member.getId(), symbol, type, startTime, endTime, direction, pageNo, pageSize);
page.getContent().forEach(exchangeOrder -> {
// 获取交易成交详情
BigDecimal tradedAmount = BigDecimal.ZERO;
BigDecimal turnover = BigDecimal.ZERO;
List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
exchangeOrder.setDetail(details);
for (ExchangeOrderDetail trade : details) {
tradedAmount = tradedAmount.add(trade.getAmount());
turnover = turnover.add(trade.getTurnover());
}
exchangeOrder.setTradedAmount(tradedAmount);
exchangeOrder.setTurnover(turnover);
});
return page;
}
/**
* 当前委托
*
* @param member
* @param pageNo
* @param pageSize
* @return
*/
@RequestMapping("current")
public Page<ExchangeOrder> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
Page<ExchangeOrder> page = orderService.findCurrent(member.getId(), symbol, pageNo, pageSize);
page.getContent().forEach(exchangeOrder -> {
// 获取交易成交详情
BigDecimal tradedAmount = BigDecimal.ZERO;
BigDecimal turnover = BigDecimal.ZERO;
List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
exchangeOrder.setDetail(details);
for (ExchangeOrderDetail trade : details) {
tradedAmount = tradedAmount.add(trade.getAmount());
turnover = turnover.add(trade.getTurnover());
}
exchangeOrder.setTradedAmount(tradedAmount);
exchangeOrder.setTurnover(turnover);
});
return page;
}
/**
* 行情机器人专用:当前委托
* @param uid
* @param sign
* @return
*/
@RequestMapping("mockcurrentydhdnskd")
public Page<ExchangeOrder> currentOrderMock(Long uid, String sign, String symbol, int pageNo, int pageSize) {
if (uid != 1 && uid != 10001) {
return null;
}
if (!sign.equals("77585211314qazwsx")) {
return null;
}
Page<ExchangeOrder> page = orderService.findCurrent(uid, symbol, pageNo, pageSize);
// page.getContent().forEach(exchangeOrder -> {
// //获取交易成交详情(机器人无需获取详情)
//
// BigDecimal tradedAmount = BigDecimal.ZERO;
// List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
// exchangeOrder.setDetail(details);
// for (ExchangeOrderDetail trade : details) {
// tradedAmount = tradedAmount.add(trade.getAmount());
// }
// exchangeOrder.setTradedAmount(tradedAmount);
//
// });
return page;
}
/**
* 行情机器人专用:交易取消委托
* @param uid
* @param orderId
* @return
*/
@RequestMapping("mockcancelydhdnskd")
public MessageResult cancelOrdermock(Long uid, String sign, String orderId) {
ExchangeOrder order = orderService.findOne(orderId);
if (uid != 1 && uid != 10001) {
return MessageResult.error(500, msService.getMessage("OPERATION_FORBIDDEN"));
}
if (!sign.equals("77585211314qazwsx")) {
return MessageResult.error(500, msService.getMessage("OPERATION_FORBIDDEN"));
}
if (order.getStatus() != ExchangeOrderStatus.TRADING) {
return MessageResult.error(500, msService.getMessage("ORDER_STATUS_ERROR"));
}
// 活动清盘期间,无法撤销订单
ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(order.getSymbol());
if (exchangeCoin.getPublishType() != ExchangeCoinPublishType.NONE) {
// 当前时间戳
long currentTime = Calendar.getInstance().getTimeInMillis();
try {
// 处在活动结束时间与清盘结束时间之间
if (currentTime > dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime() && currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
return MessageResult.error(500, msService.getMessage("CANNOT_CANCEL_ORDER"));
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR3"));
}
}
if (isExchangeOrderExist(order)) {
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
} else {
// 强制取消
orderService.forceCancelOrder(order);
}
return MessageResult.success(msService.getMessage("EXAPI_SUCCESS"));
}
/**
* 查询委托成交明细
*
* @param member
* @param orderId
* @return
*/
@RequestMapping("detail/{orderId}")
public List<ExchangeOrderDetail> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
return exchangeOrderDetailService.findAllByOrderId(orderId);
}
/**
* 取消委托
* @param member
* @param orderId
* @return
*/
@RequestMapping("cancel/{orderId}")
public MessageResult cancelOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
ExchangeOrder order = orderService.findOne(orderId);
if (order.getMemberId() != member.getId()) {
return MessageResult.error(500, msService.getMessage("OPERATION_FORBIDDEN"));
}
if (order.getStatus() != ExchangeOrderStatus.TRADING) {
return MessageResult.error(500, msService.getMessage("ORDER_STATUS_ERROR"));
}
// 活动清盘期间,无法撤销订单
ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(order.getSymbol());
if (exchangeCoin.getPublishType() != ExchangeCoinPublishType.NONE) {
// 当前时间戳
long currentTime = Calendar.getInstance().getTimeInMillis();
try {
// 处在活动结束时间与清盘结束时间之间
if (currentTime > dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime() && currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
return MessageResult.error(500, msService.getMessage("CANNOT_CANCEL_ORDER"));
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR3"));
}
}
if (isExchangeOrderExist(order)) {
if (maxCancelTimes > 0 && orderService.findTodayOrderCancelTimes(member.getId(), order.getSymbol()) >= maxCancelTimes) {
return MessageResult.error(500, msService.getMessage("CANCELLED") + maxCancelTimes + msService.getMessage("SECOND"));
}
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
} else {
// 强制取消
orderService.forceCancelOrder(order);
}
return MessageResult.success(msService.getMessage("EXAPI_SUCCESS"));
}
/**
* 查找撮合交易器中订单是否存在
* @param order
* @return
*/
public boolean isExchangeOrderExist(ExchangeOrder order) {
try {
String serviceName = "SERVICE-EXCHANGE-TRADE";
String url = "http://" + serviceName + "/monitor/order?symbol=" + order.getSymbol() + "&orderId=" + order.getOrderId() + "&direction=" + order.getDirection() + "&type=" + order.getType();
ResponseEnreplacedy<ExchangeOrder> result = restTemplate.getForEnreplacedy(url, ExchangeOrder.clreplaced);
return result != null;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 获取下单时间限制
* @return
*/
@GetMapping("/time_limit")
public MessageResult userAddExchangeTimeLimit() {
MessageResult mr = new MessageResult();
mr.setCode(0);
mr.setMessage("EXAPI_SUCCESS");
mr.setData(SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME);
return mr;
}
}
19
View Source File : ExchangeOrderController.java
License : Apache License 2.0
Project Creator : xunibidev
License : Apache License 2.0
Project Creator : xunibidev
/**
* @author Hevin QQ:390330302 E-mail:[email protected]
* @description
* @date 2019/1/31 10:52
*/
@RestController
@RequestMapping("exchange/exchange-order")
public clreplaced ExchangeOrderController extends BaseAdminController {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private ExchangeOrderService exchangeOrderService;
@Autowired
private LocaleMessageSourceService messageSource;
@RequiresPermissions("exchange:exchange-order:all")
@PostMapping("all")
@AccessLog(module = AdminModule.EXCHANGE, operation = "查找所有exchangeOrder")
public MessageResult all() {
List<ExchangeOrder> exchangeOrderList = exchangeOrderService.findAll();
if (exchangeOrderList != null && exchangeOrderList.size() > 0) {
return success(exchangeOrderList);
}
return error(messageSource.getMessage("NO_DATA"));
}
@RequiresPermissions("exchange:exchange-order:detail")
@PostMapping("detail")
@AccessLog(module = AdminModule.EXCHANGE, operation = "exchangeOrder详情")
public MessageResult detail(String id) {
List<ExchangeOrderDetail> one = exchangeOrderService.getAggregation(id);
if (one == null) {
return error(messageSource.getMessage("NO_DATA"));
}
return success(one);
}
@RequiresPermissions("exchange:exchange-order:page-query")
@PostMapping("page-query")
@AccessLog(module = AdminModule.EXCHANGE, operation = "分页查找exchangeOrder")
public MessageResult page(PageModel pageModel, ExchangeOrderScreen screen) {
if (pageModel.getDirection() == null && pageModel.getProperty() == null) {
ArrayList<Sort.Direction> directions = new ArrayList<>();
directions.add(Sort.Direction.DESC);
pageModel.setDirection(directions);
List<String> property = new ArrayList<>();
property.add("time");
pageModel.setProperty(property);
}
// 获取查询条件
Predicate predicate = getPredicate(screen);
Page<ExchangeOrder> all = exchangeOrderService.findAll(predicate, pageModel.getPageable());
return success(all);
}
private Predicate getPredicate(ExchangeOrderScreen screen) {
ArrayList<BooleanExpression> booleanExpressions = new ArrayList<>();
QExchangeOrder qExchangeOrder = QExchangeOrder.exchangeOrder;
if (screen.getOrderDirection() != null) {
booleanExpressions.add(qExchangeOrder.direction.eq(screen.getOrderDirection()));
}
if (StringUtils.isNotEmpty(screen.getOrderId())) {
booleanExpressions.add(qExchangeOrder.orderId.eq(screen.getOrderId()));
}
if (screen.getMemberId() != null) {
booleanExpressions.add(qExchangeOrder.memberId.eq(screen.getMemberId()));
}
if (screen.getType() != null) {
booleanExpressions.add(qExchangeOrder.type.eq(screen.getType()));
}
if (StringUtils.isNotBlank(screen.getCoinSymbol())) {
booleanExpressions.add(qExchangeOrder.coinSymbol.equalsIgnoreCase(screen.getCoinSymbol()));
}
if (StringUtils.isNotBlank(screen.getBaseSymbol())) {
booleanExpressions.add(qExchangeOrder.baseSymbol.equalsIgnoreCase(screen.getBaseSymbol()));
}
if (screen.getStatus() != null) {
booleanExpressions.add(qExchangeOrder.status.eq(screen.getStatus()));
}
if (screen.getMinPrice() != null) {
booleanExpressions.add(qExchangeOrder.price.goe(screen.getMinPrice()));
}
if (screen.getMaxPrice() != null) {
booleanExpressions.add(qExchangeOrder.price.loe(screen.getMaxPrice()));
}
if (screen.getMinTradeAmount() != null) {
booleanExpressions.add(qExchangeOrder.tradedAmount.goe(screen.getMinTradeAmount()));
}
if (screen.getMaxTradeAmount() != null) {
booleanExpressions.add(qExchangeOrder.tradedAmount.loe(screen.getMaxTradeAmount()));
}
if (screen.getMinTurnOver() != null) {
booleanExpressions.add(qExchangeOrder.turnover.goe(screen.getMinTurnOver()));
}
if (screen.getMaxTurnOver() != null) {
booleanExpressions.add(qExchangeOrder.turnover.loe(screen.getMaxTurnOver()));
}
if (screen.getRobotOrder() != null && screen.getRobotOrder() == 1) {
// 不看机器人(不包含机器人)
booleanExpressions.add(qExchangeOrder.memberId.notIn(1, 2, 10001));
// booleanExpressions.add(qExchangeOrder.memberId.notIn(69296 , 52350));
}
if (screen.getRobotOrder() != null && screen.getRobotOrder() == 0) {
// 查看机器人
booleanExpressions.add(qExchangeOrder.memberId.in(1, 2, 10001));
// booleanExpressions.add(qExchangeOrder.memberId.in(69296 , 52350));
}
if (screen.getCompleted() != null) /**
* 委托订单
*/
{
if (screen.getCompleted() == BooleanEnum.IS_FALSE) {
booleanExpressions.add(qExchangeOrder.completedTime.isNull().and(qExchangeOrder.canceledTime.isNull()).and(qExchangeOrder.status.eq(ExchangeOrderStatus.TRADING)));
} else {
/**
* 历史订单
*/
booleanExpressions.add(qExchangeOrder.completedTime.isNotNull().or(qExchangeOrder.canceledTime.isNotNull()).or(qExchangeOrder.status.ne(ExchangeOrderStatus.TRADING)));
}
}
return PredicateUtils.getPredicate(booleanExpressions);
}
@RequiresPermissions("exchange:exchange-order:entrust-details")
@PostMapping("entrust-details")
public MessageResult entrustDetails(ExchangeTradeScreen screen, PageModel pageModel) {
/* ExchangeOrder
StringBuilder headSql = new StringBuilder("select orderId as IF(a.direction=0,buyOrderId,sellOrderId)");
StringBuilder headCount = new StringBuilder("select count(*) ");*/
return null;
}
@RequiresPermissions("exchange:exchange-order:out-excel")
@GetMapping("out-excel")
@AccessLog(module = AdminModule.EXCHANGE, operation = "导出 exchangeOrder Excel")
public MessageResult outExcel(@RequestParam(value = "memberId") Long memberId, @RequestParam(value = "type") ExchangeOrderType type, @RequestParam(value = "symbol") String symbol, @RequestParam(value = "status") ExchangeOrderStatus status, @RequestParam(value = "direction") ExchangeOrderDirection direction, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 获取查询条件
List<Predicate> predicates = getPredicates(memberId, type, symbol, status, direction);
List list = exchangeOrderService.queryWhereOrPage(predicates, null, null).getContent();
return new FileUtil().exportExcel(request, response, list, "order");
}
// 查询条件的获取
public List<Predicate> getPredicates(Long memberId, ExchangeOrderType type, String symbol, ExchangeOrderStatus status, ExchangeOrderDirection direction) {
ArrayList<Predicate> predicates = new ArrayList<>();
QExchangeOrder qExchangeOrder = QExchangeOrder.exchangeOrder;
// predicates.add(qExchangeOrder.symbol.eq(QExchangeCoin.exchangeCoin.symbol));
if (memberId != null) {
predicates.add(qExchangeOrder.memberId.eq(memberId));
}
if (type != null) {
predicates.add(qExchangeOrder.type.eq(type));
}
if (symbol != null) {
predicates.add(qExchangeOrder.symbol.eq(symbol));
}
if (status != null) {
predicates.add(qExchangeOrder.status.eq(status));
}
if (direction != null) {
predicates.add(qExchangeOrder.direction.eq(direction));
}
return predicates;
}
@RequiresPermissions("exchange:exchange-order:cancel")
@PostMapping("cancel")
@AccessLog(module = AdminModule.EXCHANGE, operation = "取消委托")
public MessageResult cancelOrder(String orderId) {
ExchangeOrder order = exchangeOrderService.findOne(orderId);
if (order.getStatus() != ExchangeOrderStatus.TRADING) {
return MessageResult.error(500, "order not in trading");
}
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
return MessageResult.success(messageSource.getMessage("SUCCESS"));
}
}
19
View Source File : ConsumerRecoveryCallback.java
License : Apache License 2.0
Project Creator : xm-online
License : Apache License 2.0
Project Creator : xm-online
@Slf4j
public clreplaced ConsumerRecoveryCallback implements RecoveryCallback<Object> {
private final String tenantKey;
private final TopicConfig topicConfig;
private final KafkaTemplate<String, String> kafkaTemplate;
public ConsumerRecoveryCallback(String tenantKey, TopicConfig topicConfig, KafkaTemplate<String, String> kafkaTemplate) {
this.tenantKey = tenantKey;
this.topicConfig = topicConfig;
this.kafkaTemplate = kafkaTemplate;
}
@Override
public Object recover(RetryContext context) {
ConsumerRecord<?, ?> record = (ConsumerRecord) context.getAttribute(CONTEXT_RECORD);
if (record == null) {
log.warn("Message skipped. Message record is null for context: {}", context);
return null;
}
String rawBody = String.valueOf(record.value());
String deadLetterQueue = topicConfig.getDeadLetterQueue();
try {
putRid(record);
if (StringUtils.isEmpty(deadLetterQueue)) {
log.info("Message skipped. Processing failed for tenant: [{}], body = {}", tenantKey, rawBody);
acknowledge(rawBody, context);
return null;
}
kafkaTemplate.send(deadLetterQueue, rawBody);
acknowledge(rawBody, context);
log.warn("send message to dead-letter [{}] due to retry count exceeded [{}], " + "total processing time = {} ms, body = [{}]", deadLetterQueue, getRetryCounter(record), getTotalProcessingTime(record), rawBody);
} finally {
MdcUtils.clear();
}
return null;
}
private void acknowledge(String rawBody, RetryContext context) {
Acknowledgment acknowledgment = (Acknowledgment) context.getAttribute(CONTEXT_ACKNOWLEDGMENT);
if (acknowledgment == null) {
log.warn("Acknowledge failed for message: [{}], tenant: [{}]", rawBody, tenantKey);
return;
}
acknowledgment.acknowledge();
}
private void putRid(ConsumerRecord<?, ?> record) {
MdcUtils.putRid(new StringJoiner(":").add(tenantKey).add(topicConfig.getTopicName()).add(getRid(record)).toString());
}
}
19
View Source File : KafkaTransactionsPusher.java
License : GNU General Public License v3.0
Project Creator : wlhbdp
License : GNU General Public License v3.0
Project Creator : wlhbdp
@Service
@Slf4j
public clreplaced KafkaTransactionsPusher implements Consumer<Transaction> {
private KafkaTemplate<String, Object> kafkaTemplate;
private Transaction lastTransaction;
@Value("${kafka.topic.transactions}")
private String topic;
@Autowired
public KafkaTransactionsPusher(KafkaTemplate<String, Object> kafkaTemplateForJson) {
this.kafkaTemplate = kafkaTemplateForJson;
}
@Override
public void accept(Transaction transaction) {
lastTransaction = transaction;
log.debug("{}", transaction);
kafkaTemplate.send(topic, transaction);
}
public Transaction getLastTransaction() {
return lastTransaction;
}
}
19
View Source File : FlinkRulesService.java
License : GNU General Public License v3.0
Project Creator : wlhbdp
License : GNU General Public License v3.0
Project Creator : wlhbdp
@Service
public clreplaced FlinkRulesService {
private KafkaTemplate<String, String> kafkaTemplate;
@Value("${kafka.topic.rules}")
private String topic;
private final ObjectMapper mapper = new ObjectMapper();
@Autowired
public FlinkRulesService(KafkaTemplate<String, String> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void addRule(Rule rule) {
String payload = rule.getRulePayload();
kafkaTemplate.send(topic, payload);
}
public void deleteRule(int ruleId) throws JsonProcessingException {
RulePayload payload = new RulePayload();
payload.setRuleId(ruleId);
payload.setRuleState(RuleState.DELETE);
String payloadJson = mapper.writeValuereplacedtring(payload);
kafkaTemplate.send(topic, payloadJson);
}
}
19
View Source File : KafkaPassengerPublisher.java
License : Apache License 2.0
Project Creator : ververica
License : Apache License 2.0
Project Creator : ververica
@Service
@Slf4j
public clreplaced KafkaPreplacedengerPublisher implements Consumer<InboundPreplacedengerMessage> {
private final String topic;
private final KafkaTemplate<Object, Object> kafkaTemplate;
@Autowired
public KafkaPreplacedengerPublisher(KafkaTemplate<Object, Object> kafkaTemplate, @Value("${kafka.topic.from-preplacedenger}") String topic) {
this.kafkaTemplate = Objects.requireNonNull(kafkaTemplate);
this.topic = Objects.requireNonNull(topic);
}
@Override
public void accept(InboundPreplacedengerMessage preplacedenger) {
byte[] bytes = preplacedenger.getPreplacedengerId().getBytes(StandardCharsets.UTF_8);
kafkaTemplate.send(topic, bytes, preplacedenger.toByteArray()).addCallback(new ListenableFutureCallback<SendResult<Object, Object>>() {
@Override
public void onFailure(@NonNull Throwable throwable) {
log.warn("couldn't send preplacedenger data.", throwable);
}
@Override
public void onSuccess(SendResult<Object, Object> objectObjectSendResult) {
log.info("Sent preplacedenger data");
}
});
}
}
19
View Source File : KafkaDriverPublisher.java
License : Apache License 2.0
Project Creator : ververica
License : Apache License 2.0
Project Creator : ververica
@Service
@Slf4j
public clreplaced KafkaDriverPublisher implements Consumer<InboundDriverMessage> {
private final String topic;
private KafkaTemplate<Object, Object> kafkaTemplate;
@Autowired
public KafkaDriverPublisher(KafkaTemplate<Object, Object> kafkaTemplateForJson, @Value("${kafka.topic.from-driver}") String topic) {
this.kafkaTemplate = kafkaTemplateForJson;
this.topic = topic;
}
@Override
public void accept(InboundDriverMessage driver) {
byte[] keyBytes = driver.getDriverId().getBytes(StandardCharsets.UTF_8);
ListenableFuture<SendResult<Object, Object>> future = kafkaTemplate.send(topic, keyBytes, driver.toByteArray());
future.addCallback(new ListenableFutureCallback<SendResult<Object, Object>>() {
@Override
public void onFailure(Throwable throwable) {
log.warn("Failed sending an event to kafka", throwable);
}
@Override
public void onSuccess(SendResult<Object, Object> objectObjectSendResult) {
}
});
}
}
19
View Source File : StatsCollectorTest.java
License : Apache License 2.0
Project Creator : telstra
License : Apache License 2.0
Project Creator : telstra
@RunWith(SpringRunner.clreplaced)
@SpringBootTest(clreplacedes = { StatsCollector.clreplaced })
@TestPropertySource("clreplacedpath:test.properties")
@MockBean(value = { KafkaTemplate.clreplaced })
public clreplaced StatsCollectorTest {
@MockBean
KafkaTemplate<String, Object> template;
@Autowired
StatsCollector statsCollector;
@Value("${openkilda.server42.stats.kafka.topic.flowrtt.to_storm}")
private String toStorm;
@Test
public void sendStatsTest() throws Exception {
Builder bucketBuilder = FlowLatencyPacketBucket.newBuilder();
FlowLatencyPacket packet1 = FlowLatencyPacket.newBuilder().setFlowId("some-flow-id-1").setDirection(false).setT0(100).setT1(150).setPacketId(1).build();
FlowLatencyPacket packet2 = FlowLatencyPacket.newBuilder().setDirection(true).setT0(200).setT1(250).setPacketId(2).build();
bucketBuilder.addPacket(packet1);
bucketBuilder.addPacket(packet2);
statsCollector.sendStats(bucketBuilder.build());
ArgumentCaptor<InfoMessage> argument = ArgumentCaptor.forClreplaced(InfoMessage.clreplaced);
verify(template).send(eq(toStorm), eq(packet1.getFlowId()), argument.capture());
InfoMessage packet1Message = argument.getValue();
FlowRttStatsData statsPacket1 = (FlowRttStatsData) packet1Message.getData();
replacedertThat(statsPacket1).extracting(FlowRttStatsData::getFlowId, FlowRttStatsData::getT0, FlowRttStatsData::getT1).contains(packet1.getFlowId(), packet1.getT0(), packet1.getT1());
replacedertThat(statsPacket1).extracting(FlowRttStatsData::getDirection).isEqualTo("forward");
verify(template).send(eq(toStorm), eq(packet2.getFlowId()), argument.capture());
InfoMessage packet2Message = argument.getValue();
FlowRttStatsData statsPacket2 = (FlowRttStatsData) packet2Message.getData();
replacedertThat(statsPacket2).extracting(FlowRttStatsData::getFlowId, FlowRttStatsData::getT0, FlowRttStatsData::getT1).contains(packet2.getFlowId(), packet2.getT0(), packet2.getT1());
replacedertThat(statsPacket2).extracting(FlowRttStatsData::getDirection).isEqualTo("reverse");
}
}
19
View Source File : StatsCollector.java
License : Apache License 2.0
Project Creator : telstra
License : Apache License 2.0
Project Creator : telstra
@Service
@Slf4j
public clreplaced StatsCollector extends Thread {
private final KafkaTemplate<String, Object> template;
@Value("${openkilda.server42.stats.zeromq.server.endpoint}")
private String connectEndpoint;
@Value("${openkilda.server42.stats.kafka.topic.flowrtt.to_storm}")
private String toStorm;
private String sessionId;
private ZContext context;
public StatsCollector(KafkaTemplate<String, Object> template) {
this.template = template;
}
@PostConstruct
private void init() {
context = new ZContext();
this.start();
}
@PreDestroy
private void clear() {
context.close();
}
/**
* Connect to server42 and get statistics.
*/
@Override
public void run() {
sessionId = RandomStringUtils.randomAlphanumeric(8);
log.info("started with session id {}", sessionId);
while (!isInterrupted()) {
Socket server = null;
try {
server = context.createSocket(ZMQ.PULL);
server.setReceiveTimeOut(1000);
server.connect(connectEndpoint);
log.info("connect to {}", connectEndpoint);
while (!isInterrupted()) {
byte[] recv = server.recv();
log.debug("recv {}", recv);
if (recv == null && server.errno() == ZError.EAGAIN) {
log.debug("EAGAIN received");
break;
} else if (recv != null && recv.length == 0) {
log.debug("ping received");
continue;
}
log.debug("stats received");
handleInput(recv);
}
} catch (org.zeromq.ZMQException ex) {
log.error(ex.toString());
} finally {
log.info("disconnected");
if (server != null) {
context.destroySocket(server);
}
}
}
}
private void handleInput(byte[] recv) {
try {
FlowLatencyPacketBucket flowLatencyPacketBucket = FlowLatencyPacketBucket.parseFrom(recv);
log.debug("getPacketList size {}", flowLatencyPacketBucket.getPacketList().size());
sendStats(flowLatencyPacketBucket);
} catch (InvalidProtocolBufferException e) {
log.error(e.toString());
}
}
void sendStats(FlowLatencyPacketBucket flowLatencyPacketBucket) throws InvalidProtocolBufferException {
long currentTimeMillis = System.currentTimeMillis();
for (FlowLatencyPacket packet : flowLatencyPacketBucket.getPacketList()) {
FlowRttStatsData data = new FlowRttStatsData(packet.getFlowId(), FlowDirection.fromBoolean(packet.getDirection()).name().toLowerCase(), packet.getT0(), packet.getT1());
InfoMessage message = new InfoMessage(data, currentTimeMillis, String.format("stats42-%s-%d", sessionId, packet.getPacketId()));
log.debug("InfoMessage {}", message);
template.send(toStorm, packet.getFlowId(), message);
}
}
}
19
View Source File : KafkaController.java
License : Apache License 2.0
Project Creator : telstra
License : Apache License 2.0
Project Creator : telstra
@RestController
@RequestMapping(value = "/kafka")
@Slf4j
public clreplaced KafkaController {
private final KafkaTemplate<String, Object> template;
private static ApiMapper mapper = Mappers.getMapper(ApiMapper.clreplaced);
@Value("${openkilda.server42.control.kafka.topic.to_storm}")
private String toStorm;
@Value("${openkilda.server42.control.kafka.topic.from_storm}")
private String fromStorm;
private ConcurrentHashMap<String, DeferredResult<ResponseEnreplacedy<?>>> deferredResultConcurrentHashMap = new ConcurrentHashMap<String, DeferredResult<ResponseEnreplacedy<?>>>();
public KafkaController(KafkaTemplate<String, Object> template) {
this.template = template;
}
@PostMapping(value = "/flow")
private void createFlow(@RequestParam String switchId, @RequestBody AddFlowPayload flow) throws InterruptedException, ExecutionException, TimeoutException {
send(switchId, mapper.map(flow));
}
@GetMapping(value = "/flow/")
@ResponseBody
private DeferredResult<ResponseEnreplacedy<?>> getFlowList(@RequestParam String switchId) throws InterruptedException, ExecutionException, TimeoutException {
Headers headers = buildHeader();
String correlationId = headers.getCorrelationId();
send(switchId, new ListFlowsRequest(headers));
DeferredResult<ResponseEnreplacedy<?>> deferredResult = new DeferredResult<>(500L);
deferredResult.onTimeout(() -> {
deferredResult.setErrorResult(ResponseEnreplacedy.status(HttpStatus.REQUEST_TIMEOUT).body("Request timeout occurred."));
deferredResultConcurrentHashMap.remove(correlationId);
});
deferredResult.onCompletion(() -> deferredResultConcurrentHashMap.remove(correlationId));
deferredResult.onError((Throwable throwable) -> {
deferredResult.setErrorResult(ResponseEnreplacedy.status(HttpStatus.INTERNAL_SERVER_ERROR).body(throwable));
deferredResultConcurrentHashMap.remove(correlationId);
});
deferredResultConcurrentHashMap.put(correlationId, deferredResult);
return deferredResult;
}
@DeleteMapping(value = "/flow/{id}")
private void deleteFlow(@RequestParam String switchId, @RequestParam(value = "id") String flowId, @RequestParam FlowDirection direction) throws InterruptedException, ExecutionException, TimeoutException {
send(switchId, RemoveFlow.builder().headers(buildHeader()).flowId(flowId).direction(direction).build());
}
@DeleteMapping(value = "/flow/")
private void clearFlows(@RequestParam String switchId) throws InterruptedException, ExecutionException, TimeoutException {
send(switchId, ClearFlows.builder().headers(buildHeader()).build());
}
@PostMapping(value = "/settings/")
private void pushSettings(@RequestParam String switchId, @RequestBody PushSettingsPayload settingsPayload) throws InterruptedException, ExecutionException, TimeoutException {
send(switchId, mapper.map(settingsPayload));
}
@KafkaListener(id = "server42-control-storm-stub", topics = "${openkilda.server42.control.kafka.topic.to_storm}")
private void listen(ListFlowsResponse listFlowsResponse) {
try {
DeferredResult<ResponseEnreplacedy<?>> responseEnreplacedyDeferredResult = deferredResultConcurrentHashMap.get(listFlowsResponse.getHeaders().getCorrelationId());
log.info(listFlowsResponse.getFlowIds().toString());
log.info(mapper.map(listFlowsResponse).toString());
responseEnreplacedyDeferredResult.setResult(ResponseEnreplacedy.ok(mapper.map(listFlowsResponse)));
} catch (NullPointerException ex) {
log.error("ListFlowsRequest dropped correlation_id {}", listFlowsResponse.getHeaders().getCorrelationId());
}
}
private void send(String switchId, Object payload) throws InterruptedException, ExecutionException, TimeoutException {
ListenableFuture<SendResult<String, Object>> future = template.send(fromStorm, switchId, payload);
future.get(30, TimeUnit.SECONDS);
}
private Headers buildHeader() {
String correlationId = UUID.randomUUID().toString();
return new Headers(correlationId);
}
}
19
View Source File : ProducerServiceImpl.java
License : Apache License 2.0
Project Creator : tedburner
License : Apache License 2.0
Project Creator : tedburner
/**
* @author: lingjun.jlj
* @date: 2018/11/13 09:55
* @description:
*/
@Slf4j
@Service
public clreplaced ProducerServiceImpl implements ProducerService {
@Resource
private KafkaTemplate<String, String> kafkaTemplate;
@Override
public void sendMessage(String topic, Object msgBody) {
log.info("kafka produce a message, topic = " + topic + " message = " + msgBody);
String jsonString = FormatUtils.obj2str(msgBody);
kafkaTemplate.send(topic, jsonString);
}
}
19
View Source File : KafkaController.java
License : Apache License 2.0
Project Creator : tedburner
License : Apache License 2.0
Project Creator : tedburner
/**
* @author: lingjun.jlj
* @date: 2019/7/22 16:17
* @version:1.0.0
* @description:
*/
@Slf4j
@RestController
@RequestMapping(value = "/kafka")
public clreplaced KafkaController {
// @Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@GetMapping(value = "/send")
public void send() {
log.info("向kafka发送消息===============");
Message message = Message.builder().id(System.currentTimeMillis()).msg("今天是" + new Date() + " 天气真不错!!!").build();
kafkaTemplate.send(MqConstants.KAFKA_TOPIC_TEST, FormatUtils.obj2str(message));
}
}
19
View Source File : KafkaSendServiceImpl.java
License : Apache License 2.0
Project Creator : sunshinelyz
License : Apache License 2.0
Project Creator : sunshinelyz
/**
* @author binghe
* @version 1.0.0
* @description KafkaSendServiceImpl
*/
public clreplaced KafkaSendServiceImpl implements MykitMqSendService {
private KafkaTemplate kafkaTemplate;
/**
* Sets kafka template.
*
* @param kafkaTemplate the kafka template
*/
public void setKafkaTemplate(final KafkaTemplate kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
@Override
@SuppressWarnings("unchecked")
public void sendMessage(final String destination, final Integer pattern, final byte[] message) {
kafkaTemplate.send(destination, message);
}
}
19
View Source File : KafkaSendServiceImpl.java
License : Apache License 2.0
Project Creator : sunshinelyz
License : Apache License 2.0
Project Creator : sunshinelyz
/**
* Sets kafka template.
*
* @param kafkaTemplate the kafka template
*/
public void setKafkaTemplate(final KafkaTemplate kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
19
View Source File : ShippingServiceImpl.java
License : MIT License
Project Creator : striderarun
License : MIT License
Project Creator : striderarun
/**
* Created by arun_subramonian on 12/19/16.
*/
@Service
public clreplaced ShippingServiceImpl implements ShippingService {
@Resource
private ShippingRepository shippingRepository;
@Autowired
private KafkaTemplate kafkaTemplate;
@Autowired
private ObjectMapper objectMapper;
@Override
public void createShippingRequest(Long orderId) {
Shipping shipping = new Shipping();
shipping.setOrderId(orderId);
shipping.setStatus(ShippingStatus.SHIPPED);
shipping = shippingRepository.save(shipping);
broadcastOrderShippedEvent(shipping);
}
@Override
public void acknowledgeDelivery(Long shippingId) {
Shipping shipping = shippingRepository.findOne(shippingId);
shipping.setStatus(ShippingStatus.DELIVERED);
shippingRepository.save(shipping);
}
private void broadcastOrderShippedEvent(Shipping shipping) {
Event event = new Event();
event.setOrderId(shipping.getOrderId());
try {
kafkaTemplate.send("ORDER_SHIPPED", objectMapper.writeValuereplacedtring(event));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
19
View Source File : Controller.java
License : Apache License 2.0
Project Creator : spring-cloud-samples
License : Apache License 2.0
Project Creator : spring-cloud-samples
/**
* @author Gary Russell
* @since 2.2.1
*/
@RestController
public clreplaced Controller {
@Autowired
private KafkaTemplate<Object, Object> template;
@PostMapping(path = "/send/foo/{what}")
public void sendFoo(@PathVariable String what) {
this.template.send("topic1", new Foo1(what));
}
}
19
View Source File : Controller.java
License : Apache License 2.0
Project Creator : spring-cloud-samples
License : Apache License 2.0
Project Creator : spring-cloud-samples
/**
* @author Gary Russell
* @author Chris Bono
* @since 2.2.1
*/
@RestController
public clreplaced Controller {
@Autowired
private KafkaTemplate<Object, Object> template;
@PostMapping(path = "/send/foo/{what}")
public void sendFoo(@PathVariable String what) {
this.template.send("topic1", new Foo1(what));
}
@PostMapping(path = "/send/foo/message/{what}")
public void sendFooAsMessage(@PathVariable String what) {
Map<String, Object> headers = new HashMap<>();
headers.put("kafka_topic", "topic1");
headers.put("kafka_messageKey", "key-" + what);
Message<Foo1> message = MessageBuilder.createMessage(new Foo1(what), new MessageHeaders(headers));
this.template.send(message);
}
}
19
View Source File : ApplicationTests.java
License : Apache License 2.0
Project Creator : spring-cloud-samples
License : Apache License 2.0
Project Creator : spring-cloud-samples
@Bean
MessageVerifier<Message<?>> standaloneMessageVerifier(KafkaTemplate kafkaTemplate) {
return new MessageVerifier<Message<?>>() {
@Override
public Message<?> receive(String destination, long timeout, TimeUnit timeUnit, @Nullable YamlContract contract) {
return null;
}
@Override
public Message<?> receive(String destination, YamlContract contract) {
return null;
}
@Override
public void send(Message<?> message, String destination, @Nullable YamlContract contract) {
}
@Override
public <T> void send(T payload, Map<String, Object> headers, String destination, @Nullable YamlContract contract) {
Map<String, Object> newHeaders = headers != null ? new HashMap<>(headers) : new HashMap<>();
newHeaders.put(KafkaHeaders.TOPIC, destination);
kafkaTemplate.send(MessageBuilder.createMessage(payload, new MessageHeaders(newHeaders)));
}
};
}
19
View Source File : MockSofaTracerSpringKafkaTest.java
License : Apache License 2.0
Project Creator : sofastack
License : Apache License 2.0
Project Creator : sofastack
/**
* MockSofaTracerSpringKafkaTest
*
* @author chenchen6 2020/9/13 22:22
* @since 3.1.0
*/
public clreplaced MockSofaTracerSpringKafkaTest {
@Autowired
private KafkaTemplate<Integer, String> kafkaTemplate;
@Test
public void test() {
if (Objects.isNull(kafkaTemplate)) {
return;
}
kafkaTemplate.send("spring", "message");
}
}
19
View Source File : WithdrawController.java
License : MIT License
Project Creator : sengeiou
License : MIT License
Project Creator : sengeiou
/**
* @author GS
* @date 2018年01月26日
*/
@RestController
@Slf4j
@RequestMapping(value = "/withdraw", method = RequestMethod.POST)
public clreplaced WithdrawController {
@Autowired
private MemberAddressService memberAddressService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private MemberService memberService;
@Autowired
private CoinService coinService;
@Autowired
private MemberWalletService memberWalletService;
@Autowired
private WithdrawRecordService withdrawApplyService;
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private LocaleMessageSourceService sourceService;
@Autowired
private MemberTransactionService memberTransactionService;
/**
* 增加提现地址
* @param address
* @param unit
* @param remark
* @param code
* @param aims
* @param user
* @return
*/
@RequestMapping("address/add")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult addAddress(String address, String unit, String remark, String code, String aims, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
hasText(address, sourceService.getMessage("MISSING_COIN_ADDRESS"));
hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
hasText(code, sourceService.getMessage("MISSING_VERIFICATION_CODE"));
hasText(aims, sourceService.getMessage("MISSING_PHONE_OR_EMAIL"));
ValueOperations valueOperations = redisTemplate.opsForValue();
Member member = memberService.findOne(user.getId());
if (member.getMobilePhone() != null && aims.equals(member.getMobilePhone())) {
Object info = valueOperations.get(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
if (info == null || !info.toString().equals(code)) {
return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
} else {
valueOperations.getOperations().delete(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
}
} else if (member.getEmail() != null && aims.equals(member.getEmail())) {
Object info = valueOperations.get(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
if (!info.toString().equals(code)) {
return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
} else {
valueOperations.getOperations().delete(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
}
} else {
return MessageResult.error(sourceService.getMessage("ADD_ADDRESS_FAILED"));
}
MessageResult result = memberAddressService.addMemberAddress(user.getId(), address, unit, remark);
if (result.getCode() == 0) {
result.setMessage(sourceService.getMessage("ADD_ADDRESS_SUCCESS"));
} else if (result.getCode() == 500) {
result.setMessage(sourceService.getMessage("ADD_ADDRESS_FAILED"));
} else if (result.getCode() == 600) {
result.setMessage(sourceService.getMessage("COIN_NOT_SUPPORT"));
}
return result;
}
/**
* 删除提现地址
* @param id
* @param user
* @return
*/
@RequestMapping("address/delete")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult deleteAddress(long id, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
MessageResult result = memberAddressService.deleteMemberAddress(user.getId(), id);
if (result.getCode() == 0) {
result.setMessage(sourceService.getMessage("DELETE_ADDRESS_SUCCESS"));
} else {
result.setMessage(sourceService.getMessage("DELETE_ADDRESS_FAILED"));
}
return result;
}
/**
* 提现地址分页信息
* @param user
* @param pageNo
* @param pageSize
* @param unit
* @return
*/
@RequestMapping("address/page")
public MessageResult addressPage(@SessionAttribute(SESSION_MEMBER) AuthMember user, int pageNo, int pageSize, String unit) {
Page<MemberAddress> page = memberAddressService.pageQuery(pageNo, pageSize, user.getId(), unit);
Page<ScanMemberAddress> scanMemberAddresses = page.map(x -> ScanMemberAddress.toScanMemberAddress(x));
MessageResult result = MessageResult.success();
result.setData(scanMemberAddresses);
return result;
}
/**
* 支持提现的地址
* @return
*/
@RequestMapping("support/coin")
public MessageResult queryWithdraw() {
List<Coin> list = coinService.findAllCanWithDraw();
List<String> list1 = new ArrayList<>();
list.stream().forEach(x -> list1.add(x.getUnit()));
MessageResult result = MessageResult.success();
result.setData(list1);
return result;
}
/**
* 提现币种详细信息
* @param user
* @return
*/
@RequestMapping("support/coin/info")
public MessageResult queryWithdrawCoin(@SessionAttribute(SESSION_MEMBER) AuthMember user) {
List<Coin> list = coinService.findAllCanWithDraw();
List<MemberWallet> list1 = memberWalletService.findAllByMemberId(user.getId());
long id = user.getId();
List<WithdrawWalletInfo> list2 = list1.stream().filter(x -> list.contains(x.getCoin())).map(x -> WithdrawWalletInfo.builder().balance(x.getBalance()).withdrawScale(x.getCoin().getWithdrawScale()).maxTxFee(x.getCoin().getMaxTxFee()).minTxFee(x.getCoin().getMinTxFee()).minAmount(x.getCoin().getMinWithdrawAmount()).maxAmount(x.getCoin().getMaxWithdrawAmount()).name(x.getCoin().getName()).nameCn(x.getCoin().getNameCn()).threshold(x.getCoin().getWithdrawThreshold()).unit(x.getCoin().getUnit()).canAutoWithdraw(x.getCoin().getCanAutoWithdraw()).addresses(memberAddressService.queryAddress(id, x.getCoin().getName())).build()).collect(Collectors.toList());
MessageResult result = MessageResult.success();
result.setData(list2);
return result;
}
/**
* 申请提币(请到PC端提币或升级APP)
* 没有验证码校验
* @param user
* @param unit
* @param address
* @param amount
* @param fee
* @param remark
* @param jyPreplacedword
* @return
* @throws Exception
*/
@RequestMapping("apply")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult withdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword) throws Exception {
return MessageResult.success(sourceService.getMessage("WITHDRAW_TO_PC"));
}
/**
* 申请提币(添加验证码校验)
* @param user
* @param unit
* @param address
* @param amount
* @param fee
* @param remark
* @param jyPreplacedword
* @return
* @throws Exception
*/
@RequestMapping("apply/code")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult withdrawCode(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword, @RequestParam("code") String code) throws Exception {
hasText(jyPreplacedword, sourceService.getMessage("MISSING_JYPreplacedWORD"));
hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
Coin coin = coinService.findByUnit(unit);
amount.setScale(coin.getWithdrawScale(), BigDecimal.ROUND_DOWN);
notNull(coin, sourceService.getMessage("COIN_ILLEGAL"));
isTrue(coin.getStatus().equals(CommonStatus.NORMAL) && coin.getCanWithdraw().equals(BooleanEnum.IS_TRUE), sourceService.getMessage("COIN_NOT_SUPPORT"));
isTrue(compare(fee, new BigDecimal(String.valueOf(coin.getMinTxFee()))), sourceService.getMessage("CHARGE_MIN") + coin.getMinTxFee());
isTrue(compare(new BigDecimal(String.valueOf(coin.getMaxTxFee())), fee), sourceService.getMessage("CHARGE_MAX") + coin.getMaxTxFee());
isTrue(compare(coin.getMaxWithdrawAmount(), amount), sourceService.getMessage("WITHDRAW_MAX") + coin.getMaxWithdrawAmount());
isTrue(compare(amount, coin.getMinWithdrawAmount()), sourceService.getMessage("WITHDRAW_MIN") + coin.getMinWithdrawAmount());
MemberWallet memberWallet = memberWalletService.findByCoinAndMemberId(coin, user.getId());
isTrue(compare(memberWallet.getBalance(), amount), sourceService.getMessage("INSUFFICIENT_BALANCE"));
// isTrue(memberAddressService.findByMemberIdAndAddress(user.getId(), address).size() > 0, sourceService.getMessage("WRONG_ADDRESS"));
isTrue(memberWallet.getIsLock() == BooleanEnum.IS_FALSE, "钱包已锁定");
Member member = memberService.findOne(user.getId());
String mbPreplacedword = member.getJyPreplacedword();
replacedert.hasText(mbPreplacedword, sourceService.getMessage("NO_SET_JYPreplacedWORD"));
replacedert.isTrue(Md5.md5Digest(jyPreplacedword + member.getSalt()).toLowerCase().equals(mbPreplacedword), sourceService.getMessage("ERROR_JYPreplacedWORD"));
ValueOperations valueOperations = redisTemplate.opsForValue();
String phone = member.getMobilePhone();
Object codeRedis = valueOperations.get(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
notNull(codeRedis, sourceService.getMessage("VERIFICATION_CODE_NOT_EXISTS"));
if (!codeRedis.toString().equals(code)) {
return error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
} else {
valueOperations.getOperations().delete(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
}
MessageResult result = memberWalletService.freezeBalance(memberWallet, amount);
if (result.getCode() != 0) {
throw new InformationExpiredException("Information Expired");
}
WithdrawRecord withdrawApply = new WithdrawRecord();
withdrawApply.setCoin(coin);
withdrawApply.setFee(fee);
withdrawApply.setArrivedAmount(sub(amount, fee));
withdrawApply.setMemberId(user.getId());
withdrawApply.setTotalAmount(amount);
withdrawApply.setAddress(address);
withdrawApply.setRemark(remark);
withdrawApply.setCanAutoWithdraw(coin.getCanAutoWithdraw());
// 提币数量低于或等于阈值并且该币种支持自动提币
if (amount.compareTo(coin.getWithdrawThreshold()) <= 0 && coin.getCanAutoWithdraw().equals(BooleanEnum.IS_TRUE)) {
withdrawApply.setStatus(WithdrawStatus.WAITING);
withdrawApply.setIsAuto(BooleanEnum.IS_TRUE);
withdrawApply.setDealTime(withdrawApply.getCreateTime());
WithdrawRecord withdrawRecord = withdrawApplyService.save(withdrawApply);
JSONObject json = new JSONObject();
json.put("uid", user.getId());
// 提币总数量
json.put("totalAmount", amount);
// 手续费
json.put("fee", fee);
// 预计到账数量
json.put("arriveAmount", sub(amount, fee));
// 币种
json.put("coin", coin);
// 提币地址
json.put("address", address);
// 提币记录id
json.put("withdrawId", withdrawRecord.getId());
kafkaTemplate.send("withdraw", coin.getUnit(), json.toJSONString());
return MessageResult.success(sourceService.getMessage("APPLY_SUCCESS"));
} else {
withdrawApply.setStatus(WithdrawStatus.PROCESSING);
withdrawApply.setIsAuto(BooleanEnum.IS_FALSE);
if (withdrawApplyService.save(withdrawApply) != null) {
return MessageResult.success(sourceService.getMessage("APPLY_AUDIT"));
} else {
throw new InformationExpiredException("Information Expired");
}
}
}
/**
* 提币记录
* @param user
* @param page
* @param pageSize
* @return
*/
@GetMapping("record")
public MessageResult pageWithdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, int page, int pageSize) {
MessageResult mr = new MessageResult(0, "success");
Page<WithdrawRecord> records = withdrawApplyService.findAllByMemberId(user.getId(), page, pageSize);
records.map(x -> ScanWithdrawRecord.toScanWithdrawRecord(x));
mr.setData(records);
return mr;
}
}
19
View Source File : OrderController.java
License : MIT License
Project Creator : sengeiou
License : MIT License
Project Creator : sengeiou
/**
* 委托订单处理类
*/
@Slf4j
@RestController
@RequestMapping("/order")
public clreplaced OrderController {
@Autowired
private ExchangeOrderService orderService;
@Autowired
private MemberWalletService walletService;
@Autowired
private ExchangeCoinService exchangeCoinService;
@Autowired
private CoinService coinService;
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private ExchangeOrderDetailService exchangeOrderDetailService;
@Value("${exchange.max-cancel-times:-1}")
private int maxCancelTimes;
@Autowired
private LocaleMessageSourceService msService;
@Autowired
private MemberService memberService;
@Autowired
private RestTemplate restTemplate;
@Autowired
private RedisTemplate redisTemplate;
/**
* 添加委托订单
* @param authMember
* @param direction
* @param symbol
* @param price
* @param amount
* @param type
* usedisCount 暂时不用
* @return
*/
@RequestMapping("add")
public MessageResult addOrder(@SessionAttribute(SESSION_MEMBER) AuthMember authMember, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
ValueOperations valueOperations = redisTemplate.opsForValue();
if (direction == null || type == null) {
return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
}
Member member = memberService.findOne(authMember.getId());
if (member.getMemberLevel() == MemberLevelEnum.GENERAL) {
return MessageResult.error(500, "请先进行实名认证");
}
// 是否被禁止交易
if (member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)) {
return MessageResult.error(500, msService.getMessage("CANNOT_TRADE"));
}
ExchangeOrder order = new ExchangeOrder();
// 判断限价输入值是否小于零
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
// 判断数量小于零
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
// 根据交易对名称(symbol)获取交易对儿信息
ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
if (exchangeCoin == null || exchangeCoin.getEnable() != 1) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
// 获取基准币
String baseCoin = exchangeCoin.getBaseSymbol();
// 获取交易币
String exCoin = exchangeCoin.getCoinSymbol();
Coin coin;
// 根据交易方向查询币种信息
if (direction == ExchangeOrderDirection.SELL) {
coin = coinService.findByUnit(exCoin);
} else {
coin = coinService.findByUnit(baseCoin);
}
if (coin == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
// 设置价格精度
price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 委托数量和精度控制
if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 最小成交额控制
if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
return MessageResult.error(500, "成交额至少为" + exchangeCoin.getMinTurnover());
}
} else {
amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
// 成交量范围控制
if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
}
if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
}
}
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
if (baseCoinWallet == null || exCoinWallet == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
}
// 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
// 查看是否启用市价买卖
if (type == ExchangeOrderType.MARKET_PRICE) {
if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, "不支持市价购买");
} else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, "不支持市价出售");
}
}
// 限制委托数量
if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(member.getId(), symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
return MessageResult.error(500, "超过最大挂单数量 " + exchangeCoin.getMaxTradingOrder());
}
order.setMemberId(member.getId());
order.setSymbol(symbol);
order.setBaseSymbol(baseCoin);
order.setCoinSymbol(exCoin);
order.setType(type);
order.setDirection(direction);
if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
order.setPrice(BigDecimal.ZERO);
} else {
order.setPrice(price);
}
order.setUseDiscount("0");
// 限价买入单时amount为用户设置的总成交额
order.setAmount(amount);
MessageResult mr = orderService.addOrder(member.getId(), order);
if (mr.getCode() != 0) {
return MessageResult.error(500, "提交订单失败:" + mr.getMessage());
}
log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
MessageResult result = MessageResult.success("success");
result.setData(order.getOrderId());
return result;
}
/**
* 历史委托
*/
@RequestMapping("history")
public Page<ExchangeOrder> historyOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
Page<ExchangeOrder> page = orderService.findHistory(member.getId(), symbol, pageNo, pageSize);
page.getContent().forEach(exchangeOrder -> {
// 获取交易成交详情
exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
});
return page;
}
/**
* 个人中心历史委托
*/
@RequestMapping("personal/history")
public Page<ExchangeOrder> personalHistoryOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "status", required = false) ExchangeOrderStatus status, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
Page<ExchangeOrder> page = orderService.findPersonalHistory(member.getId(), symbol, type, status, startTime, endTime, direction, pageNo, pageSize);
page.getContent().forEach(exchangeOrder -> {
// 获取交易成交详情
exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
});
return page;
}
/**
* 个人中心当前委托
* @param member
* @param symbol
* @param type
* @param startTime
* @param endTime
* @param pageNo
* @param pageSize
* @return
*/
@RequestMapping("personal/current")
public Page<ExchangeOrder> personalCurrentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
Page<ExchangeOrder> page = orderService.findPersonalCurrent(member.getId(), symbol, type, startTime, endTime, direction, pageNo, pageSize);
page.getContent().forEach(exchangeOrder -> {
// 获取交易成交详情
BigDecimal tradedAmount = BigDecimal.ZERO;
List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
exchangeOrder.setDetail(details);
for (ExchangeOrderDetail trade : details) {
tradedAmount = tradedAmount.add(trade.getAmount());
}
exchangeOrder.setTradedAmount(tradedAmount);
});
return page;
}
/**
* 当前委托
*
* @param member
* @param pageNo
* @param pageSize
* @return
*/
@RequestMapping("current")
public Page<ExchangeOrder> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
Page<ExchangeOrder> page = orderService.findCurrent(member.getId(), symbol, pageNo, pageSize);
page.getContent().forEach(exchangeOrder -> {
// 获取交易成交详情
BigDecimal tradedAmount = BigDecimal.ZERO;
List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
exchangeOrder.setDetail(details);
for (ExchangeOrderDetail trade : details) {
tradedAmount = tradedAmount.add(trade.getAmount());
}
exchangeOrder.setTradedAmount(tradedAmount);
});
return page;
}
/**
* 查询委托成交明细
*
* @param member
* @param orderId
* @return
*/
@RequestMapping("detail/{orderId}")
public List<ExchangeOrderDetail> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
return exchangeOrderDetailService.findAllByOrderId(orderId);
}
@RequestMapping("cancel/{orderId}")
public MessageResult cancelOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
ExchangeOrder order = orderService.findOne(orderId);
if (order.getMemberId() != member.getId()) {
return MessageResult.error(500, "禁止操作");
}
if (order.getStatus() != ExchangeOrderStatus.TRADING) {
return MessageResult.error(500, "订单不在交易");
}
if (isExchangeOrderExist(order)) {
if (maxCancelTimes > 0 && orderService.findTodayOrderCancelTimes(member.getId(), order.getSymbol()) >= maxCancelTimes) {
return MessageResult.error(500, "你今天已经取消了 " + maxCancelTimes + " 次");
}
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
} else {
// 强制取消
orderService.forceCancelOrder(order);
}
return MessageResult.success("success");
}
/**
* 查找撮合交易器中订单是否存在
* @param order
* @return
*/
public boolean isExchangeOrderExist(ExchangeOrder order) {
try {
String serviceName = "SERVICE-EXCHANGE-TRADE";
String url = "http://" + serviceName + "/monitor/order?symbol=" + order.getSymbol() + "&orderId=" + order.getOrderId() + "&direction=" + order.getDirection() + "&type=" + order.getType();
ResponseEnreplacedy<ExchangeOrder> result = restTemplate.getForEnreplacedy(url, ExchangeOrder.clreplaced);
return result != null;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 获取下单时间限制
* @return
*/
@GetMapping("/time_limit")
public MessageResult userAddExchangeTimeLimit() {
MessageResult mr = new MessageResult();
mr.setCode(0);
mr.setMessage("success");
mr.setData(SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME);
return mr;
}
}
19
View Source File : KafkaServiceImpl.java
License : Apache License 2.0
Project Creator : sanshengshui
License : Apache License 2.0
Project Creator : sanshengshui
/**
* @author james
* @description kafka消息生产者处理类
*/
@Service
public clreplaced KafkaServiceImpl implements GrozaKafkaService {
@Autowired
private KafkaTemplate kafkaTemplate;
private static Gson gson = new GsonBuilder().create();
@Override
public void send(InternalMessage internalMessage) {
kafkaTemplate.send(internalMessage.getTopic(), gson.toJson(internalMessage));
}
}
19
View Source File : KafkaItemWriter.java
License : Apache License 2.0
Project Creator : redis-developer
License : Apache License 2.0
Project Creator : redis-developer
/**
* @author Julien Ruaux
*/
public clreplaced KafkaItemWriter<K> extends AbstracreplacedemStreamItemWriter<ProducerRecord<K, Object>> {
private final KafkaTemplate<K, Object> kafkaTemplate;
@Builder
private KafkaItemWriter(@NonNull KafkaTemplate<K, Object> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
@Override
public void write(List<? extends ProducerRecord<K, Object>> items) {
for (ProducerRecord<K, Object> item : items) {
this.kafkaTemplate.send(item);
}
}
}
19
View Source File : BankAccountServiceImpl.java
License : Apache License 2.0
Project Creator : PhoenixIQ
License : Apache License 2.0
Project Creator : PhoenixIQ
/**
* @author baozi
* @date 2020/5/27 12:09 PM
*/
@JsonSerialize
@Slf4j
@Service
public clreplaced BankAccountServiceImpl implements BankAccountService {
@Value("${phoenix.server.topic.account}")
private String accountTopic;
@Value("${phoenix.server.topic.account-tn}")
private String accountTnTopic;
@Value("${phoenix.server.topic.create-account-event}")
private String createAccountEventTopic;
// kafka发送端
private final KafkaTemplate<String, String> kafkaTemplate;
// phoenix 客户端
private final PhoenixClient phoenixClient;
// 账户存储
private final AccountStoreRepository accountStoreRepository;
public BankAccountServiceImpl(KafkaTemplate<String, String> kafkaTemplate, PhoenixClient phoenixClient, AccountStoreRepository accountStoreRepository) {
this.kafkaTemplate = kafkaTemplate;
this.phoenixClient = phoenixClient;
this.accountStoreRepository = accountStoreRepository;
}
@Override
public String queryAllAccount(boolean linearizability) {
// 1. 通过数据库查询账户列表
List<AccountStore> accountStores = new ArrayList<>();
accountStoreRepository.findAll().forEach(accountStore -> accountStores.add(accountStore));
// 2. 查询账户信息,如果linearizability == true,会使用QueryCmd直接读取内存来
// 达到线性一致性读. 否则会读业务数据库实现最终一致性读(业务数据库是异步写入的)
List<AccountQueryEvent> accountQueryEvents = new ArrayList<>();
if (linearizability) {
accountStores.forEach(accountStore -> {
Future<RpcResult> future = phoenixClient.send(new AccountQueryCmd(accountStore.getAccountCode()), accountTopic, null);
RpcResult<AccountQueryEvent> rpcResult = null;
try {
rpcResult = future.get(100, TimeUnit.SECONDS);
} catch (Exception e) {
log.error(e.getLocalizedMessage(), e);
return;
}
AccountQueryEvent accountQueryEvent = rpcResult.getData();
accountQueryEvents.add(accountQueryEvent);
});
} else {
accountStores.forEach(accountStore -> accountQueryEvents.add(new AccountQueryEvent(accountStore.getAccountCode(), accountStore.getBalanceAmt(), accountStore.getSuccessTransferOut(), accountStore.getFailTransferOut(), accountStore.getSuccessTransferIn())));
}
// 3. 转换为html
double totalBalanceAmt = 0;
int totalSuccessTransferOut = 0;
int totalFailTransferOut = 0;
int totalSuccessTransferIn = 0;
StringBuffer sb = new StringBuffer();
sb.append("<table border=1 width='1200px'>");
sb.append("<tr><th>银行账户</th><th>账户余额</th><th>成功转出次数</th><th>失败转出次数</th><th>成功转入次数</th></tr>");
for (AccountQueryEvent accountQueryEvent : accountQueryEvents) {
sb.append("<tr>");
sb.append("<td>" + accountQueryEvent.getAccount() + "</td>");
sb.append("<td>" + accountQueryEvent.getBalanceAmt() + "</td>");
sb.append("<td>" + accountQueryEvent.getSuccessTransferOut() + "</td>");
sb.append("<td>" + accountQueryEvent.getFailTransferOut() + "</td>");
sb.append("<td>" + accountQueryEvent.getSuccessTransferIn() + "</td>");
sb.append("</tr>");
totalBalanceAmt += accountQueryEvent.getBalanceAmt();
totalSuccessTransferOut += accountQueryEvent.getSuccessTransferOut();
totalFailTransferOut += accountQueryEvent.getFailTransferOut();
totalSuccessTransferIn += accountQueryEvent.getSuccessTransferIn();
}
if (accountQueryEvents.size() > 1) {
sb.append("<tr>");
sb.append("<td>账户数量:" + accountQueryEvents.size() + "</td>");
sb.append("<td>账户余额汇总:" + totalBalanceAmt + "</td>");
sb.append("<td>成功转出汇总:" + totalSuccessTransferOut + "</td>");
sb.append("<td>失败转出汇总:" + totalFailTransferOut + "</td>");
sb.append("<td>成功转入汇总:" + totalSuccessTransferIn + "</td>");
sb.append("</tr>");
}
sb.append("</table>");
return sb.toString();
}
@Override
public String startBenchmarkTransfer(int total, int tps, int aggregateNum) {
log.info("start a message test: aggregateNum<{}> total<{}>, tps<{}>", aggregateNum, total, tps);
int timeout = total / tps + 5;
RateLimiter messageTestTask = new RateLimiter(tps, total, timeout, () -> {
String outAccount = codeFormat(new Random().nextInt(aggregateNum));
String inAccount = codeFormat(new Random().nextInt(aggregateNum));
int amt = new Random().nextInt(100);
AccountTransferCmd req = new AccountTransferCmd(inAccount, outAccount, amt);
phoenixClient.send(req, accountTnTopic, null);
}, "message_test", new RateLimiter.RunMonitor(false));
messageTestTask.start();
return String.format("开始随机转账:total=<%d>,tps=<%d>,aggregateNum=<%d>", total, tps, aggregateNum);
}
@Override
public String transfer(String outAccountCode, String inAccountCode, double amt) {
AccountTransferCmd req = new AccountTransferCmd(inAccountCode, outAccountCode, amt);
Future<RpcResult> future = phoenixClient.send(req, accountTnTopic, null);
RpcResult rpcResult;
try {
rpcResult = future.get(10, TimeUnit.SECONDS);
return rpcResult.getMessage();
} catch (InterruptedException | ExecutionException | TimeoutException e) {
return "rpc error: " + e.getMessage();
}
}
@Override
public String batchAllocate(int total, int tps, int aggregateNum) {
log.info("start a message test: aggregateNum<{}> total<{}>, tps<{}>", aggregateNum, total, tps);
int timeout = total / tps + 5;
// 设置速率限制器发送请求
RateLimiter messageTestTask = new RateLimiter(tps, total, timeout, () -> {
String account = codeFormat(new Random().nextInt(aggregateNum));
int amt = (100 - new Random().nextInt(200));
AccountAllocateCmd cmd = new AccountAllocateCmd(account, amt);
phoenixClient.send(cmd, accountTopic, "");
}, "account", new RateLimiter.RunMonitor(false));
// 开始随机划拨
messageTestTask.start();
return String.format("开始随机转账:total=<%d>,tps=<%d>,aggregateNum=<%d>", total, tps, aggregateNum);
}
@Override
public String allocate(String account, double amt, String allocateNumber) {
AccountAllocateCmd cmd = new AccountAllocateCmd(account, amt, allocateNumber);
Future<RpcResult> future = phoenixClient.send(cmd, accountTopic, "");
try {
RpcResult result = future.get(10, TimeUnit.SECONDS);
return result.getMessage();
} catch (InterruptedException | ExecutionException | TimeoutException e) {
return "rpc error: " + e.getMessage();
}
}
@Override
public String createAccount(String account, double amt) {
Account.AccountCreateCmd createCmd = Account.AccountCreateCmd.newBuilder().setAccountCode(account).setBalanceAmt(amt).build();
Future<RpcResult> future = phoenixClient.send(createCmd, accountTopic, null);
try {
RpcResult result = future.get(10, TimeUnit.SECONDS);
return result.getMessage();
} catch (InterruptedException | ExecutionException | TimeoutException e) {
return "rpc error: " + e.getMessage();
}
}
@Override
public String batchCreateAccount(int aggregateNum, double amt) {
List<String> accounts = new ArrayList<>();
for (int i = 0; i < aggregateNum; i++) {
accounts.add(codeFormat(i));
}
UpperAccountCreateEvent otherSystemBatchAccountCreateEvent = new UpperAccountCreateEvent(accounts, amt);
String jsonStr = JsonUtils.encode(otherSystemBatchAccountCreateEvent);
log.info("send message: {}", jsonStr);
kafkaTemplate.send(createAccountEventTopic, otherSystemBatchAccountCreateEvent.getClreplaced().getName(), jsonStr);
return "批量创建账户事件发送成功";
}
/**
* 格式化账户编码
* @param num 代号
* @return accountCode
*/
private String codeFormat(int num) {
return String.format("A%08d", num);
}
}
19
View Source File : KafkaMessageSenderEndpointFactoryTest.java
License : Apache License 2.0
Project Creator : otto-de
License : Apache License 2.0
Project Creator : otto-de
@Test
public void shouldNotMatchMessageQueueSelectors() {
final MessageInterceptorRegistry interceptorRegistry = mock(MessageInterceptorRegistry.clreplaced);
final KafkaTemplate kafkaTemplate = mock(KafkaTemplate.clreplaced);
final KafkaMessageSenderEndpointFactory factory = new KafkaMessageSenderEndpointFactory(interceptorRegistry, kafkaTemplate);
replacedertThat(factory.matches(MessageQueue.clreplaced), is(false));
}
19
View Source File : KafkaMessageSenderEndpointFactoryTest.java
License : Apache License 2.0
Project Creator : otto-de
License : Apache License 2.0
Project Creator : otto-de
@Test
public void shouldMatchMessageLogSelectors() {
final MessageInterceptorRegistry interceptorRegistry = mock(MessageInterceptorRegistry.clreplaced);
final KafkaTemplate kafkaTemplate = mock(KafkaTemplate.clreplaced);
final KafkaMessageSenderEndpointFactory factory = new KafkaMessageSenderEndpointFactory(interceptorRegistry, kafkaTemplate);
replacedertThat(factory.matches(MessageLog.clreplaced), is(true));
replacedertThat(factory.matches(Kafka.clreplaced), is(true));
}
19
View Source File : KafkaMessageSenderEndpointFactoryTest.java
License : Apache License 2.0
Project Creator : otto-de
License : Apache License 2.0
Project Creator : otto-de
@Test
public void shouldBuildKinesisMessageSender() {
final KafkaTemplate kafkaTemplate = mock(KafkaTemplate.clreplaced);
final KafkaMessageSenderEndpointFactory factory = new KafkaMessageSenderEndpointFactory(new MessageInterceptorRegistry(), kafkaTemplate);
final KafkaMessageSender sender = (KafkaMessageSender) factory.create("foo-stream", MessageFormat.V1);
replacedertThat(sender.getChannelName(), is("foo-stream"));
replacedertThat(sender.getMessageFormat(), is(MessageFormat.V1));
replacedertThat(sender, is(instanceOf(KafkaMessageSender.clreplaced)));
}
19
View Source File : KafkaMessageSenderEndpointFactory.java
License : Apache License 2.0
Project Creator : otto-de
License : Apache License 2.0
Project Creator : otto-de
public clreplaced KafkaMessageSenderEndpointFactory implements MessageSenderEndpointFactory {
private final MessageInterceptorRegistry registry;
private final KafkaTemplate<String, String> kafkaTemplate;
public KafkaMessageSenderEndpointFactory(final MessageInterceptorRegistry registry, final KafkaTemplate<String, String> kafkaTemplate) {
this.registry = registry;
this.kafkaTemplate = kafkaTemplate;
}
@Override
public MessageSenderEndpoint create(@Nonnull final String channelName, final MessageFormat messageFormat) {
return new KafkaMessageSender(channelName, registry, new TextMessageTranslator(), kafkaTemplate);
}
@Override
public boolean matches(final Clreplaced<? extends Selector> channelSelector) {
return channelSelector.isreplacedignableFrom(selector());
}
@Override
public Clreplaced<? extends Selector> selector() {
return Kafka.clreplaced;
}
}
19
View Source File : Producer.java
License : Apache License 2.0
Project Creator : opentracing-contrib
License : Apache License 2.0
Project Creator : opentracing-contrib
@Service
public clreplaced Producer {
private static final String TOPIC = "users";
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
void sendMessage(final String message) {
System.out.println(String.format("#### -> Producing message -> %s", message));
this.kafkaTemplate.send(TOPIC, message);
}
}
19
View Source File : SpringKafkaTest.java
License : Apache License 2.0
Project Creator : opentracing-contrib
License : Apache License 2.0
Project Creator : opentracing-contrib
@Test
public void test(final MockTracer tracer) {
try (final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(KafkaConfiguration.clreplaced)) {
final KafkaTemplate<Integer, String> kafkaTemplate = context.getBean(KafkaTemplate.clreplaced);
kafkaTemplate.send("spring", "message");
await().atMost(15, TimeUnit.SECONDS).until(() -> tracer.finishedSpans().size(), equalTo(1));
replacedertEquals(1, counter.get());
replacedertEquals(1, tracer.finishedSpans().size());
}
}
19
View Source File : LoadTestProducer.java
License : GNU General Public License v2.0
Project Creator : metersphere
License : GNU General Public License v2.0
Project Creator : metersphere
@Service
public clreplaced LoadTestProducer {
private static final String SEPARATOR = " ";
@Value("${kafka.log.topic}")
private String topic;
@Resource
private KafkaTemplate<String, Object> kafkaTemplate;
public void sendMessage(String reportId) {
String[] contents = new String[] { reportId, "none", "0", "Notifying test listeners of end of test" };
String log = StringUtils.join(contents, SEPARATOR);
this.kafkaTemplate.send(topic, log);
}
}
19
View Source File : KafkaServiceImpl.java
License : Apache License 2.0
Project Creator : luoyusoft
License : Apache License 2.0
Project Creator : luoyusoft
@Slf4j
@Service
public clreplaced KafkaServiceImpl implements KafkaService {
@Resource
private KafkaTemplate<String, String> kafkaTemplate;
@Override
public boolean sendMessage(String message) {
// 发送消息
kafkaTemplate.send("test_topic", message);
return true;
}
}
19
View Source File : KafkaEventSender.java
License : MIT License
Project Creator : liuxx-u
License : MIT License
Project Creator : liuxx-u
/**
* kafka事件注册器,向kafka队列中push消息
* @author liuxx
*/
@Slf4j
public clreplaced KafkaEventSender implements IEventSender {
private final IEventLogDispatcher eventLogDispatcher;
private final KafkaTemplate<String, IEventArg> kafkaTemplate;
public KafkaEventSender(IEventLogDispatcher eventLogDispatcher, KafkaTemplate<String, IEventArg> kafkaTemplate) {
this.eventLogDispatcher = eventLogDispatcher;
this.kafkaTemplate = kafkaTemplate;
}
/**
* 事件注册
*
* @param eventArg 事件参数
*/
@Override
public void fire(IEventArg eventArg) {
ListenableFuture<SendResult<String, IEventArg>> listenableFuture = kafkaTemplate.send(getTopic(eventArg), eventArg);
EventSendLog sendLog = new EventSendLog(eventArg);
// 发送成功回调
SuccessCallback<SendResult<String, IEventArg>> successCallback = result -> {
if (eventLogDispatcher == null) {
return;
}
sendLog.setSuccess(true);
Map<String, Object> map = new HashMap<>(2);
if (result != null) {
map.put("producerRecord", result.getProducerRecord());
map.put("metadata", result.getRecordMetadata());
}
sendLog.setExtJson(JSON.toJSONString(map));
this.eventLogDispatcher.dispatch(sendLog);
};
// 发送失败回调
FailureCallback failureCallback = ex -> {
if (eventLogDispatcher == null) {
return;
}
sendLog.setSuccess(false);
sendLog.setMessage(ex.getMessage());
this.eventLogDispatcher.dispatch(sendLog);
log.error(ex.getMessage());
};
listenableFuture.addCallback(successCallback, failureCallback);
}
/**
* 获取kafka的topic
*
* @param eventArg 事件消息
* @return topic topic
*/
private String getTopic(IEventArg eventArg) {
return eventArg.getClreplaced().getName();
}
}
19
View Source File : KafkaController.java
License : Apache License 2.0
Project Creator : li7nux
License : Apache License 2.0
Project Creator : li7nux
@RestController
public clreplaced KafkaController {
private KafkaTemplate<String, Object> kafkaTemplate;
@Autowired
KafkaController(KafkaTemplate kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
@PostMapping("/message/send")
public String sendMessage(@RequestBody Message message) {
kafkaTemplate.send(ChcpConstants.KAFKA_LISTENER_TOPIC.getTopic(), message.getMessage());
return message.getMessage();
}
}
19
View Source File : ProducerController.java
License : Apache License 2.0
Project Creator : kaituozhesh
License : Apache License 2.0
Project Creator : kaituozhesh
/**
* ClreplacedName: ProducerController
* Description:
* date: 2020/3/8 17:44
*
* @author kaituozhe_sh
*/
@RestController
@RequestMapping("/send")
public clreplaced ProducerController {
@Autowired
private KafkaTemplate<String, Object> kafkaTemplate;
@RequestMapping("/message")
public String send(String msg) {
kafkaTemplate.send("demo", msg);
return "success";
}
}
19
View Source File : WithdrawController.java
License : Apache License 2.0
Project Creator : jammy928
License : Apache License 2.0
Project Creator : jammy928
/**
* @author GS
* @date 2018年01月26日
*/
@RestController
@Slf4j
@RequestMapping(value = "/withdraw", method = RequestMethod.POST)
public clreplaced WithdrawController {
@Autowired
private MemberAddressService memberAddressService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private MemberService memberService;
@Autowired
private CoinService coinService;
@Autowired
private MemberWalletService memberWalletService;
@Autowired
private WithdrawRecordService withdrawApplyService;
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private LocaleMessageSourceService sourceService;
@Autowired
private MemberTransactionService memberTransactionService;
/**
* 增加提现地址
* @param address
* @param unit
* @param remark
* @param code
* @param aims
* @param user
* @return
*/
@RequestMapping("address/add")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult addAddress(String address, String unit, String remark, String code, String aims, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
hasText(address, sourceService.getMessage("MISSING_COIN_ADDRESS"));
hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
hasText(code, sourceService.getMessage("MISSING_VERIFICATION_CODE"));
hasText(aims, sourceService.getMessage("MISSING_PHONE_OR_EMAIL"));
ValueOperations valueOperations = redisTemplate.opsForValue();
Member member = memberService.findOne(user.getId());
if (member.getMobilePhone() != null && aims.equals(member.getMobilePhone())) {
Object info = valueOperations.get(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
if (info == null || !info.toString().equals(code)) {
return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
} else {
valueOperations.getOperations().delete(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
}
} else if (member.getEmail() != null && aims.equals(member.getEmail())) {
Object info = valueOperations.get(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
if (!info.toString().equals(code)) {
return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
} else {
valueOperations.getOperations().delete(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
}
} else {
return MessageResult.error(sourceService.getMessage("ADD_ADDRESS_FAILED"));
}
MessageResult result = memberAddressService.addMemberAddress(user.getId(), address, unit, remark);
if (result.getCode() == 0) {
result.setMessage(sourceService.getMessage("ADD_ADDRESS_SUCCESS"));
} else if (result.getCode() == 500) {
result.setMessage(sourceService.getMessage("ADD_ADDRESS_FAILED"));
} else if (result.getCode() == 600) {
result.setMessage(sourceService.getMessage("COIN_NOT_SUPPORT"));
}
return result;
}
/**
* 删除提现地址
* @param id
* @param user
* @return
*/
@RequestMapping("address/delete")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult deleteAddress(long id, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
MessageResult result = memberAddressService.deleteMemberAddress(user.getId(), id);
if (result.getCode() == 0) {
result.setMessage(sourceService.getMessage("DELETE_ADDRESS_SUCCESS"));
} else {
result.setMessage(sourceService.getMessage("DELETE_ADDRESS_FAILED"));
}
return result;
}
/**
* 提现地址分页信息
* @param user
* @param pageNo
* @param pageSize
* @param unit
* @return
*/
@RequestMapping("address/page")
public MessageResult addressPage(@SessionAttribute(SESSION_MEMBER) AuthMember user, int pageNo, int pageSize, String unit) {
Page<MemberAddress> page = memberAddressService.pageQuery(pageNo, pageSize, user.getId(), unit);
Page<ScanMemberAddress> scanMemberAddresses = page.map(x -> ScanMemberAddress.toScanMemberAddress(x));
MessageResult result = MessageResult.success();
result.setData(scanMemberAddresses);
return result;
}
/**
* 支持提现的地址
* @return
*/
@RequestMapping("support/coin")
public MessageResult queryWithdraw() {
List<Coin> list = coinService.findAllCanWithDraw();
List<String> list1 = new ArrayList<>();
list.stream().forEach(x -> list1.add(x.getUnit()));
MessageResult result = MessageResult.success();
result.setData(list1);
return result;
}
/**
* 提现币种详细信息
* @param user
* @return
*/
@RequestMapping("support/coin/info")
public MessageResult queryWithdrawCoin(@SessionAttribute(SESSION_MEMBER) AuthMember user) {
List<Coin> list = coinService.findAllCanWithDraw();
List<MemberWallet> list1 = memberWalletService.findAllByMemberId(user.getId());
long id = user.getId();
List<WithdrawWalletInfo> list2 = list1.stream().filter(x -> list.contains(x.getCoin())).map(x -> WithdrawWalletInfo.builder().balance(x.getBalance()).withdrawScale(x.getCoin().getWithdrawScale()).maxTxFee(x.getCoin().getMaxTxFee()).minTxFee(x.getCoin().getMinTxFee()).minAmount(x.getCoin().getMinWithdrawAmount()).maxAmount(x.getCoin().getMaxWithdrawAmount()).name(x.getCoin().getName()).nameCn(x.getCoin().getNameCn()).threshold(x.getCoin().getWithdrawThreshold()).unit(x.getCoin().getUnit()).accountType(x.getCoin().getAccountType()).canAutoWithdraw(x.getCoin().getCanAutoWithdraw()).addresses(memberAddressService.queryAddress(id, x.getCoin().getName())).build()).collect(Collectors.toList());
MessageResult result = MessageResult.success();
result.setData(list2);
return result;
}
/**
* 申请提币(请到PC端提币或升级APP)
* 没有验证码校验
* @param user
* @param unit
* @param address
* @param amount
* @param fee
* @param remark
* @param jyPreplacedword
* @return
* @throws Exception
*/
@RequestMapping("apply")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult withdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword) throws Exception {
return MessageResult.success(sourceService.getMessage("WITHDRAW_TO_PC"));
}
/**
* 申请提币(添加验证码校验)
* @param user
* @param unit
* @param address
* @param amount
* @param fee
* @param remark
* @param jyPreplacedword
* @return
* @throws Exception
*/
@RequestMapping("apply/code")
@Transactional(rollbackFor = Exception.clreplaced)
public MessageResult withdrawCode(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword, @RequestParam("code") String code) throws Exception {
hasText(jyPreplacedword, sourceService.getMessage("MISSING_JYPreplacedWORD"));
hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
Coin coin = coinService.findByUnit(unit);
amount.setScale(coin.getWithdrawScale(), BigDecimal.ROUND_DOWN);
notNull(coin, sourceService.getMessage("COIN_ILLEGAL"));
isTrue(coin.getStatus().equals(CommonStatus.NORMAL) && coin.getCanWithdraw().equals(BooleanEnum.IS_TRUE), sourceService.getMessage("COIN_NOT_SUPPORT"));
isTrue(compare(fee, new BigDecimal(String.valueOf(coin.getMinTxFee()))), sourceService.getMessage("CHARGE_MIN") + coin.getMinTxFee());
isTrue(compare(new BigDecimal(String.valueOf(coin.getMaxTxFee())), fee), sourceService.getMessage("CHARGE_MAX") + coin.getMaxTxFee());
isTrue(compare(coin.getMaxWithdrawAmount(), amount), sourceService.getMessage("WITHDRAW_MAX") + coin.getMaxWithdrawAmount());
isTrue(compare(amount, coin.getMinWithdrawAmount()), sourceService.getMessage("WITHDRAW_MIN") + coin.getMinWithdrawAmount());
MemberWallet memberWallet = memberWalletService.findByCoinAndMemberId(coin, user.getId());
isTrue(compare(memberWallet.getBalance(), amount), sourceService.getMessage("INSUFFICIENT_BALANCE"));
// isTrue(memberAddressService.findByMemberIdAndAddress(user.getId(), address).size() > 0, sourceService.getMessage("WRONG_ADDRESS"));
isTrue(memberWallet.getIsLock() == BooleanEnum.IS_FALSE, "钱包已锁定");
Member member = memberService.findOne(user.getId());
String mbPreplacedword = member.getJyPreplacedword();
replacedert.hasText(mbPreplacedword, sourceService.getMessage("NO_SET_JYPreplacedWORD"));
replacedert.isTrue(Md5.md5Digest(jyPreplacedword + member.getSalt()).toLowerCase().equals(mbPreplacedword), sourceService.getMessage("ERROR_JYPreplacedWORD"));
ValueOperations valueOperations = redisTemplate.opsForValue();
String phone = member.getMobilePhone();
Object codeRedis = valueOperations.get(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
notNull(codeRedis, sourceService.getMessage("VERIFICATION_CODE_NOT_EXISTS"));
if (!codeRedis.toString().equals(code)) {
return error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
} else {
valueOperations.getOperations().delete(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
}
MessageResult result = memberWalletService.freezeBalance(memberWallet, amount);
if (result.getCode() != 0) {
throw new InformationExpiredException("Information Expired");
}
WithdrawRecord withdrawApply = new WithdrawRecord();
withdrawApply.setCoin(coin);
withdrawApply.setFee(fee);
withdrawApply.setArrivedAmount(sub(amount, fee));
withdrawApply.setMemberId(user.getId());
withdrawApply.setTotalAmount(amount);
withdrawApply.setAddress(address);
withdrawApply.setRemark(remark);
withdrawApply.setCanAutoWithdraw(coin.getCanAutoWithdraw());
// 提币数量低于或等于阈值并且该币种支持自动提币
if (amount.compareTo(coin.getWithdrawThreshold()) <= 0 && coin.getCanAutoWithdraw().equals(BooleanEnum.IS_TRUE)) {
withdrawApply.setStatus(WithdrawStatus.WAITING);
withdrawApply.setIsAuto(BooleanEnum.IS_TRUE);
withdrawApply.setDealTime(withdrawApply.getCreateTime());
WithdrawRecord withdrawRecord = withdrawApplyService.save(withdrawApply);
JSONObject json = new JSONObject();
json.put("uid", user.getId());
// 提币总数量
json.put("totalAmount", amount);
// 手续费
json.put("fee", fee);
// 预计到账数量
json.put("arriveAmount", sub(amount, fee));
// 币种
json.put("coin", coin);
// 提币地址
json.put("address", address);
// 提币记录id
json.put("withdrawId", withdrawRecord.getId());
kafkaTemplate.send("withdraw", coin.getUnit(), json.toJSONString());
return MessageResult.success(sourceService.getMessage("APPLY_SUCCESS"));
} else {
withdrawApply.setStatus(WithdrawStatus.PROCESSING);
withdrawApply.setIsAuto(BooleanEnum.IS_FALSE);
if (withdrawApplyService.save(withdrawApply) != null) {
return MessageResult.success(sourceService.getMessage("APPLY_AUDIT"));
} else {
throw new InformationExpiredException("Information Expired");
}
}
}
/**
* 提币记录
* @param user
* @param page
* @param pageSize
* @return
*/
@GetMapping("record")
public MessageResult pageWithdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, int page, int pageSize) {
MessageResult mr = new MessageResult(0, "success");
Page<WithdrawRecord> records = withdrawApplyService.findAllByMemberId(user.getId(), page, pageSize);
records.map(x -> ScanWithdrawRecord.toScanWithdrawRecord(x));
mr.setData(records);
return mr;
}
}
19
View Source File : OrderController.java
License : Apache License 2.0
Project Creator : jammy928
License : Apache License 2.0
Project Creator : jammy928
/**
* 委托订单处理类
*/
@Slf4j
@RestController
@RequestMapping("/order")
public clreplaced OrderController {
@Autowired
private ExchangeOrderService orderService;
@Autowired
private MemberWalletService walletService;
@Autowired
private ExchangeCoinService exchangeCoinService;
@Autowired
private CoinService coinService;
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private ExchangeOrderDetailService exchangeOrderDetailService;
@Value("${exchange.max-cancel-times:-1}")
private int maxCancelTimes;
@Autowired
private LocaleMessageSourceService msService;
@Autowired
private MemberService memberService;
@Autowired
private RestTemplate restTemplate;
@Autowired
private RedisTemplate redisTemplate;
private SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 添加委托订单
* @param authMember
* @param direction
* @param symbol
* @param price
* @param amount
* @param type
* usedisCount 暂时不用
* @return
*/
@RequestMapping("add")
public MessageResult addOrder(@SessionAttribute(SESSION_MEMBER) AuthMember authMember, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
// int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
// ValueOperations valueOperations = redisTemplate.opsForValue();
if (direction == null || type == null) {
return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
}
Member member = memberService.findOne(authMember.getId());
/*
if(member.getMemberLevel()== MemberLevelEnum.GENERAL){
return MessageResult.error(500,"请先进行实名认证");
}
*/
// 是否被禁止交易
if (member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)) {
return MessageResult.error(500, msService.getMessage("CANNOT_TRADE"));
}
ExchangeOrder order = new ExchangeOrder();
// 判断限价输入值是否小于零
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
// 判断数量小于零
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
// 根据交易对名称(symbol)获取交易对儿信息
ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
if (exchangeCoin == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
if (exchangeCoin.getEnable() != 1 || exchangeCoin.getExchangeable() != 1) {
return MessageResult.error(500, msService.getMessage("COIN_FORBIDDEN"));
}
// 获取基准币
String baseCoin = exchangeCoin.getBaseSymbol();
// 获取交易币
String exCoin = exchangeCoin.getCoinSymbol();
Coin coin;
// 根据交易方向查询币种信息
if (direction == ExchangeOrderDirection.SELL) {
coin = coinService.findByUnit(exCoin);
} else {
coin = coinService.findByUnit(baseCoin);
}
if (coin == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
// 设置价格精度
price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 委托数量和精度控制
if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 最小成交额控制
if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
return MessageResult.error(500, "成交额至少为" + exchangeCoin.getMinTurnover());
}
} else {
amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
// 成交量范围控制
if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
}
if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
}
}
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
if (baseCoinWallet == null || exCoinWallet == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
}
// 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
return MessageResult.error(500, "不能低于最低限价: " + exchangeCoin.getMinSellPrice());
}
// 如果有最高买价限制,出价不能高于此价,且禁止市场价格买
if (direction == ExchangeOrderDirection.BUY && exchangeCoin.getMaxBuyPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMaxBuyPrice()) > 0) || type == ExchangeOrderType.MARKET_PRICE)) {
return MessageResult.error(500, "不能高于最高限价:" + exchangeCoin.getMaxBuyPrice());
}
// 查看是否启用市价买卖
if (type == ExchangeOrderType.MARKET_PRICE) {
if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, "不支持市价购买");
} else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, "不支持市价出售");
}
}
// 限制委托数量
if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(member.getId(), symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
return MessageResult.error(500, "超过最大挂单数量 " + exchangeCoin.getMaxTradingOrder());
}
// 抢购模式活动订单限制(用户无法在活动前下买单)
// 当前时间戳
long currentTime = Calendar.getInstance().getTimeInMillis();
// 抢购模式下,无法在活动开始前下买单,仅限于管理员下卖单
if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.QIANGGOU) {
// 抢购模式订单
try {
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
if (direction == ExchangeOrderDirection.BUY) {
// 抢购未开始
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
return MessageResult.error(500, "活动尚未开始");
}
} else {
// 此处2是管理员用户的ID
if (member.getId() != 2) {
return MessageResult.error(500, "活动开始前无法下单");
}
}
} else {
// 活动进行期间,无法下卖单 + 无法下市价单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
if (direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, "无法下卖单");
}
if (type == ExchangeOrderType.MARKET_PRICE) {
return MessageResult.error(500, "活动期间无法下市价单");
}
} else {
// 清盘期间,无法下单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
return MessageResult.error(500, "清盘期间无法下单");
}
}
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, "未知错误:9000");
}
}
// 分摊模式活动订单限制(开始前任何人无法下单)
if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.FENTAN) {
try {
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
// 活动开始前无法下单
return MessageResult.error(500, "活动尚未开始");
} else {
// 活动开始后且在结束前,无法下卖单 + 下单金额必须符合规定
if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
if (direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, "活动进行期间无法下卖单");
} else {
if (type == ExchangeOrderType.MARKET_PRICE) {
return MessageResult.error(500, "活动期间无法下市价单");
} else {
if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
return MessageResult.error(500, "下单价格必须为:" + exchangeCoin.getPublishPrice());
}
}
}
} else {
// 清盘期间,普通用户无法下单,仅有管理员用户ID可下单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
// 此处2和10001是管理员用户的ID
if (member.getId() != 2 && member.getId() != 10001) {
return MessageResult.error(500, "清盘期间无法下单");
} else {
if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
return MessageResult.error(500, "下单价格必须为:" + exchangeCoin.getPublishPrice());
}
if (direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, "清盘期间无法下买单");
}
}
}
}
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, "未知错误:9001");
}
}
order.setMemberId(member.getId());
order.setSymbol(symbol);
order.setBaseSymbol(baseCoin);
order.setCoinSymbol(exCoin);
order.setType(type);
order.setDirection(direction);
if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
order.setPrice(BigDecimal.ZERO);
} else {
order.setPrice(price);
}
order.setUseDiscount("0");
// 限价买入单时amount为用户设置的总成交额
order.setAmount(amount);
MessageResult mr = orderService.addOrder(member.getId(), order);
if (mr.getCode() != 0) {
return MessageResult.error(500, "提交订单失败:" + mr.getMessage());
}
log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
MessageResult result = MessageResult.success("success");
result.setData(order.getOrderId());
return result;
}
/**
* 行情机器人专用:添加委托订单
* @param authMember
* @param direction
* @param symbol
* @param price
* @param amount
* @param type
* usedisCount 暂时不用
* @return
*/
@RequestMapping("mockaddydhdnskd")
public MessageResult addOrderMock(Long uid, String sign, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
// int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
// ValueOperations valueOperations = redisTemplate.opsForValue();
if (direction == null || type == null) {
return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
}
/*
Member member=memberService.findOne(uid);
if(member.getMemberLevel()== MemberLevelEnum.GENERAL){
return MessageResult.error(500,"请先进行实名认证");
}
*/
if (uid != 1 && uid != 10001) {
return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
}
if (!sign.equals("987654321asdf")) {
return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
}
/*
//是否被禁止交易
if(member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)){
return MessageResult.error(500,msService.getMessage("CANNOT_TRADE"));
}
*/
ExchangeOrder order = new ExchangeOrder();
// 判断限价输入值是否小于零
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
// 判断数量小于零
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
// 根据交易对名称(symbol)获取交易对儿信息
ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
if (exchangeCoin == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
if (exchangeCoin.getEnable() != 1 || exchangeCoin.getExchangeable() != 1) {
return MessageResult.error(500, msService.getMessage("COIN_FORBIDDEN"));
}
// 获取基准币
String baseCoin = exchangeCoin.getBaseSymbol();
// 获取交易币
String exCoin = exchangeCoin.getCoinSymbol();
Coin coin;
// 根据交易方向查询币种信息
if (direction == ExchangeOrderDirection.SELL) {
coin = coinService.findByUnit(exCoin);
} else {
coin = coinService.findByUnit(baseCoin);
}
if (coin == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
// 设置价格精度
price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 委托数量和精度控制
if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
// 最小成交额控制
if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
return MessageResult.error(500, "成交额至少为" + exchangeCoin.getMinTurnover());
}
} else {
amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
// 成交量范围控制
if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
}
if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
}
}
if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
}
/*
MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
if (baseCoinWallet == null || exCoinWallet == null) {
return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
}
if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
}
*/
// 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
}
// 如果有最高买价限制,出价不能高于此价,且禁止市场价格买
if (direction == ExchangeOrderDirection.BUY && exchangeCoin.getMaxBuyPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMaxBuyPrice()) > 0) || type == ExchangeOrderType.MARKET_PRICE)) {
return MessageResult.error(500, "价格不能高于最高限价!");
}
// 查看是否启用市价买卖
if (type == ExchangeOrderType.MARKET_PRICE) {
if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, "不支持市价购买");
} else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, "不支持市价出售");
}
}
/*
//限制委托数量
if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(uid, symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
return MessageResult.error(500, "超过最大挂单数量 " + exchangeCoin.getMaxTradingOrder());
}
*/
// 抢购模式活动订单限制(用户无法在活动前下买单)
// 当前时间戳
long currentTime = Calendar.getInstance().getTimeInMillis();
// 抢购模式下,无法在活动开始前下买单,仅限于管理员下卖单
if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.QIANGGOU) {
// 抢购模式订单
try {
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
if (direction == ExchangeOrderDirection.BUY) {
// 抢购未开始
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
return MessageResult.error(500, "活动尚未开始");
}
} else {
// 此处2是管理员用户的ID
if (uid != 2 && uid != 1 && uid != 10001) {
return MessageResult.error(500, "活动开始前无法下单");
}
}
} else {
// 活动进行期间,无法下卖单 + 无法下市价单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
if (direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, "无法下卖单");
}
if (type == ExchangeOrderType.MARKET_PRICE) {
return MessageResult.error(500, "活动期间无法下市价单");
}
} else {
// 清盘期间,无法下单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
return MessageResult.error(500, "清盘期间无法下单");
}
}
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, "未知错误:9000");
}
}
// 分摊模式活动订单限制(开始前任何人无法下单)
if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.FENTAN) {
try {
if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
// 活动开始前无法下单
return MessageResult.error(500, "活动尚未开始");
} else {
// 活动开始后且在结束前,无法下卖单 + 下单金额必须符合规定
if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
if (direction == ExchangeOrderDirection.SELL) {
return MessageResult.error(500, "活动进行期间无法下卖单");
} else {
if (type == ExchangeOrderType.MARKET_PRICE) {
return MessageResult.error(500, "活动期间无法下市价单");
} else {
if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
return MessageResult.error(500, "下单价格必须为:" + exchangeCoin.getPublishPrice());
}
}
}
} else {
// 清盘期间,普通用户无法下单,仅有管理员用户ID可下单
if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
// 此处2是超级管理员用户的ID
if (uid != 2 && uid != 1 && uid != 10001) {
return MessageResult.error(500, "清盘期间无法下单");
} else {
if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
return MessageResult.error(500, "下单价格必须为:" + exchangeCoin.getPublishPrice());
}
if (direction == ExchangeOrderDirection.BUY) {
return MessageResult.error(500, "清盘期间无法下买单");
}
}
}
}
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, "未知错误:9001");
}
}
order.setMemberId(uid);
order.setSymbol(symbol);
order.setBaseSymbol(baseCoin);
order.setCoinSymbol(exCoin);
order.setType(type);
order.setDirection(direction);
if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
order.setPrice(BigDecimal.ZERO);
} else {
order.setPrice(price);
}
order.setUseDiscount("0");
// 限价买入单时amount为用户设置的总成交额
order.setAmount(amount);
MessageResult mr = orderService.addOrder(uid, order);
if (mr.getCode() != 0) {
return MessageResult.error(500, "提交订单失败:" + mr.getMessage());
}
log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
MessageResult result = MessageResult.success("success");
result.setData(order.getOrderId());
return result;
}
/**
* 历史委托
*/
@RequestMapping("history")
public Page<ExchangeOrder> historyOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
Page<ExchangeOrder> page = orderService.findHistory(member.getId(), symbol, pageNo, pageSize);
/*
page.getContent().forEach(exchangeOrder -> {
//获取交易成交详情
exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
});
*/
return page;
}
/**
* 个人中心历史委托
*/
@RequestMapping("personal/history")
public Page<ExchangeOrder> personalHistoryOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "status", required = false) ExchangeOrderStatus status, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
Page<ExchangeOrder> page = orderService.findPersonalHistory(member.getId(), symbol, type, status, startTime, endTime, direction, pageNo, pageSize);
/*
page.getContent().forEach(exchangeOrder -> {
//获取交易成交详情
exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
});
*/
return page;
}
/**
* 个人中心当前委托
* @param member
* @param symbol
* @param type
* @param startTime
* @param endTime
* @param pageNo
* @param pageSize
* @return
*/
@RequestMapping("personal/current")
public Page<ExchangeOrder> personalCurrentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
Page<ExchangeOrder> page = orderService.findPersonalCurrent(member.getId(), symbol, type, startTime, endTime, direction, pageNo, pageSize);
page.getContent().forEach(exchangeOrder -> {
// 获取交易成交详情
BigDecimal tradedAmount = BigDecimal.ZERO;
BigDecimal turnover = BigDecimal.ZERO;
List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
exchangeOrder.setDetail(details);
for (ExchangeOrderDetail trade : details) {
tradedAmount = tradedAmount.add(trade.getAmount());
turnover = turnover.add(trade.getTurnover());
}
exchangeOrder.setTradedAmount(tradedAmount);
exchangeOrder.setTurnover(turnover);
});
return page;
}
/**
* 当前委托
*
* @param member
* @param pageNo
* @param pageSize
* @return
*/
@RequestMapping("current")
public Page<ExchangeOrder> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
Page<ExchangeOrder> page = orderService.findCurrent(member.getId(), symbol, pageNo, pageSize);
page.getContent().forEach(exchangeOrder -> {
// 获取交易成交详情
BigDecimal tradedAmount = BigDecimal.ZERO;
BigDecimal turnover = BigDecimal.ZERO;
List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
exchangeOrder.setDetail(details);
for (ExchangeOrderDetail trade : details) {
tradedAmount = tradedAmount.add(trade.getAmount());
turnover = turnover.add(trade.getTurnover());
}
exchangeOrder.setTradedAmount(tradedAmount);
exchangeOrder.setTurnover(turnover);
});
return page;
}
/**
* 行情机器人专用:当前委托
* @param member
* @param orderId
* @return
*/
@RequestMapping("mockcurrentydhdnskd")
public Page<ExchangeOrder> currentOrderMock(Long uid, String sign, String symbol, int pageNo, int pageSize) {
if (uid != 1 && uid != 10001) {
return null;
}
if (!sign.equals("987654321asdf")) {
return null;
}
Page<ExchangeOrder> page = orderService.findCurrent(uid, symbol, pageNo, pageSize);
/*
page.getContent().forEach(exchangeOrder -> {
//获取交易成交详情(机器人无需获取详情)
BigDecimal tradedAmount = BigDecimal.ZERO;
List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
exchangeOrder.setDetail(details);
for (ExchangeOrderDetail trade : details) {
tradedAmount = tradedAmount.add(trade.getAmount());
}
exchangeOrder.setTradedAmount(tradedAmount);
});
*/
return page;
}
/**
* 行情机器人专用:交易取消委托
* @param member
* @param orderId
* @return
*/
@RequestMapping("mockcancelydhdnskd")
public MessageResult cancelOrdermock(Long uid, String sign, String orderId) {
ExchangeOrder order = orderService.findOne(orderId);
if (uid != 1 && uid != 10001) {
return MessageResult.error(500, "禁止操作");
}
if (!sign.equals("987654321asdf")) {
return MessageResult.error(500, "禁止操作");
}
if (order.getStatus() != ExchangeOrderStatus.TRADING) {
return MessageResult.error(500, "订单状态错误(已成交或已撤销)");
}
// 活动清盘期间,无法撤销订单
ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(order.getSymbol());
if (exchangeCoin.getPublishType() != ExchangeCoinPublishType.NONE) {
// 当前时间戳
long currentTime = Calendar.getInstance().getTimeInMillis();
try {
// 处在活动结束时间与清盘结束时间之间
if (currentTime > dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime() && currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
return MessageResult.error(500, "盘整期间无法撤销订单");
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, "未知错误:9003");
}
}
if (isExchangeOrderExist(order)) {
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
} else {
// 强制取消
orderService.forceCancelOrder(order);
}
return MessageResult.success("success");
}
/**
* 查询委托成交明细
*
* @param member
* @param orderId
* @return
*/
@RequestMapping("detail/{orderId}")
public List<ExchangeOrderDetail> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
return exchangeOrderDetailService.findAllByOrderId(orderId);
}
/**
* 取消委托
* @param member
* @param orderId
* @return
*/
@RequestMapping("cancel/{orderId}")
public MessageResult cancelOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
ExchangeOrder order = orderService.findOne(orderId);
if (order.getMemberId() != member.getId()) {
return MessageResult.error(500, "禁止操作");
}
if (order.getStatus() != ExchangeOrderStatus.TRADING) {
return MessageResult.error(500, "订单状态错误(已成交或已撤销)");
}
// 活动清盘期间,无法撤销订单
ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(order.getSymbol());
if (exchangeCoin.getPublishType() != ExchangeCoinPublishType.NONE) {
// 当前时间戳
long currentTime = Calendar.getInstance().getTimeInMillis();
try {
// 处在活动结束时间与清盘结束时间之间
if (currentTime > dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime() && currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
return MessageResult.error(500, "盘整期间无法撤销订单");
}
} catch (ParseException e) {
e.printStackTrace();
return MessageResult.error(500, "未知错误:9003");
}
}
if (isExchangeOrderExist(order)) {
if (maxCancelTimes > 0 && orderService.findTodayOrderCancelTimes(member.getId(), order.getSymbol()) >= maxCancelTimes) {
return MessageResult.error(500, "你今天已经取消了 " + maxCancelTimes + " 次");
}
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
} else {
// 强制取消
orderService.forceCancelOrder(order);
}
return MessageResult.success("success");
}
/**
* 查找撮合交易器中订单是否存在
* @param order
* @return
*/
public boolean isExchangeOrderExist(ExchangeOrder order) {
try {
String serviceName = "SERVICE-EXCHANGE-TRADE";
String url = "http://" + serviceName + "/monitor/order?symbol=" + order.getSymbol() + "&orderId=" + order.getOrderId() + "&direction=" + order.getDirection() + "&type=" + order.getType();
ResponseEnreplacedy<ExchangeOrder> result = restTemplate.getForEnreplacedy(url, ExchangeOrder.clreplaced);
return result != null;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 获取下单时间限制
* @return
*/
@GetMapping("/time_limit")
public MessageResult userAddExchangeTimeLimit() {
MessageResult mr = new MessageResult();
mr.setCode(0);
mr.setMessage("success");
mr.setData(SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME);
return mr;
}
}
19
View Source File : ExchangeOrderController.java
License : Apache License 2.0
Project Creator : jammy928
License : Apache License 2.0
Project Creator : jammy928
/**
* @author Shaoxianjun
* @description
* @date 2019/1/31 10:52
*/
@RestController
@RequestMapping("exchange/exchange-order")
public clreplaced ExchangeOrderController extends BaseAdminController {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@Autowired
private ExchangeOrderService exchangeOrderService;
@Autowired
private LocaleMessageSourceService messageSource;
@RequiresPermissions("exchange:exchange-order:all")
@PostMapping("all")
@AccessLog(module = AdminModule.EXCHANGE, operation = "查找所有exchangeOrder")
public MessageResult all() {
List<ExchangeOrder> exchangeOrderList = exchangeOrderService.findAll();
if (exchangeOrderList != null && exchangeOrderList.size() > 0) {
return success(exchangeOrderList);
}
return error(messageSource.getMessage("NO_DATA"));
}
@RequiresPermissions("exchange:exchange-order:detail")
@PostMapping("detail")
@AccessLog(module = AdminModule.EXCHANGE, operation = "exchangeOrder详情")
public MessageResult detail(String id) {
List<ExchangeOrderDetail> one = exchangeOrderService.getAggregation(id);
if (one == null) {
return error(messageSource.getMessage("NO_DATA"));
}
return success(one);
}
@RequiresPermissions("exchange:exchange-order:page-query")
@PostMapping("page-query")
@AccessLog(module = AdminModule.EXCHANGE, operation = "分页查找exchangeOrder")
public MessageResult page(PageModel pageModel, ExchangeOrderScreen screen) {
if (pageModel.getDirection() == null && pageModel.getProperty() == null) {
ArrayList<Sort.Direction> directions = new ArrayList<>();
directions.add(Sort.Direction.DESC);
pageModel.setDirection(directions);
List<String> property = new ArrayList<>();
property.add("time");
pageModel.setProperty(property);
}
// 获取查询条件
Predicate predicate = getPredicate(screen);
Page<ExchangeOrder> all = exchangeOrderService.findAll(predicate, pageModel.getPageable());
return success(all);
}
private Predicate getPredicate(ExchangeOrderScreen screen) {
ArrayList<BooleanExpression> booleanExpressions = new ArrayList<>();
QExchangeOrder qExchangeOrder = QExchangeOrder.exchangeOrder;
if (screen.getOrderDirection() != null) {
booleanExpressions.add(qExchangeOrder.direction.eq(screen.getOrderDirection()));
}
if (StringUtils.isNotEmpty(screen.getOrderId())) {
booleanExpressions.add(qExchangeOrder.orderId.eq(screen.getOrderId()));
}
if (screen.getMemberId() != null) {
booleanExpressions.add(qExchangeOrder.memberId.eq(screen.getMemberId()));
}
if (screen.getType() != null) {
booleanExpressions.add(qExchangeOrder.type.eq(screen.getType()));
}
if (StringUtils.isNotBlank(screen.getCoinSymbol())) {
booleanExpressions.add(qExchangeOrder.coinSymbol.equalsIgnoreCase(screen.getCoinSymbol()));
}
if (StringUtils.isNotBlank(screen.getBaseSymbol())) {
booleanExpressions.add(qExchangeOrder.baseSymbol.equalsIgnoreCase(screen.getBaseSymbol()));
}
if (screen.getStatus() != null) {
booleanExpressions.add(qExchangeOrder.status.eq(screen.getStatus()));
}
if (screen.getMinPrice() != null) {
booleanExpressions.add(qExchangeOrder.price.goe(screen.getMinPrice()));
}
if (screen.getMaxPrice() != null) {
booleanExpressions.add(qExchangeOrder.price.loe(screen.getMaxPrice()));
}
if (screen.getMinTradeAmount() != null) {
booleanExpressions.add(qExchangeOrder.tradedAmount.goe(screen.getMinTradeAmount()));
}
if (screen.getMaxTradeAmount() != null) {
booleanExpressions.add(qExchangeOrder.tradedAmount.loe(screen.getMaxTradeAmount()));
}
if (screen.getMinTurnOver() != null) {
booleanExpressions.add(qExchangeOrder.turnover.goe(screen.getMinTurnOver()));
}
if (screen.getMaxTurnOver() != null) {
booleanExpressions.add(qExchangeOrder.turnover.loe(screen.getMaxTurnOver()));
}
if (screen.getRobotOrder() != null && screen.getRobotOrder() == 1) {
// 不看机器人(不包含机器人)
booleanExpressions.add(qExchangeOrder.memberId.notIn(1, 2, 10001));
// booleanExpressions.add(qExchangeOrder.memberId.notIn(69296 , 52350));
}
if (screen.getRobotOrder() != null && screen.getRobotOrder() == 0) {
// 查看机器人
booleanExpressions.add(qExchangeOrder.memberId.in(1, 2, 10001));
// booleanExpressions.add(qExchangeOrder.memberId.in(69296 , 52350));
}
if (screen.getCompleted() != null) /**
* 委托订单
*/
{
if (screen.getCompleted() == BooleanEnum.IS_FALSE) {
booleanExpressions.add(qExchangeOrder.completedTime.isNull().and(qExchangeOrder.canceledTime.isNull()).and(qExchangeOrder.status.eq(ExchangeOrderStatus.TRADING)));
} else {
/**
* 历史订单
*/
booleanExpressions.add(qExchangeOrder.completedTime.isNotNull().or(qExchangeOrder.canceledTime.isNotNull()).or(qExchangeOrder.status.ne(ExchangeOrderStatus.TRADING)));
}
}
return PredicateUtils.getPredicate(booleanExpressions);
}
@RequiresPermissions("exchange:exchange-order:entrust-details")
@PostMapping("entrust-details")
public MessageResult entrustDetails(ExchangeTradeScreen screen, PageModel pageModel) {
/* ExchangeOrder
StringBuilder headSql = new StringBuilder("select orderId as IF(a.direction=0,buyOrderId,sellOrderId)");
StringBuilder headCount = new StringBuilder("select count(*) ");*/
return null;
}
@RequiresPermissions("exchange:exchange-order:out-excel")
@GetMapping("out-excel")
@AccessLog(module = AdminModule.EXCHANGE, operation = "导出 exchangeOrder Excel")
public MessageResult outExcel(@RequestParam(value = "memberId") Long memberId, @RequestParam(value = "type") ExchangeOrderType type, @RequestParam(value = "symbol") String symbol, @RequestParam(value = "status") ExchangeOrderStatus status, @RequestParam(value = "direction") ExchangeOrderDirection direction, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 获取查询条件
List<Predicate> predicates = getPredicates(memberId, type, symbol, status, direction);
List list = exchangeOrderService.queryWhereOrPage(predicates, null, null).getContent();
return new FileUtil().exportExcel(request, response, list, "order");
}
// 查询条件的获取
public List<Predicate> getPredicates(Long memberId, ExchangeOrderType type, String symbol, ExchangeOrderStatus status, ExchangeOrderDirection direction) {
ArrayList<Predicate> predicates = new ArrayList<>();
QExchangeOrder qExchangeOrder = QExchangeOrder.exchangeOrder;
// predicates.add(qExchangeOrder.symbol.eq(QExchangeCoin.exchangeCoin.symbol));
if (memberId != null) {
predicates.add(qExchangeOrder.memberId.eq(memberId));
}
if (type != null) {
predicates.add(qExchangeOrder.type.eq(type));
}
if (symbol != null) {
predicates.add(qExchangeOrder.symbol.eq(symbol));
}
if (status != null) {
predicates.add(qExchangeOrder.status.eq(status));
}
if (direction != null) {
predicates.add(qExchangeOrder.direction.eq(direction));
}
return predicates;
}
@RequiresPermissions("exchange:exchange-order:cancel")
@PostMapping("cancel")
@AccessLog(module = AdminModule.EXCHANGE, operation = "取消委托")
public MessageResult cancelOrder(String orderId) {
ExchangeOrder order = exchangeOrderService.findOne(orderId);
if (order.getStatus() != ExchangeOrderStatus.TRADING) {
return MessageResult.error(500, "order not in trading");
}
// 发送消息至Exchange系统
kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
return MessageResult.success(messageSource.getMessage("SUCCESS"));
}
}
19
View Source File : ProucerController.java
License : Apache License 2.0
Project Creator : huifer
License : Apache License 2.0
Project Creator : huifer
/**
* <p>replacedle : ProucerController </p>
* <p>Description : </p>
*
* @author huifer
* @date 2019-06-19
*/
@RestController
public clreplaced ProucerController {
@Autowired
private KafkaTemplate kafkaTemplate;
@GetMapping("/test")
public String sendMsg() {
kafkaTemplate.send("hello-spring-boot-kafka", "hello");
return "ok";
}
}
19
View Source File : KafkaSenderImpl.java
License : GNU Affero General Public License v3.0
Project Creator : HermesGermany
License : GNU Affero General Public License v3.0
Project Creator : HermesGermany
/**
* Wraps a KafkaTemplate to make concatenated Futures Thread-safe.
*
* @author AlbrechtFlo
*/
public clreplaced KafkaSenderImpl implements KafkaSender {
private KafkaTemplate<String, String> kafkaTemplate;
private KafkaFutureDecoupler futureDecoupler;
public KafkaSenderImpl(KafkaTemplate<String, String> template, KafkaFutureDecoupler futureDecoupler) {
this.kafkaTemplate = template;
this.futureDecoupler = futureDecoupler;
}
@Override
public CompletableFuture<Void> send(String topic, String key, String message) {
return futureDecoupler.toCompletableFuture(kafkaTemplate.send(new ProducerRecord<>(topic, key, message))).thenApply(o -> null);
}
}
19
View Source File : KafkaAnnotationDrivenConfiguration.java
License : Apache License 2.0
Project Creator : hello-shf
License : Apache License 2.0
Project Creator : hello-shf
/**
* Configuration for Kafka annotation-driven support.
*
* @author Gary Russell
* @author Eddú Meléndez
* @since 1.5.0
*/
@Configuration
@ConditionalOnClreplaced(EnableKafka.clreplaced)
clreplaced KafkaAnnotationDrivenConfiguration {
private final KafkaProperties properties;
private final RecordMessageConverter messageConverter;
private final KafkaTemplate<Object, Object> kafkaTemplate;
KafkaAnnotationDrivenConfiguration(KafkaProperties properties, ObjectProvider<RecordMessageConverter> messageConverter, ObjectProvider<KafkaTemplate<Object, Object>> kafkaTemplate) {
this.properties = properties;
this.messageConverter = messageConverter.getIfUnique();
this.kafkaTemplate = kafkaTemplate.getIfUnique();
}
@Bean
@ConditionalOnMissingBean
public ConcurrentKafkaListenerContainerFactoryConfigurer kafkaListenerContainerFactoryConfigurer() {
ConcurrentKafkaListenerContainerFactoryConfigurer configurer = new ConcurrentKafkaListenerContainerFactoryConfigurer();
configurer.setKafkaProperties(this.properties);
configurer.setMessageConverter(this.messageConverter);
configurer.setReplyTemplate(this.kafkaTemplate);
return configurer;
}
@Bean
@ConditionalOnMissingBean(name = "kafkaListenerContainerFactory")
public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(ConcurrentKafkaListenerContainerFactoryConfigurer configurer, ConsumerFactory<Object, Object> kafkaConsumerFactory) {
ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
configurer.configure(factory, kafkaConsumerFactory);
return factory;
}
@Configuration
@EnableKafka
@ConditionalOnMissingBean(name = KafkaListenerConfigUtils.KAFKA_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)
protected static clreplaced EnableKafkaConfiguration {
}
}
19
View Source File : ConcurrentKafkaListenerContainerFactoryConfigurer.java
License : Apache License 2.0
Project Creator : hello-shf
License : Apache License 2.0
Project Creator : hello-shf
/**
* Configure {@link ConcurrentKafkaListenerContainerFactory} with sensible defaults.
*
* @author Gary Russell
* @author Eddú Meléndez
* @since 1.5.0
*/
public clreplaced ConcurrentKafkaListenerContainerFactoryConfigurer {
private KafkaProperties properties;
private RecordMessageConverter messageConverter;
private KafkaTemplate<Object, Object> replyTemplate;
/**
* Set the {@link KafkaProperties} to use.
*
* @param properties the properties
*/
void setKafkaProperties(KafkaProperties properties) {
this.properties = properties;
}
/**
* Set the {@link RecordMessageConverter} to use.
*
* @param messageConverter the message converter
*/
void setMessageConverter(RecordMessageConverter messageConverter) {
this.messageConverter = messageConverter;
}
/**
* Set the {@link KafkaTemplate} to use to send replies.
*
* @param replyTemplate the reply template
*/
void setReplyTemplate(KafkaTemplate<Object, Object> replyTemplate) {
this.replyTemplate = replyTemplate;
}
/**
* Configure the specified Kafka listener container factory. The factory can be
* further tuned and default settings can be overridden.
*
* @param listenerFactory the {@link ConcurrentKafkaListenerContainerFactory} instance
* to configure
* @param consumerFactory the {@link ConsumerFactory} to use
*/
public void configure(ConcurrentKafkaListenerContainerFactory<Object, Object> listenerFactory, ConsumerFactory<Object, Object> consumerFactory) {
listenerFactory.setConsumerFactory(consumerFactory);
configureListenerFactory(listenerFactory);
configureContainer(listenerFactory.getContainerProperties());
}
private void configureListenerFactory(ConcurrentKafkaListenerContainerFactory<Object, Object> factory) {
PropertyMapper map = PropertyMapper.get();
Listener properties = this.properties.getListener();
map.from(properties::getConcurrency).whenNonNull().to(factory::setConcurrency);
map.from(() -> this.messageConverter).whenNonNull().to(factory::setMessageConverter);
map.from(() -> this.replyTemplate).whenNonNull().to(factory::setReplyTemplate);
map.from(properties::getType).whenEqualTo(Listener.Type.BATCH).toCall(() -> factory.setBatchListener(true));
}
private void configureContainer(ContainerProperties container) {
PropertyMapper map = PropertyMapper.get();
Listener properties = this.properties.getListener();
map.from(properties::getAckMode).whenNonNull().to(container::setAckMode);
map.from(properties::getClientId).whenNonNull().to(container::setClientId);
map.from(properties::getAckCount).whenNonNull().to(container::setAckCount);
map.from(properties::getAckTime).whenNonNull().as(Duration::toMillis).to(container::setAckTime);
map.from(properties::getPollTimeout).whenNonNull().as(Duration::toMillis).to(container::setPollTimeout);
map.from(properties::getNoPollThreshold).whenNonNull().to(container::setNoPollThreshold);
map.from(properties::getIdleEventInterval).whenNonNull().as(Duration::toMillis).to(container::setIdleEventInterval);
map.from(properties::getMonitorInterval).whenNonNull().as(Duration::getSeconds).as(Number::intValue).to(container::setMonitorInterval);
map.from(properties::getLogContainerConfig).whenNonNull().to(container::setLogContainerConfig);
}
}
19
View Source File : KafkaOrderMessagingService.java
License : Apache License 2.0
Project Creator : habuma
License : Apache License 2.0
Project Creator : habuma
@Service
public clreplaced KafkaOrderMessagingService implements OrderMessagingService {
private KafkaTemplate<String, Order> kafkaTemplate;
@Autowired
public KafkaOrderMessagingService(KafkaTemplate<String, Order> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
@Override
public void sendOrder(Order order) {
kafkaTemplate.send("tacocloud.orders.topic", order);
}
}
19
View Source File : SampleService.java
License : MIT License
Project Creator : gexiangdong
License : MIT License
Project Creator : gexiangdong
@Service
public clreplaced SampleService {
private static final Log log = LogFactory.getLog(SampleService.clreplaced);
private final KafkaTemplate<String, Object> kafkaTemplate;
@Autowired
public SampleService(KafkaTemplate<?, ?> kt) {
this.kafkaTemplate = (KafkaTemplate<String, Object>) kt;
}
/**
* 每10秒执行一次,往kafka服务器发送消息
*/
@Scheduled(fixedRate = 10000)
public void autoSendMessage() {
if (log.isTraceEnabled()) {
log.trace("即将发送消息到datetime-topic.");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");
String d = sdf.format(new Date());
kafkaTemplate.send("datetime-topic", sdf.format(new Date()));
}
}
19
View Source File : Publisher.java
License : Apache License 2.0
Project Creator : garyrussell
License : Apache License 2.0
Project Creator : garyrussell
/**
* @author Gary Russell
* @since 5.1
*/
public clreplaced Publisher implements ApplicationRunner {
private final String topic;
@Autowired
private KafkaTemplate<byte[], byte[]> template;
public Publisher(String topic) {
this.topic = topic;
}
@Override
public void run(ApplicationArguments args) throws Exception {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
while (!line.equals("exit")) {
this.template.send(this.topic, line.getBytes());
line = scanner.nextLine();
}
scanner.close();
}
}
See More Examples