我有一个功能:
<T> T get(Class<T> fetchType) {
...
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我做的事情如下:
String x = get(String.class);
Run Code Online (Sandbox Code Playgroud)
这一切都很好.
但是,在另一个功能:
<R> R otherFunction(R base) {
return get(base.getClass());
}
Run Code Online (Sandbox Code Playgroud)
给我一个错误,因为base.getClass()回报? extends R.
reason: no instance(s) of type variable(s) exist so that capture of ? extends Object conforms to R
inference variable T has incompatible bounds:
equality constraints: capture of ? extends Object upper bounds: Object, R
Run Code Online (Sandbox Code Playgroud)
现在从我的理解,函数get(Class<T> x)返回T,所以当调用时? extends R,可以说是CAP#1,但从get现在返回CAP#1,将其分配给类型 …
我遇到了一个问题,当方法返回时,我的过滤器运行了两次CompletionStage.从RequestMapping(此处)的文档中,它是受支持的返回值.
CompletionStage(由CompletableFuture实现),应用程序使用它在自己选择的单独线程中生成返回值,作为返回Callable的替代方法.
由于项目非常复杂,并且有很多并发代码,因此我创建了一个新的简单的spring-boot项目.这是(唯一的)控制器:
@Controller
public class BaseController {
@RequestMapping("/hello")
@ResponseBody
public CompletionStage<String> world() {
return CompletableFuture.supplyAsync(() -> "Hello World");
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个过滤器:
@WebFilter
@Component
public class GenericLoggingFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
System.out.println(httpServletRequest.getMethod() + " " +
httpServletRequest.getRequestURI());
chain.doFilter(request, response);
}
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时curl http://localhost:8080/hello,它会GET /hello在控制台上打印两次.当我更改控制器方法以返回String:
@RequestMapping("/hello")
@ResponseBody
public String world() {
return …Run Code Online (Sandbox Code Playgroud) 我有一个服务,它在内存中对所有调用进行调度,因为我们不想丢失数据,同时我们需要这个服务因为任何外部依赖(例如DB)而失败.然后定期拾取这些分阶段的呼叫并在后台处理.
如果由于任何原因,如果有太多的电话而且我们的内存耗尽,我们需要警惕.
所以,简单地说,问题是:当资源不足导致列表添加失败时,我需要捕获或监视哪些异常通知我?它会导致VM本身出现OOM,还是有集合级限制?
如果没有收集级别限制,您会如何建议我监控服务的使用情况?目前,我们有堆使用和内存使用指标.那些够用吗?此外,JVM配置为在OOM错误时终止(这是因为VM管理器然后重新启动它在kill上管理的任何进程).
我不确定'难以'是否是正确的词,但这是我面临的问题.我需要花费相当长的时间才能将其重现为最小的示例,所以这里有:
class BaseParameterizedType<T>
fun <U: BaseParameterizedType<*>> getSpecific(clazz: KClass<in U>) : U {
TODO()
}
fun example(arg: KClass<out BaseParameterizedType<*>>)) {
getSpecific(arg.innerType)
}
Run Code Online (Sandbox Code Playgroud)
好的,所以上面的代码在'TODO'失败了,但是如果它不在那里并且函数正常返回,那么它肯定会因空指针异常而失败.我努力弄清楚出了什么问题,所以我转向反编译的Java代码(来自kotlin字节码):
public static final void example(@NotNull KClass arg) {
Intrinsics.checkParameterIsNotNull(arg, "arg");
getSpecific(arg.getInnerType());
throw null; // <-- The problem
}
Run Code Online (Sandbox Code Playgroud)
如果我将函数签名更改getSpecific(clz: KClass<in U>) : U为以下任何一种形式:
getSpecific(clz: KClass<out U>) : UgetSpecific(clz: KClass<U>) : UgetSpecific(clz: KClass<in U>) : BaseParameterizedType<*>甚至是函数example(arg: KClass<out BaseParameterizedType<*>)或者example(arg: KClass<BaseParameterizedType<*>>),然后生成的代码是:
public static final void example(@NotNull KClass arg) {
Intrinsics.checkParameterIsNotNull(arg, "arg");
getSpecific(arg.getInnerType()); …Run Code Online (Sandbox Code Playgroud) 因此,我正在使用ktor并希望通过ThreadLocal. 我正在看的是:
val dataThreadLocal = ThreadLocal<String>()
suspend fun fromOtherFunction() = "From other function -- ${dataThreadLocal.get()}"
routing {
get("/hello") {
// [1]
launch(this.coroutineContext + dataThreadLocal.asContextElement(value = "world")) {
val fromHere = async {
"ThreadLocal value: ${dataThreadLocal.get()}"
}
val fromThere = async {
fromOtherFunction()
}
call.respond(fromHere.await() + "," + fromThere.await())
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在做的是确保从父级launch(标记为 [1])调用的所有函数都可以访问这种“范围内”数据。
但是,我的应用程序非常大,我希望它适用于路由处理的所有请求,并且不希望每个路由都需要这种包装。
真正伟大的是:
intercept(ApplicationCallPipeline.Features) {
launch(this.coroutineContext + dataThreadLocal.asContextElement(value = "world")) {
...
}
}
routing {
get("/hello") {
val threadLocalValue = dataThreadLocal.get() …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的下一个项目设置 IntelliJ 以及 Gradle 和 JOOQ。到目前为止,这就是我的 Gradle 文件的样子:
apply plugin: 'java'
apply plugin: 'jooq'
sourceCompatibility = 1.5
version = '1.0'
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
}
dependencies {
compile 'org.jooq:jooq:3.1.0'
compile 'com.google.guava:guava:14.0'
compile 'postgresql:postgresql:9.1-901-1.jdbc4'
}
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath 'postgresql:postgresql:9.1-901-1.jdbc4'
classpath 'com.github.ben-manes:gradle-jooq-plugin:0.5'
}
}
jooq {
... snip ...
}
Run Code Online (Sandbox Code Playgroud)
这就是我的外部依赖项(在 IntelliJ 中)的显示方式:
.
不知何故,Gradle 正在下载,IntelliJ 将 jooq 和 guava 识别为我的依赖项的一部分,但 postgresql 没有出现。因此,在执行此操作时(使用 Guava,从 Gradle 加载的依赖项): …
在Java中,我们有以下类型的函数:
public Collection<String> removeNulls(Collection<String> input) {
List<String> output = new ArrayList<>();
// ...
return output;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我没有以任何方式修改输入,因为很多时候我们碰巧使用ImmutableListList.更常见的是,我们尽可能地确保函数的不变性.但是,我在这里看到的一个陷阱是,我的所有方法都经常使用自己的实现Collection.如果有人使用我的库正在使用LinkedList或者a Set或者a SortedSet,"查找是O(1)"或"列表总是排序" 这样的假设会在我的列表中调用我的函数时中断:
Set<String> mySet = new SortedSet<>();
mySet.add(10);
mySet.add(9); // I know that my collection is now sorted
Collection<String> myFilteredSet = removeNulls(mySet); // It is no longer sorted
Set<String> mySet = Sets.newSortedSet(myFilteredSet); // Have to sort it again
Run Code Online (Sandbox Code Playgroud)
在a的情况下LinkedList,这变得更加微妙,如果我的函数返回a List,那么我将继续使用该列表.它不会有任何编译时错误,我也不会看到问题.在前一种情况下,问题至少是可见的,因为我仍然必须将返回的Collection(或List)转换为Set,我知道是什么.问题只会在以后出现,如果有一些重要的处理依赖于LinkedList使用.一种理想的方式(但并不意味着"推荐")将是:
public List<String> removeNulls(List<String> input) {
List<String> output …Run Code Online (Sandbox Code Playgroud) 我有一个 Play 项目,可以在我的 MacBook 上正常构建,但在 Ubuntu Server 14 上运行 Jenkins 的远程构建服务器上失败。构建失败,并出现以下错误:
[info] Compiling 7 Scala sources and 120 Java sources to /var/lib/jenkins/jobs/<redacted-projectname>/workspace/target/scala-2.11/classes...
[error] /var/lib/jenkins/jobs/<redacted-projectname>/workspace/conf/routes: routes is already defined as object routes
[error] /var/lib/jenkins/jobs/<redacted-projectname>/workspace/conf/routes: routes is already defined as class routes
[error] two errors found
Run Code Online (Sandbox Code Playgroud)
我的本地计算机上有时也会出现同样的问题,但我只需执行./activator clean( 或sbt clean) 即可正常工作。
Jenkins 构建配置文件是Execute Shell执行以下脚本的指令:
./activator clean dist
Run Code Online (Sandbox Code Playgroud)
我尝试重新创建项目,完全清理目录,但构建仍然失败。任何帮助将不胜感激。
如果我创建一个功能界面:
@FunctionalInterface
public class Consumer2<T1, T2> {
void accept(T1 t1, T2 t2);
default Consumer1<T2> curry(T1 t1) {
return (t2) -> accept(t1, t2);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个班级:
public class MyClass {
public void printStrings(String a, String b) {
System.out.println(a + ": " + b);
}
}
MyClass myClass = new MyClass();
Run Code Online (Sandbox Code Playgroud)
现在,如果我想使用我的功能界面,我可以:
Consumer2<String, String> printString = myClass::printStrings;
printString.curry("hello").accept("world");
Run Code Online (Sandbox Code Playgroud)
但我做不了类似的事情:
myClass::printStrings.curry("hello").accept("world");
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为Java无法知道myClass::printStrings可以应用于功能接口Consumer2.为此,我创建了一个实用程序类:
public class F {
public static <T1, T2> Consumer2<T1, T2> c2(Consumer2<T1, T2> fn) {
return fn;
} …Run Code Online (Sandbox Code Playgroud) 这是我尝试在 PostgreSQL 中运行的查询:
SELECT * FROM message WHERE id IN (
SELECT unnest(message_ids) "mid"
FROM session_messages WHERE session_id = '?' ORDER BY "mid" ASC
);
Run Code Online (Sandbox Code Playgroud)
但是,我无法做某事:
create.selectFrom(Tables.MESSAGE).where(Tables.MESSAGE.ID.in(
create.select(DSL.unnest(..))
Run Code Online (Sandbox Code Playgroud)
因为DSL.unnest是 a Table<?>,这是有道理的,因为它试图获取List类似对象(主要是文字)并将其转换为表。
我有一种感觉,我需要找到一种方法将函数包装在我的字段名称周围,但我不知道如何继续。
笔记。该字段message_ids的类型为bigint[]。
编辑
所以,这就是我现在正在做的事情,它的工作原理与预期完全一样,但我不确定这是否是最好的方法:
Field<Long> unnestMessageIdField = DSL.field(
"unnest(" + SESSION_MESSAGES.MESSAGE_IDS.getName() + ")",
Long.class)
.as("mid");
Field<Long> messageIdField = DSL.field("mid", Long.class);
MESSAGE.ID.in(
ctx.select(messageIdField).from(
ctx.select(unnestMessageIdField)
.from(Tables.CHAT_SESSION_MESSAGES)
.where(Tables.CHAT_SESSION_MESSAGES.SESSION_ID.eq(sessionId))
)
.where(condition)
)
Run Code Online (Sandbox Code Playgroud)
编辑2
在浏览完https://github.com/jOOQ/jOOQ/blob/master/jOOQ/src/main/java/org/jooq/impl/DSL.java上的代码后,我想正确的方法是:
DSL.function("unnest", SQLDataTypes.BIGINT.getArrayType(), SESSION_MESSAGES.MESSAGE_IDS)
Run Code Online (Sandbox Code Playgroud)
编辑3
由于卢卡斯一如既往地在这里解决我的 jOOQ 困境,我将利用这一点:)
尝试以某种签名形式概括此函数
public …Run Code Online (Sandbox Code Playgroud) java ×6
kotlin ×2
collections ×1
generics ×1
gradle ×1
java-8 ×1
jooq ×1
jvm ×1
maven ×1
oop ×1
postgresql ×1
sbt ×1
spring ×1
spring-mvc ×1