我创建了一个Undertow服务器和一个处理程序来记录请求.我在检索请求体时遇到问题HttpServerExchange.
在LoggingHandler课堂上,我的身体没有问题.但在TestEndpoint身体空洞.
如果我删除了检索请求体的行,LoggingHandler则会填充正文TestEndpoint.
有谁知道这样做的方法?
我的服务器类:
package com.undertow.server;
import com.undertow.server.endpoints.TestEndpoint;
import org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer;
import org.jboss.resteasy.spi.ResteasyDeployment;
import io.undertow.Undertow;
import io.undertow.Undertow.Builder;
import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler;
import io.undertow.server.handlers.BlockingHandler;
import io.undertow.servlet.api.DeploymentInfo;
public class UndertowServer {
private UndertowJaxrsServer server;
public UndertowServer() {
this.server = new UndertowJaxrsServer();
}
public void start() {
Builder builder = Undertow.builder().addHttpListener(8000, "0.0.0.0");
this.server.start(builder);
this.configureEndpoints();
}
private void configureEndpoints() {
ResteasyDeployment deployment = new ResteasyDeployment();
deployment.getActualResourceClasses().add(TestEndpoint.class);
DeploymentInfo deploymentInfo = this.server.undertowDeployment(deployment) //
.setClassLoader(ClassLoader.getSystemClassLoader()).setContextPath("/gateway/") //
.setDeploymentName("gateway.war"); …Run Code Online (Sandbox Code Playgroud) 你好!
我是一名初级 Java 和 Android 开发人员,最近在处理我的应用程序的内存管理方面遇到了麻烦。我将把这篇文章分成几个部分,以使其更清晰易读。
这是一个由几个阶段(级别)组成的游戏。每个阶段都有一个玩家的起点和一个出口,引导玩家进入下一个阶段。每个阶段都有自己的一套障碍。目前,当玩家到达最后阶段(我目前只创建了 4 个)时,他/她会自动回到第一阶段(1 级)。
一个名为GameObject(扩展Android.View)的抽象类定义了玩家和游戏中存在的所有其他对象(障碍物等)的基本结构和行为。所有对象(本质上是视图)都绘制在我创建的自定义视图中(扩展 FrameLayout)。游戏逻辑和游戏循环由一个侧线程(gameThread)处理。这些阶段是通过从 xml 文件中检索元数据来创建的。
除了我的代码中所有可能的内存泄漏(我一直在努力寻找和解决所有这些问题)之外,还有一个与垃圾收集器发生相关的奇怪现象。我将使用图像,而不是用文字来描述它并冒着让您感到困惑的风险。孔子说:“千言万语”。好吧,在这种情况下,我刚刚让您免于阅读 150,000 个单词,因为我下面的 GIF 有 150 帧。
描述:第一张图片代表我的应用程序在第一次加载“stage 1”时的内存使用情况。第二个图像 (GIF) 首先表示第二次加载“阶段 1”时我的应用程序的内存使用时间线(这种情况发生,如前所述,当玩家击败最后一个阶段时),然后是四个强制启动的垃圾收集由我。
您可能已经注意到,这两种情况在内存使用方面存在巨大差异(几乎 50MB)。第一次加载“第一阶段”时,当游戏开始时,应用程序使用 85MB 内存。第二次加载同一个stage的时候,稍晚一点,内存使用量已经是130MB了!这可能是由于我的一些糟糕的编码,因此我不在这里。你有没有注意到,在我强行执行了 2 次(实际上是 4 次,但只有前 2 次重要)垃圾收集之后,内存使用情况又回到了它的“正常状态”(与第一次加载舞台时的内存使用情况相同)?这就是我所说的奇怪现象。
如果垃圾收集器应该从不再被引用的内存对象中删除(或者至少只有弱引用),为什么你在上面看到的“垃圾内存”只有在我强行调用GC和不是关于GC的正常执行?我的意思是,如果我手动启动的垃圾收集可以删除这个“thrash”,那么正常的GC执行也可以删除它。为什么没有发生?
我什至尝试在切换阶段时调用System.gc(),但是,即使垃圾收集发生这种情况,这种“颠簸”内存不会像我手动执行GC那样被删除。我是否遗漏了一些关于垃圾收集器如何工作或 Android 如何实现它的重要信息?
我花了几天时间搜索、研究和修改我的代码,但我找不到为什么会这样。StackOverflow 是我最后的选择。谢谢!
注意:我打算发布一些可能与我的应用程序源代码相关的部分,但由于问题已经太长了,我将在这里停止。如果您觉得需要检查某些代码,请告诉我,我将编辑此问题。
我已经读过: …
下面是我的程序,当我输入相关的月份、日期和年份时,它返回错误的日期名称。
我在这里缺少什么?
我的程序
import java.util.Calendar;
import java.util.Locale;
import java.util.Scanner;
public class TimeTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String month = in.next();
String day = in.next();
String year = in.next();
System.out.println(getDay(day, month, year));
}
private static String getDay(String day, String month, String year) {
Calendar calendar = Calendar.getInstance();
calendar.set(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
return calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
09
24
2018
Wednesday
Run Code Online (Sandbox Code Playgroud)
它应该返回“星期一”,因为那是当天。
我有以下方法调用,其中传递了一个lambda表达式。这里是否隐式实例化了一个类?
printStudents(
roster,
(Student s) -> s.getGender() == Student.Sex.MALE
&& s.getAge() >= 18
&& s.getAge() <= 25
);
Run Code Online (Sandbox Code Playgroud)
方法签名:
printStudents(List<Student> roster, CheckStudent checkstudet)
Run Code Online (Sandbox Code Playgroud)
interface CheckStudent {
boolean test(Student s);
}
Run Code Online (Sandbox Code Playgroud)
编辑
你们中有些人建议我重构代码,但是出现了同样的问题。
CheckStudent checkStudent = (Student s) -> s.getGender() == Student.Sex.MALE && s.getAge() >= 18 && s.getAge() <= 25;
Run Code Online (Sandbox Code Playgroud)
是否Student在作业的右侧实例化了一个类(我不是指class )?
在Java中,该main()方法的声明是有效的吗?我们经常使用 public static void main(String[] arr){},但我想知道的是:该main()方法可以被声明为final吗?
final public static void main(String[] arr) {
//...
}
Run Code Online (Sandbox Code Playgroud) 这个问题与Android和生命周期有关。以前,我会有一系列主题并在创作时订阅它们。
销毁后,我会将所有主题标记为完整,假设它处理了所有订阅者。
在 Android Studio 3.1 中,我会收到针对“未使用”的任何订阅者的警告。解决方案是将它们添加到“完全一次性”中,然后我在销毁时进行处理。
我需要“复合一次性”来在销毁时正确取消请求吗?我之前将主题标记为完整的方法有什么作用吗?在这种情况下有必要吗?
作为代码示例:
val observable: PublishSubject<Int> = PublishSubject.create()
val disposable = observable.subscribe { /* subscription */ }
fun onDestroy() {
observable.onComplete() // is this line necessary or helpful?
disposable.dispose()
}
Run Code Online (Sandbox Code Playgroud) 在Java中,当要执行一个方法时,首先在对象的真实类(定义对象的真实类型)中搜索它的声明。如果没有找到,则检查超类。如果在那里也找不到,则检查下一个父类,依此类推。但是,请看下面的示例:
SuperClass s = new SubClass(list of parameter);
s.someMethodExistOnlyInSubClass();
Run Code Online (Sandbox Code Playgroud)
这会给我一个编译时错误。我认为,如上所述,它会首先查找someMethodExistOnlyInSubClass()at SubClass,验证它是否存在,然后立即执行它。如果我使用该类型的变量SuperClass来引用某些参数的实例,SubClass将SuperClass通过调用转到 的构造函数super(),并且该对象将在那里实例化。在这种情况下,剩下的参数到哪里去了?
我正在尝试使用 Firebase App Check 并以 reCAPTCHA v3 Enterprise 作为证明提供商来保护 Web 应用程序的自托管后端,但我对此设置的计费结构有一些疑问。
仅使用 reCAPTCHA v3 时,标准流程是使用 以编程方式在客户端调用质询grecaptcha.execute,检索令牌,然后将其发送到后端。随后,后端通过向 reCAPTCHA 服务器发出 API 请求来验证令牌。我对 reCAPTCHA Enterprise 定价页面的理解是,每次在后端验证令牌时我都会付费。
相比之下,Firebase App Check 的流程似乎略有不同。在这里,客户端通过 Firebase App Check 与 reCAPTCHA v3 交互,并接收令牌形式的“证明”。然后,客户端将此令牌发送到我的后端,我的后端通过向 Firebase 服务器发出请求来验证令牌的有效性。此外,Firebase App Check 令牌具有可配置的过期时间,并且可以重复使用,并且可以选择启用重播保护。
鉴于此,我不清楚 Firebase App Check 与 reCAPTCHA v3 集成时的计费方式。具体来说,我想知道:
任何对这些问题的见解将不胜感激。
java ×6
android ×2
calendar ×1
firebase ×1
httphandler ×1
lambda ×1
memory-leaks ×1
performance ×1
polymorphism ×1
recaptcha ×1
recaptcha-v3 ×1
rest ×1
resteasy ×1
rx-java2 ×1
rx-kotlin2 ×1
undertow ×1