1、okhttp
String url="http://www.";
/**
* 发送HTTPS GET请求,处理服务端的响应。
*/
Request request = new Request.Builder().url(url).get().build();
OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();
System.out.println(response.headers().toString());
2、ConcurrentHashMap
多线程增加修改时,不会抛出ConcurrentModificationException,而HashMap会;推荐应用场景 多线程对HashMap数据添加删除操作。
应用:保存session
3、NIO
IO是面向流的,NIO是面向缓冲区的
Java NIO 管道是2个线程之间的单向数据连接。组成:Channel(通道),Buffer(缓冲区), Selector
Channel主要实现有:FileChannel 文件IO、DatagramChannel UDP、SocketChannel TCP Client、ServerSocketChannel TCP Server
Buffer:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
Selector运行单线程处理多个Channel
Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。
4、长连接和短连接
a.长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。
b.短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯
发送接收方式:
a.异步双工:接收和发送在同一个程序中,有两个不同的子进程分别负责发送和接送。
b.异步单工:接送和发送使用两个不同的程序来完成。
c.同步:报文发送和接收是同步进行,发送后等待接送返回报文
5、 Arrays.fill(buff, (byte) 0);
6、sso单点登录
访问应用时,填写完用户名、密码后,完成登录(session状态为yes,浏览器中写入cookie)
有一个应用叫a.com 两个业务系统app1.a.com和app2.a.com SSO登录系统:sso.a.com
cookie不能跨域.
流程:
a.a.com创建令牌token,把令牌放入全局会话session中,同时把令牌放入redis库中
b.a.com携带令牌到客户端:redirectAttributes.addAttribute("ssoToken", ssoToken);
c.app1.a.com子系统判断是否有局部会话/全局会话,校验token有效性,从redis中获取,并记录到该子系统的redis库中
d.app1.a.com子系统设置本域cookie
d.退出登录,退出监听。redis删除令牌
7、sql
(1)数据类型:如果是json较长的用text 短的可以用varchar
8、多线程,事务回滚
service:
@Transactional(transactionManager = "xxTransactionManager", rollbackFor = Exception.class)
dao:
@Bean(name = "xxTransactionManager")
public PlatformTransactionManager transactionManager(
@Autowired @Qualifier("examDataSource") DataSource ds) {
return createTransactionManager(ds);
}
9、mybatis:
a.条件模糊筛选
qw.and(wrapper ->wrapper.likeRight("subject", xxx).or().likeRight("qid", xxx));
b.java8 stream().map().collect()用法
eg:从user这个List中获得身份证id,以往是for循环,现在如下代码:
List ids = list.getRecords().stream().map(UserEntity::getId).collect(Collectors.toList());
c.批量插入
mapper.batchInsert(list);
10、判空
字符串:StringUtils.isEmpty()
list:CollectionUtils.isEmpty
int:==null
11、提交异步任务
a.定义异步任务名
public static final String ASYNC_TASK_XXX = "project1.name";
b.提交任务
timerTaskExecutor.submit(AsyncTaskNames.ASYNC_TASK_XXX,
() -> service.genAudioUrl());
12、map遍历
Iterator key= map.keySet().iterator();
while (key.hasNext()) {
String key= key.next();
String value = map.get(key);
}
12、kafka
(1)配置Kafka
a.注册消费者
//消费者
@Bean("msgKafkaMsgHandler")
public KafkaMsgHandler createKafkaMsgHandler() {
MsgHandleService msgyHandleService = beanFactory.getBean(MsgHandleService.class);
KafkaMsgHandler handler = super.createKafkaMsgHandler(beanFactory);
//注册xxx任务结束后的handler
handler.registerPayloadHandler(XXX.class, msgHandleService::handle);
return handler;
}
//监听消费
@Bean("msgNotifyKafkaListenerCF")
public KafkaListenerContainerFactory
> createKafkaListenerCf(BeanFactory beanFactory) {
return super.createKafkaListenerContainerFactory(beanFactory);
}
}
b.生产者
private KafkaMsgSender kafkaMsgSender;
kafkaMsgSender.send(req, sessionId);
c.消费者的Handle
@Service
@Profile("!local")
public class MsgQueueConsumer {
@Autowired
@Qualifier("msgKafkaMsgHandler")
KafkaMsgHandler kafkaMsgHandler;
@KafkaListener(id = "msgQueueListener",
topics = "${topicName}",
containerFactory = "msgKafkaListenerCF")
public void onMessage(KafkaMsg msg) {
kafkaMsgHandler.handle(msg);
}
public void handle(Req req) {
//业务代码
}
}
13、feign
@FeignClient(value = "xxx-boot")
public interface IApiService {
/**
* 异步获取评分.
*/
@PostMapping(value = "/logan/score")
Resp syncGetScore(@RequestBody Req req);
}