我正在研究Tomcat(7.0.90 7.0.92)偶尔返回没有HTTP头的响应的问题.
根据Wireshark捕获的数据包,在Tomcat收到请求后,它只返回一个响应体.它既不返回状态行也不返回HTTP响应头.
它使下游Nginx实例产生错误"上游在从上游读取响应头时没有发送有效HTTP/1.0头",向客户端返回502错误并关闭Nginx和Tomcat之间的相应http连接.
这种行为可能是什么原因?是否有任何可能使Tomcat以这种方式行事?或者在某些情况下可能会出现剥离HTTP标头的内容?或Wireshark无法捕获包含HTTP标头的帧?任何建议缩小问题的范围也非常感谢.
这是Wireshark的"关注HTTP流"的屏幕截图,显示了有问题的响应:
编辑:
这是相关部分(仅响应)的"TCP流"的屏幕截图.似乎从上一次的第二个响应中的块看起来很好:
EDIT2:
我将此问题转发给Tomcat用户邮件列表,并从开发人员那里获得了一些进一步调查的建议:
但我还没有找到任何适当的解决方案.我仍然在寻找解决这个问题的见解..
我计划使用 Lombok 创建数百个基于“值对象”模式的类,如下所示:
@Data
public final class SomeId implements Serializable {
private final long value;
}
Run Code Online (Sandbox Code Playgroud)
我想将这些类用于由 Jackson 提供支持的 JSON 序列化。例如,考虑一个 DTO 类,如下所示:
public class SomeDTO {
SomeId id;
public SomeId getId() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
我想这DTO类序列化为类似{"id":123},但杰克逊会产生类似{"id":{"value":123}},它配备了不必要的嵌套对象有一个名为场value。即一个测试用例表达了我的要求:
public class SomeDTOTest {
@Test
public void serializationTest() throws Exception {
SomeDTO dto = new SomeDTO();
dto.id = new SomeId(123);
String serialized = new ObjectMapper().writeValueAsString(dto);
System.out.println(serialized); // {"id":{"value":123}}
assertThat(serialized, is("{\"id\":123}")); // I want {"id":123} instead!
} …Run Code Online (Sandbox Code Playgroud) 当我在WildFly上正常定义Derby DataSource时,db.lck文件保持未删除状态,表示数据库在每次关闭WildFly时都没有正确关闭.因为嵌入式Derby需要一个特殊的关闭过程,该过程正在使用以"; shutdown = true"字符串结尾的JDBC URL获取新连接.
所以,我需要像shutdown-hook那样执行shutdown程序.我发现旧的JBoss有办法实现它:
https://developer.jboss.org/wiki/SetUpADerbyDatasource http://grepcode.com/file/repository.jboss.org/nexus/content/repositories/releases/org.jboss.jbossas/jboss-as-varia/6.0 .0.Final /组织/ JBoss的/ JDBC/DerbyDatabase.java
但我不知道如何在最近的WildFly上应用它,因为它看起来像"mbean"和"依赖"元素不再允许其数据源定义,我在最近的WildFly上找不到它的等价物.
我认为数据源定义的"connection-listener-class"变量是相当可观的,它可能是实现它的一种方法.我还没有尝试过,但它看起来有点复杂,我不确定它是否按预期工作.
那么,有没有办法定义一个shutdown-hook,它使用最近的WildFly执行Derby的shutdown程序?
编辑:
我发布了一条安装Apache Derby到WildFly的说明,其中包括我的解决方案. http://www.nailedtothex.org/roller/kyle/entry/installing-apache-derby-to-wildfly
在 Java Concurrency In Practice 一书中,有一个几乎不可变对象的例子,如果没有正确发布,它有失败的风险:
// Taken from Java Concurrency In Practice
// p.51 Listing 3.15: Class at risk of failure if not properly published.
public class Holder {
private int n;
public Holder(int n) { this.n = n; }
public void assertSanity() {
if(n != n)
throw new AssertionError("This statement is false.");
}
}
// p.50 Listing 3.14: Publishing an object without adequate synchronization. Don't do this.
class Client {
public Holder holder;
public void initialize() {
holder …Run Code Online (Sandbox Code Playgroud) 如何编写WHERE类似于WHERE ? BETWEEN col1 AND col2QueryDSL的子句?我知道我可以这样写,
...
.where(mytable.col1.loe(constant), mytable.col2.goe(constant))
...
Run Code Online (Sandbox Code Playgroud)
但是,使用BETWEEN会使查询更具可读性。
我使用QueryDSL 3.2.3。
更新:
我最终得到了这样的东西(一个可通过运行的测试用例mvn test):
final int constant = 10;
final QMyTable m = QMyTable.myTable;
final SimpleExpression<Boolean> operation = Expressions.operation(Boolean.class, Ops.BETWEEN,
Expressions.constant(constant), m.col1, m.col2);
// This yields:
// SELECT ID, COL1, COL2 FROM MYTABLE WHERE ((? BETWEEN COL1 AND COL2) = ?)
// bind => [10, true]
final MyTable actual = new JPAQuery(em).from(m).where(operation.eq(true)).uniqueResult(m);
Run Code Online (Sandbox Code Playgroud)
无论如何它都能工作,但是该部分= ?是多余的。我想要一个更简单的东西,例如:
SELECT ID, COL1, …Run Code Online (Sandbox Code Playgroud)