2016-08-11 4 views
0

Oracleアドバンスト・キューからバネを使用してメッセージをデキューすると、私はADTメッセージを受け取るが、肯定応答ではnullポインタを受け取る。助言がありますか? msg.acknowledgeでスプリングoracleアドバンスト・キューnullpointer on acknowledge

public class OracleAQTopicConnectionFactory { 

private DataSource dataSource; 

/** 
* 
* @return - 
* @throws Exception - 
*/ 
public TopicConnectionFactory createConnectionFactory() throws Exception { 
    return oracle.jms.AQjmsFactory.getTopicConnectionFactory(dataSource); 
} 

/** 
* 
* @param dataSource - 
*/ 
public void setDataSource(DataSource dataSource) { 
    this.dataSource = dataSource; 
} 
} 


public class OracleAQTopicDestinationFactory implements FactoryBean { 

private static final org.apache.log4j.Logger LOGGER 
     = org.apache.log4j.Logger.getLogger(OracleAQTopicDestinationFactory.class); 

private TopicConnectionFactory connectionFactory; 
private String queueUser; 
private String queueName; 

/** 
* 
* @return @throws Exception 
*/ 
public Object getObject() throws Exception { 

    TopicConnection topicConnection = connectionFactory.createTopicConnection(); 
    TopicSession topicSession = topicConnection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE); 
    LOGGER.info("Acknowledge Mode: " + topicSession.getAcknowledgeMode()); 
    return ((AQjmsSession) topicSession).getTopic(queueUser, queueName); 
} 

/** 
* 
* @return - 
*/ 
public Class getObjectType() { 
    return javax.jms.Topic.class; 
} 

/** 
* 
* @return - 
*/ 
public boolean isSingleton() { 
    return false; 
} 

/** 
* 
* @param connectionFactory - 
*/ 
public void setConnectionFactory(TopicConnectionFactory connectionFactory) { 
    this.connectionFactory = connectionFactory; 
} 

/** 
* 
* @param queueUser - 
*/ 
public void setQueueUser(String queueUser) { 
    this.queueUser = queueUser; 
} 

/** 
* 
* @param queueName - 
*/ 
public void setQueueName(String queueName) { 
    this.queueName = queueName; 
} 
} 

public class OracleObjectMessageListenerContainer extends DefaultMessageListenerContainer { 

private String subscriberName; 

/** 
* 
* @param subscriberName - 
*/ 
public void setSubscriberName(String subscriberName) { 
    this.subscriberName = subscriberName; 
} 

/** 
* 
*/ 
public OracleObjectMessageListenerContainer() { 
    super(); 
} 

/** 
* 
* @param session - 
* @param destination - 
* @return - 
* @throws JMSException - 
*/ 
@Override 
protected MessageConsumer createConsumer(Session session, Destination destination) throws JMSException { 
    return ((AQjmsSession) session).createDurableSubscriber((Topic) destination, 
      subscriberName, Sync.getORADataFactory()); 
} 

} 



public class OracleNotificationListener implements MessageListener { 

private static final org.apache.log4j.Logger LOGGER 
     = org.apache.log4j.Logger.getLogger(OracleNotificationListener.class); 

@Override 
public void onMessage(Message message) { 
    try { 

     AQjmsAdtMessage msg = (AQjmsAdtMessage) message; 
     Sync sync = (Sync) msg.getAdtPayload(); 
     if (new DestinationHandler().messageHandler(sync)) { 
      msg.acknowledge(); 
     } 

    } catch (JMSException ex) { 
     LOGGER.error("JMSException: " + ex.getMessage()); 
    } 
} 
} 

()。私は以下を取得します:

java.lang.NullPointerException 
at oracle.jms.AQjmsMessage.acknowledge(AQjmsMessage.java:2036) 

私もコミットしました();セッション上ではメッセージは確認されません。

+0

確認応答の3種類があります。 AUTO_ACKNOWLEDG、CLIENT_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE。あなたは最初のものを決めました。この場合、承認は自動的に行われます。 –

+0

AUTO_ACKNLOWLEDGEはメッセージを確認せず、toppicsessionのコミットもセッションもそのメッセージを確認しません。plsqlを使用してメッセージをデキューしてもキューに残ります。 – Asiriel

+0

保持カラムには何がありますか? '名前の選択、dba_queuesからの保存場所、名前=" q_name "' –

答えて

0

メッセージを明示的に確認する場合は、TopicSessionの作成時に承認モードをCLIENT_ACKNOWLEDGEに明示的に設定します。しかし、あなたは2つのことに留意する必要があります。

  1. また、トピックセッションを処理するように明示的に設定しました。 このケースでは、トピックセッションはローカルトランザクションを使用し、 承認はほとんど無視されます。 を手動で管理する場合は、 トランザクションも参照する必要があります。
  2. CLIENT_ACKNOWLEDGEを使用する場合は、 の承認を管理する際に注意する必要があります。そうしないと、非常に迅速に構築が開始されます。トランザクションは、通信のこの側面を取り扱うされるように、あなたが、transactedacknowledgeMode両方のパラメータは無視され、その後JTAトランザクションを使用している場合

はまた、その中には大きな注意点があります。したがって

存在しませんが、AUTO_ACKNOWLEDGEを設定した後、 acknowledge()への呼び出しは、明示的に確認応答を送信するためのメカニズムを参照しようとする場合はもちろんの

null pointer exception

関連する問題