[英]JMS unable to consume message from oracle queue
我必須異步地將一些文件從系統A推送到系統B。為此,我創建了一個JMS使用者。 使用oracle中的入隊存儲過程成功將入隊入隊后。 我的消費者應該閱讀該消息並將其發送到系統B。
這是我的聽眾代碼
public class DMSCustomMessageListener extends DefaultMessageListenerContainer{
protected MessageConsumer createConsumer(Session session, Destination destination)
throws JMSException
{
return ((AQjmsSession)session).createConsumer(destination,
getMessageSelector(),
DMS_Master_Type.getORADataFactory(), null, isPubSubNoLocal());
}
}
public class DMSListener implements FactoryBean{
private ConnectionFactory connectionFactory;
private String queueName;
private String queueUser;
@Required
public void setConnectionFactory(QueueConnectionFactory connectionFactory)
{
System.out.println("set connection");
this.connectionFactory = connectionFactory;
}
@Required
public void setQueueName(String queueName) {
System.out.println("set DMS listener queuename");
this.queueName = queueName;
}
@Required
public void setQueueUser(String queueUser) {
System.out.println("set DMS listener queueuser");
this.queueUser = queueUser;
}
public Object getObject() throws Exception
{
QueueConnectionFactory qconn = (QueueConnectionFactory)this.connectionFactory;
AQjmsSession session = (AQjmsSession)qconn.createQueueConnection("score", "score").createQueueSession(true, 0);
return session.getQueue(this.queueUser, this.queueName);
}
public Class getObjectType()
{
return Queue.class;
}
public boolean isSingleton() {
return false;
}
}
這是我的配置方式。
<bean id="messageDMSListener" class="com.test.DMSTextListener">
</bean>
<bean id="testDMS" class="com.test.DMSListener">
<property name="connectionFactory" ref="aqConnectionFactoryRspm"/>
<property name="queueName" value="RSPM_PEND_REQ_Q_DMS"/>
<property name="queueUser" value="score"/>
</bean>
<bean id="jmsDMSContainer" class="com.test.DMSCustomMessageListener">
<property name="connectionFactory" ref="aqConnectionFactoryRspm"/>
<property name="destination" ref="testDMS"/>
<property name="messageListener" ref="messageDMSListener" />
<property name="sessionTransacted" value="true"/>
<property name="errorHandler" ref="listenerErrorHandler"/>
</bean>
在我的隊列表/視圖(AQ$RSPM_PEND_REQ_Q_DMS)
我將到期原因設為'MAX_RETRY_EXCEEDED'
。 我已將其配置為10。
可能是什么原因? 請幫助。
Oracle Database Queue System與常見的JMS系統不同,因此與之交談的方式也不同。 我假設您可以與您的隊列交談,但是消息不會從隊列中消失,而是會過期。 如果是這種情況,那么我認為您的隊列配置為“多用戶”類型。 在這種情況下,直到所有收件人都收到消息並且隊列所有者也是收件人,它才會消失。 由於您只想將消息傳遞給另一個系統,因此將隊列重新配置為單個用戶,並且消息在讀取后立即消失。
事實上,您也不需要Java Bean。 您可以通過直接在數據庫中配置隊列傳播(和相應的作業)而無需任何外部對象來完成此作業(以下示例框架不是完整的解決方案):
BEGIN
DBMS_AQADM.SCHEDULE_PROPAGATION (
queue_name => 'init_queue',
destination => NULL,
start_time => SYSDATE,
duration => NULL,
next_time => NULL,
latency => 60,
destination_queue => 'dest_queue');
END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.