*java监听事件有两种方法
1.实现ApplicationListener
2.使用@EventListener注解
原文内容
*如何更新缓存中的数据:如果对实时性要求较高,则在更新操作是对缓存进行更新,若对实时性要求不高,则在更新时如果未命中则更新缓存,若命中了,定时更新即可>>原文内容
*方法A加了事务,方法B没有事务且方法B是private,A调用了B,事务不能进入方法B?
*Java8 Lambda表达式教程
java8合并list
List<JointSalesSolutionRiskVO> result = new LinkedList<>();
jointSalesSolutionsNew.addAll(jointSalesSolutionsOld);
Map<String, List<JointSalesSolutionRiskVO>> mapList = jointSalesSolutionsNew.stream().collect(Collectors.groupingBy(JointSalesSolutionRiskVO::getFormulaGroupCode, Collectors.toList()));
mapList.forEach((K, V) -> {
List<JointSalesSolutionVO> planList = new ArrayList<>();
V.forEach(s -> planList.addAll(s.getJointSalesSolutionVOS()));
JointSalesSolutionRiskVO vo = V.get(0);
vo.setJointSalesSolutionVOS(planList.stream().distinct().sorted(Comparator.comparing(JointSalesSolutionVO::getFormulaCode)).collect(Collectors.toList()));
result.add(vo);
});
java8合并list并合集金额
Map<String, List<User>> users2 = users.stream().collect(Collectors.groupingBy(User::getRiskCode, Collectors.toList()));
List<User> userList = new LinkedList<>();
users2.forEach((k, v) -> {
if (CollectionUtils.isNotEmpty(v)) {
v.stream().reduce((a,b)-> new User(a.getRiskCode(), a.getQuoteAmount() + b.getQuoteAmount())).ifPresent(userList::add);
}
});
*正向代理和反向代理的区别
*线程池工具中的getActiveCount方法获取上一批未结束的线程数,并做相应处理
package com.odianyun.dataex.job.sync;
import java.util.concurrent.*;
public class ThreadTest {
static ThreadPoolExecutor executorService =
new ThreadPoolExecutor(10, 50,//固定最大50个线程个数
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(100), //固定任务个数最大 1000个对象
Executors.defaultThreadFactory(),
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
r.run();
System.out.println("rejectedExecution");
}
});
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
// System.out.println(i);
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100 * Math.round(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
while(executorService.getActiveCount() > 1){
try {
Thread.sleep(1000 * 4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(executorService.getActiveCount());
}
}
}
*java中如何修改事务的隔离级别
如果是Spring管理,则可以通过注解的方式改变事务隔离级别
@Transactional(isolation = Isolation.READ_COMMITTED)
*kafka里面存着消息的数组,offset类似于数组下标。Kafka与其它队列的一个区别是offset是在消费端进行维护,而不是服务端,因此多个消费端可以消费同一个队列里的数据,并自行控制消费位置。
*了解一下Innodb存储引擎,聚簇索引,快照读,当前读,意向锁,间隙锁>>原文
*向下转型即class A和class B,B继承A,A a = new B();如果a中只有方法1,而b中有方法1和方法2,则在编译时会报错,因为b继承a,a中没有方法2。
事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted) 是 是 是
不可重复读(read-committed) 否 是 是
可重复读(repeatable-read) 否 否 是
串行化(serializable) 否 否 否
脏读:在一个事务中读取到另一个事务没有提交的数据
不可重复读:在一个事务中,两次查询的结果不一致(针对的update操作)
虚读(幻读):在一个事务中,两次查询的结果不一致(针对的insert操作)
*NameServer负责维护Producer和Consumer的配置信息,状态信息,并且协调各个角色的协同执行.通过NameServer各个角色可以了解到集群的整体信息,并且他们会定期向NameServer上报状态.
为什么不用zookeeper,zk是apache旗下用于分布式服务协调的开源软件,并且拥有选举机制,能够在master宕机时从slave中通过选举机制选出一天slave变成master.但是在NameServer设计中,MasterBroker中没有一台拥有全部的topic信息,消息分布平均,拾取选举机制意义.其次,NameServer仅仅被用于存储集群的配置信息,元数据信息,不需要太复杂的功能,所以放弃重量级的zk选择轻量级的NameServer.
Broker消息存储,在Broker中存在着两个橘色:CommitLog和ConsumeQueue.
CommitLog:实际存储消息的物理文件
ConsumeQueue:消费队列,队列中存储的是代销费消息的地址偏移量,类似于索引,通过CommitLog和ConsumeQueue相互配合完成消息的存储.
原文内容