【发布时间】:2011-10-04 11:48:46
【问题描述】:
我有一个通过 Web 服务接收消息(事件)的 J2EE 应用程序。消息具有不同的类型(根据类型需要不同的处理)并按特定顺序发送。它发现了一个问题,即某些消息类型的处理时间比其他消息类型长。结果是在序列中第二个接收到的消息可能在序列中的第一个之前被处理。我试图通过在处理消息的方法周围放置一个同步块来解决这个问题。这似乎可行,但我不确定这是“正确”的方法吗?是否有可能更合适的替代方案或者这是“可接受的”?我已经包含了一小段代码来尝试更清楚地解释。 ....任何建议/指导表示赞赏。
public class EventServiceImpl implements EventService {
public String submit (String msg) {
if (msg == null)
return ("NAK");
EventQueue.getInstance().submit(msg);
return "ACK";
}
}
public class EventQueue {
private static EventQueue instance = null;
private static int QUEUE_LENGTH = 10000;
protected boolean done = false;
BlockingQueue<String> myQueue = new LinkedBlockingQueue<String>(QUEUE_LENGTH);
protected EventQueue() {
new Thread(new Consumer(myQueue)).start();
}
public static EventQueue getInstance() {
if(instance == null) {
instance = new EventQueue();
}
return instance;
}
public void submit(String event) {
try {
myQueue.put(event);
} catch (InterruptedException ex) {
}
}
class Consumer implements Runnable {
protected BlockingQueue<String> queue;
Consumer(BlockingQueue<String> theQueue) { this.queue = theQueue; }
public void run() {
try {
while (true) {
Object obj = queue.take();
process(obj);
if (done) {
return;
}
}
} catch (InterruptedException ex) {
}
}
void process(Object obj) {
Event event = new Event( (String) obj);
EventHandler handler = EventHandlerFactory.getInstance(event);
handler.execute();
}
}
// Close queue gracefully
public void close() {
this.done = true;
}
【问题讨论】:
标签: java jakarta-ee