【实习总结】学习经验2

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<Long> 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<String> 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
            <ConcurrentMessageListenerContainer<String, KafkaMsg>> 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);
}

猜你喜欢

转载自blog.csdn.net/kanseu/article/details/123474353