簡體   English   中英

使用JMS從Oracle AQ收到的TextMessage僅包含'???'

[英]TextMessage received from Oracle AQ using JMS contains just '???'

我需要連接到不同數據庫中的兩個Oracle AQ隊列。 除了連接字符串,我在兩種情況下都使用完全相似的代碼。 其中一個隊列工作正常,但第二個隊列工作異常。

String db_string = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=x.y.z.2)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=x.y.z.3)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DBNAME)))";

String name = "scott";
String pwd = "tiger";

Properties info = new Properties();
info.put("name", name);
info.put("password", pwd);

QueueConnectionFactory q_cf = AQjmsFactory.getQueueConnectionFactory(db_string, info);
QueueConnection q_conn q_conn = q_cf.createQueueConnection(name, pwd);

QueueSession q_sess = q_conn.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
q_conn.start();
Queue queue = ((AQjmsSession) q_sess).getQueue("test","myaq");
((AQjmsDestination) queue).start(q_sess, true, true);
QueueReceiver q_recvr = q_sess.createReceiver(queue);
TextMessage message = (TextMessage) q_recvr.receive();

System.out.println(message.getText());

當我使用代碼連接到運行良好的AQ時,它將正確打印消息中包含的文本。 無論消息包含什么內容,第二個AQ都只打印三個引號。

我正在使用aqapi 10.2.0.2,並且已經對ojdbc14 10.2.0.2.0和ojdbc5 11.1.0.6.0進行了測試。 正在運行的AQ正在Oracle 11.1.0.0.0上運行,而導致該問題的是10.2.0.4.0。 我已經用Wireshark分析了TNS數據包,並且包含AQ消息的數據包看起來與兩個數據庫都非常相似。

工作案例的TextMessage對象的反射轉儲如下所示:

{text_data=MY_TEXT_MESSAGEtext_msg_cont=oracle.jms.AQjmsTextMessage_C@1a7508agen_msg_cont=oracle.jms.AQjmsGenMessage_C@198cb3dtext_lob=m_boolClass=class java.lang.Booleanm_byteClass=class java.lang.Bytem_shortClass=class java.lang.Bytem_intClass=class java.lang.Integerm_longClass=class java.lang.Longm_floatClass=class java.lang.Floatm_doubleClass=class java.lang.Doublem_strClass=class java.lang.Stringm_systemProperties={JMSXDeliveryCount=class java.lang.Integer, JMS_OracleConnectionID=class java.lang.String, JMSXGroupSeq=class java.lang.Integer, JMSXAppID=class java.lang.String, JMSXRecvTimestamp=class java.lang.Long, JMS_OracleExcpQ=class java.lang.String, JMS_OracleHeaderOnly=class java.lang.String, JMS_OracleOriginalMessageID=class java.lang.String, JMSXGroupID=class java.lang.String, JMSXUserID=class java.lang.String, JMS_OracleDeliveryMode=class java.lang.String, JMS_OracleTimestamp=class java.lang.Long, JMS_OracleDelay=class java.lang.Long, JMSXState=class java.lang.Integer}m_settableSystemProperties=[JMSXGroupID, JMSXGroupSeq]header_ext=oracle.jms.AQjmsMessageHeaderExt@472d48message_id=oracle.jms.AQjmsMessageID@edf3f6enqueue_time=1265887454000corr_id=msg_dest=test.myaqdel_mode=2redelivered=trueexpiration=0priority=1msg_properties={JMS_OracleDeliveryMode=oracle.jms.AQjmsPropDatum@2bc3f5}access_mode=0prop_read_only=truerecv_time=1265891032384msg_state=0excp_queue=msg_delay=0orig_msg_id=sender_id=attempts=5m_signature=session=oracle.jms.AQjmsSession@a613f8m_hdrOnly=falsem_isjmsbody=truecompliant=falseJMS_REPLY_TO=JMSReplyTo}

和壞的一個:

{text_data=???text_msg_cont=oracle.jms.AQjmsTextMessage_C@1bf3d87gen_msg_cont=oracle.jms.AQjmsGenMessage_C@60991ftext_lob=m_boolClass=class java.lang.Booleanm_byteClass=class java.lang.Bytem_shortClass=class java.lang.Bytem_intClass=class java.lang.Integerm_longClass=class java.lang.Longm_floatClass=class java.lang.Floatm_doubleClass=class java.lang.Doublem_strClass=class java.lang.Stringm_systemProperties={JMSXDeliveryCount=class java.lang.Integer, JMS_OracleConnectionID=class java.lang.String, JMSXGroupSeq=class java.lang.Integer, JMSXAppID=class java.lang.String, JMSXRecvTimestamp=class java.lang.Long, JMS_OracleExcpQ=class java.lang.String, JMS_OracleHeaderOnly=class java.lang.String, JMS_OracleOriginalMessageID=class java.lang.String, JMSXGroupID=class java.lang.String, JMSXUserID=class java.lang.String, JMS_OracleDeliveryMode=class java.lang.String, JMS_OracleTimestamp=class java.lang.Long, JMS_OracleDelay=class java.lang.Long, JMSXState=class java.lang.Integer}m_settableSystemProperties=[JMSXGroupSeq, JMSXGroupID]header_ext=oracle.jms.AQjmsMessageHeaderExt@1e4f7c2message_id=oracle.jms.AQjmsMessageID@145f0e3enqueue_time=1265890738000corr_id=msg_dest=test.myaqdel_mode=2redelivered=trueexpiration=0priority=1msg_properties={???=oracle.jms.AQjmsPropDatum@c9d92c}access_mode=0prop_read_only=truerecv_time=1265891388844msg_state=0excp_queue=msg_delay=0orig_msg_id=sender_id=attempts=1m_signature=session=oracle.jms.AQjmsSession@60e128m_hdrOnly=falsem_isjmsbody=truecompliant=falseJMS_REPLY_TO=JMSReplyTo}

我遇到過同樣的問題。 與數據庫的唯一區別是oracle NLS_CHARACTERSET參數。 如果NLS_CHARACTERSET = WE8MSWIN1252消息參數接收正確。 如果NLS_CHARACTERSET = CL8MSWIN1251-消息參數僅包含“ ???” 在參數名稱中。

找到解決方案,並解決了問題。 將orai18n.jar添加到Web服務器應用程序類路徑可解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM