2013-07-03 130 views
0

我正在使用Websphere java类在我的应用程序中实现jms。带消息监听器的事务会话,未收到消息

发件人代码:

 MQQueueConnectionFactory connectionFactory = new MQQueueConnectionFactory(); 
     connectionFactory.setHostName(environment.getProperty(MQ_CONNECTION_HOSTNAME)); 
     connectionFactory.setPort(Integer.parseInt(environment.getProperty(MQ_CONNECTION_PORT))); 
     connectionFactory.setQueueManager(environment.getProperty(MQ_CONNECTION_QMANAGER)); 
     connectionFactory.setChannel(environment.getProperty(MQ_CONNECTION_CHANNEL)); 
     connectionFactory.setTransportType(1); 
     final String username = environment.getProperty(MQ_CONNECTION_USERNAME); 
     final String password = environment.getProperty(MQ_CONNECTION_PASSWORD); 
     MQQueueConnection connection = null; 
     if(username != null && username.trim().length() > 0 && password != null && password.trim().length() > 0) { 
      connection = (MQQueueConnection) connectionFactory.createQueueConnection(username, password); 
     } 
     else { 
      connection = (MQQueueConnection) connectionFactory.createQueueConnection(); 
     } 
     senderSession = (MQQueueSession) connection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);    
     MQQueue queue = (MQQueue) senderSession.createQueue("queue:///" + environment.getProperty(MQ_CONNECTION_QUEUE)); 
     MQQueueSender sender = (MQQueueSender) senderSession.createSender(queue); 
     JMSMessage message = (JMSMessage)senderSession.createTextMessage(messageContent); 
     connection.start();   
     sender.send(message); 
     message.acknowledge() 

接收机代码:

final MQQueueConnection connection = (MQQueueConnection) (useAuth ? connectionFactory.createQueueConnection(username, password) :  connectionFactory.createQueueConnection()); 
    connection.start(); 
    final MQQueueSession receiverSession = (MQQueueSession) connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE); 
    final MQQueue queue = MQQueue)receiverSession.createQueue(queueName); 
    MQQueueReceiver receiver = createReceiver(session, queue); 
    receiver.setMessageListener(listener); 

当我发送使用这些设置消息侦听消息从不接收任何消息。 但是,当我打开两个会话与交易为假,一切似乎工作正常。 我可以理解原因。我想要进行事务性会话。

让我知道的情况下,任何其他细节需要

回答

1

如果你想使用本地事务(同步点),那么你发送你需要提交它的消息之后。 即

senderSession.commit(); 
1

message.Acknowledge()from sender side is not required。它只应用于接收端和会话类型为ClientAcknowledge的会话中。此调用将通知消息传递提供程序(本例中为MQ)以从队列中删除先前收到的当前消息和所有消息。