Lagom学习 (二)
以一个官方的例子,开启lagom的学习之旅。
1: git clone https://github.com/lagom/activator-lagom-java-chirper.git。
2: 下载后进入目录,运行mvn lagom:runAll。

3: 浏览器输入:localhost:9000

4: 模块:
Chirp service: 负责存储聊天,提供存储接口服务。
Friend service: 负责用户存储,管理朋友关系。
Activity Stream service: 为聊天提供流数据的支持,依赖于 Chirp与Friend 服务。
Front-End service: 提供前台用户UI。
5:
- An
apiproject: that contains a service interface through which consumers can interact with the service. - An
implproject: that contains the service implementation.
ActivityStreamService.java
/*
* Copyright (C) 2016 Lightbend Inc. <http://www.lightbend.com>
*/
package sample.chirper.activity.api; import sample.chirper.chirp.api.Chirp; import akka.stream.javadsl.Source; import akka.NotUsed;
import com.lightbend.lagom.javadsl.api.ServiceCall;
import com.lightbend.lagom.javadsl.api.Descriptor;
import com.lightbend.lagom.javadsl.api.Service;
import static com.lightbend.lagom.javadsl.api.Service.*; public interface ActivityStreamService extends Service { ServiceCall<NotUsed, Source<Chirp, ?>> getLiveActivityStream(String userId); ServiceCall<NotUsed, Source<Chirp, ?>> getHistoricalActivityStream(String userId); @Override
default Descriptor descriptor() {
// @formatter:off
return named("activityservice").withCalls(
pathCall("/api/activity/:userId/live", this::getLiveActivityStream),
pathCall("/api/activity/:userId/history", this::getHistoricalActivityStream)
).withAutoAcl(true);
// @formatter:on
}
}
Service interface (ActivityStreamService.java):
- 这个自定义的服务继承自 Service, 并且提供了一个Service.descriptor方法的实现。
Service.descriptor返回Descriptor,定义了服务的名称,并且定义了提供的REST API。- 提供了两个接口:getLiveActivityStream / getHistoricalActivityStream
- 关于 Service descriptor详细信息,https://www.lagomframework.com/documentation/1.4.x/java/ServiceDescriptors.html
Service implementation(ActivityStreamServiceImpl.java)
提供了对ActivityStreamService.java的实现
/*
* Copyright (C) 2016 Lightbend Inc. <http://www.lightbend.com>
*/
package sample.chirper.activity.impl; import akka.NotUsed;
import com.lightbend.lagom.javadsl.api.ServiceCall;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.CompletionStage;
import javax.inject.Inject;
import org.pcollections.PSequence;
import sample.chirper.activity.api.ActivityStreamService;
import sample.chirper.chirp.api.Chirp;
import sample.chirper.chirp.api.ChirpService;
import sample.chirper.chirp.api.HistoricalChirpsRequest;
import sample.chirper.chirp.api.LiveChirpsRequest;
import sample.chirper.friend.api.FriendService; import akka.stream.javadsl.Source; public class ActivityStreamServiceImpl implements ActivityStreamService { private final FriendService friendService;
private final ChirpService chirpService; @Inject
public ActivityStreamServiceImpl(FriendService friendService, ChirpService chirpService) {
this.friendService = friendService;
this.chirpService = chirpService;
} @Override
public ServiceCall<NotUsed, Source<Chirp, ?>> getLiveActivityStream(String userId) {
return req -> {
return friendService.getUser(userId).invoke().thenCompose(user -> {
PSequence<String> userIds = user.friends.plus(userId);
LiveChirpsRequest chirpsReq = new LiveChirpsRequest(userIds);
// Note that this stream will not include changes to friend associates,
// e.g. adding a new friend.
CompletionStage<Source<Chirp, ?>> result = chirpService.getLiveChirps().invoke(chirpsReq);
return result;
});
};
} @Override
public ServiceCall<NotUsed, Source<Chirp, ?>> getHistoricalActivityStream(String userId) {
return req ->
friendService.getUser(userId).invoke().thenCompose(user -> {
PSequence<String> userIds = user.friends.plus(userId);
// FIXME we should use HistoricalActivityStreamReq request parameter
Instant fromTime = Instant.now().minus(Duration.ofDays(7));
HistoricalChirpsRequest chirpsReq = new HistoricalChirpsRequest(fromTime, userIds);
CompletionStage<Source<Chirp, ?>> result = chirpService.getHistoricalChirps().invoke(chirpsReq);
return result;
});
} }
Lagom学习 (二)的更多相关文章
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- SpringCloud学习(二):微服务入门实战项目搭建
一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...
- DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer
DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...
- SpringMVC入门学习(二)
SpringMVC入门学习(二) ssm框架 springMVC 在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...
随机推荐
- Java各类格式转换
1.Java 根据固定格式的Excel生成实体类 2.GPS 经纬度转换为 经过旋转后的平面坐标
- wpf自定义colorpicker
自定义colorpicker <ObjectDataProvider MethodName="GetType" ObjectType="{x:Type system ...
- Windows+VS+SVN实现版本控制
Subversion已经是一个热门话题,下面介绍一下Windows下Subversion和TortoiseSVN构建SVN版本控制 问题. 首先看一些基础知识: Subversion是架设一个SVN ...
- [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- Unix环境高级编程—进程控制(三)
一.解释器文件 解释器文件属于文本文件,起始行形式为: #! pathname[optional-argument] 我们创建一个只有一行的文件如下: #!/home/webber/test/echo ...
- iOS开发常用第三方框架
1.网络通信 1.ASIHTTPRequest 这是一个经典的老库,功能完全而强大,但已经停止更新很久了(iOS5.0停止更新,但是我最近看github上这个项目有新改动).在不同iOS版本上略微有一 ...
- 关于引用WebLogic.jar时遇到NoClassDefFoundError问题的解决方法
前段时间在做一个项目开发时,需要用到weblogic.jndi.WLInitialContextFactory,所以按照以前的经验,将WebLogic.jar添加到Build Path中.可是在执行时 ...
- 序列化组件(get/put/delete接口设计),视图优化组件
一 . 知识点回顾 1 . 混入类 , 多继承 class Animal(object): def eat(self): print("Eat") def walk(self): ...
- php基于swoole扩展的WebSocket
php的swoole的扩展可以实现WebSocket通信,方法如下 1.php添加swoole扩展: 一:两种安装方式:1>编译安装:1>wget http://pecl.php.net/ ...
- 【栈】日志分析(BSOJ2981)
Description M海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志.该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装 ...