昨天晚上一直在调试一个奇怪的问题。该问题就大流量的情况下就会出现。
(注:以后凡是奇怪的问题,而且是性能测试出现的,先往多线程这儿走)
用一个小片段的代码来说明这个问题:
public class TestComponent implements org.xmpp.component.Component{
private TestService service = new TestService();
........
public void processPacket(Packet packet) {
TestObject = service.handle(packet);
........
}
........
}
然后我们用whack下面的ExternalComponentManager来包装这个component并连接到openfire服务器上。
如果打开ExternalComponentManager的源码就会发现,这个component的工作模式和java servlet类似。
一个component的实例的processPacket会在一个线程池中被调用。如果TestService是一个非线程安全的类的话,肯定会出问题。
以后再碰到类似模式的java class,发现里面定义了成员变量,先问问为什么要定义这些成员?他们线程安全吗?
写到这儿,就回忆起,这种问题其实碰到过好多次了。再提醒一下自己把。