2013-04-15 73 views
0

我是Java Messaging Service的新手,并不完全确定它是如何工作的。我在NetBeans中使用JMS和Java EE项目。我使用的服务器类型是glassfish 3.这是我的情况:Java EE和glassfish服务器发生Java消息传递服务问题

我有一个程序创建两个线程,A和B.这两个线程通过我创建的两个队列服务器资源在彼此之间发回消息和第四个消息。下面是一系列的假设被传递回和第四A和B.

之间的消息

什么是假设发生:

1. A is started 
2. B is started 
3. A sends B a message, M1 (producer.send(m1)) 
4. B receives M1 and does some stuff (consumer.receive()) 
5. B sends A a message, M2 
6. A receives M2 and does some stuff 
7. A sends B a message, M3 
8. B receives M3 and does some stuff 

实际发生的:

1. A is started 
2. B is started 
3. B receives M3 and does some stuff (consumer.receive()) 

这种情况自从我在所有发送的消息之间的某个地方做了一个session.commit()之后就开始弹出。它几乎就像我将队列的状态提交给某个文件或服务器,现在每次运行我的程序时,都会从保存的状态初始化队列。

我之所以首先添加提交的原因是因为我的一条消息M2没有被线程A接收到。线程B正在到达它的代码部分,它通过生产者将M2发送到线程A .send(M2)(其中producer是一个MessageProducer对象)。线程A只会挂在consumer.receive()(其中consumer是MessageConsumer对象)。我再次检查是否将M2发送到正确的Queue资源。

回答

0

我终于明白了。原来我每次都需要session.commit()线程B发送一条消息。另外,我的代码中有一个错误,导致程序过早结束,这意味着仍然有未收到的消息,这些消息会延续到下一次运行时间。我最终做了什么来解决这个问题,只是绕着consumer.receive(100)循环,直到它在启动我的线程之前返回一个空值。