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)
私もコミットしました();セッション上ではメッセージは確認されません。
確認応答の3種類があります。 AUTO_ACKNOWLEDG、CLIENT_ACKNOWLEDGE、DUPS_OK_ACKNOWLEDGE。あなたは最初のものを決めました。この場合、承認は自動的に行われます。 –
AUTO_ACKNLOWLEDGEはメッセージを確認せず、toppicsessionのコミットもセッションもそのメッセージを確認しません。plsqlを使用してメッセージをデキューしてもキューに残ります。 – Asiriel
保持カラムには何がありますか? '名前の選択、dba_queuesからの保存場所、名前=" q_name "' –