以一个官方的例子,开启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 api project:   that contains a service interface through which consumers can interact with the service.
  • An impl project:  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学习 (二)的更多相关文章

  1. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  2. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  3. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  4. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  5. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

  6. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  7. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  8. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  9. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

  10. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

随机推荐

  1. 【Python】Selenium元素定位错误之解决办法

    当使用class定位元素时发现报错: 错误信息:selenium.common.exceptions.InvalidSelectorException: Message: Compound class ...

  2. 模式识别开发之项目---基于opencv的手势识别

    我使用OpenCV2.4.4的windows版本+Qt4.8.3+VS2010的编译器做了一个手势识别的小程序. 本程序主要使到了Opencv的特征训练库和最基本的图像处理的知识,包括肤色检测等等. ...

  3. Eclipse如何删除插件

    删除Eclipse安装的插件方法: help -> install new softWare -> what is already installed ->选中 要卸载的插件 -&g ...

  4. 九度OJ 1081:递推数列 (递归,二分法)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6194 解决:864 题目描述: 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= 2. 求第 ...

  5. 九度OJ 1078:二叉树遍历 (二叉树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3748 解决:2263 题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树 ...

  6. 扩容数据盘_Linux

    扩容数据盘_Linux_扩容云盘_云盘_用户指南_云服务器 ECS-阿里云 https://help.aliyun.com/document_detail/25452.html 磁盘扩容付费后: 在控 ...

  7. python调试利器:最直观简洁的错误日志

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-08-30 17:12:27 # @Author : Sheldon (thi ...

  8. 《高性能Javascript》 Summary(一)

    第一章.加载和执行 Loading & Execution 原因:Javascript 的执行导致页面渲染中止等待. 解决: 将script放在页面底部,紧靠body 闭合标签之前,保证页面在 ...

  9. 【Leetcode-easy】ZigZag Conversion

    思路1:String[numRow]行字符串数组.读取原始字符串每一个字符,设置行变量 nrow和行标志位flag(向下一行为1或向上一行为-1).将该字符连接到数组中对应的行字符串,同时nrow+= ...

  10. redhat5.1上安装oracle 10.2g客户端及配置使用

    一)安装 1.命令 rpm -q gcc make binutils setarch compat-db compat-gcc compat-gcc-c++ compat-libstdc++ comp ...