2011-07-27 40 views
6

Tôi có MDB trong WebSphere 6. MessageListener được liên kết với hàng đợi Tibco EMS. Trong MDB, tôi đang cố gắng ghi vào hàng đợi WebSphere MQ. Tôi nhận được lỗi sau:Một nỗ lực bất hợp pháp để cam kết một nguồn tài nguyên có khả năng một pha với hai nguồn tài nguyên có sẵn giai đoạn hiện tại

WMSG0042I: MDB Listener LoanIQ Payments Inbound started successfully for JMSDestination jms/eid/payments 
WTRN0063E: An illegal attempt to commit a one phase capable resource with existing two phase capable resources has occurred. 
WTRN0086I: XAException encountered during prepare phase for transaction 00000131...0001. Local resources follow. 
WTRN0089I: [email protected] 3fbe3fbe XAResource: [email protected] enlisted: true mcWrapper.hashCode()1038237154: Vote: commit. 
WTRN0089I: [email protected]:4e2e4e2e LocalTransaction:com.ibm.ejs.jms.JMSManagedSession$JMS [email protected] enlisted:true registeredForSynctruemcWrapper.hashcode()1032076676: Vote: none. 

Ví dụ QueueConnectionFactory là com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle. Tôi có thể nhận được một XAConnection từ này? Tôi có cần phải? Tôi muốn ở lại với vanilla JMS nếu có thể.

Việc thực hiện MDB là giống như:

public void onMessage(Message message) { 
    // ^^ incoming message delivered from EMS queue via WAS MessageListener 
    TextMessage textMessage = (TextMessage) message; 
    QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup(factoryName); 
    Queue queue = (Queue) context.lookup(queueName); 
    QueueConnection connection = factory.createQueueConnection(); 
    connection.start(); 
    QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); 
    QueueSender sender = session.createSender(queue); 
    TextMessage message = session.createTextMessage("some new payload"); 
    sender.send(message); 
    // ^^ outgoing message sent to WebSphere MQ queue 
} 

Trả lời

7

Nhìn vào lỗi, bạn có một tài nguyên XA và một JCA LocalTransaction

WTRN0089I: [email protected] 3fbe3fbe XAResource: [email protected] enlisted: true mcWrapper.hashCode()1038237154: Vote: commit.

WTRN0089I: [email protected]:4e2e4e2e LocalTransaction:com.ibm.ejs.jms.JMSManagedSession$JMS [email protected] enlisted:true registeredForSynctruemcWrapper.hashcode()1032076676: Vote: none.

Âm thanh như bạn hoặc chưa đặt ConnectionFactory thành XA được bật, xem:

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/umj_pjcfm.html

(di chuyển xuống "XA Enabled") hoặc kết nối Tibco EMS là không XA có khả năng. Nếu đó là thứ hai, và không có trình điều khiển XA phù hợp, thì bạn có thể xem xét hỗ trợ Người tham gia cuối cùng trong WAS vô tội, có thể làm những gì bạn cần - tức là WAS sẽ chuẩn bị giao dịch WMQ XA, cam kết với Tibco, sau đó cam kết WMQ nếu cam kết của Tibco hoạt động (hoặc ngược lại). Nếu kết nối Tibco là XA có khả năng, thì WAS có hỗ trợ XA đầy đủ cho WMQ được tích hợp sẵn, do đó không có lý do gì để không sử dụng giao dịch hai pha cho toàn bộ hoạt động.

Về

The QueueConnectionFactory instance is a com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle. Could I get an XAConnection from this? Do I need to? I'd prefer to stay with vanilla JMS if possible.

Bạn không nên làm điều này, chỉ cần giữ để JMS đồng bằng. Như một điểm chung của phong cách, tốt hơn là nên đưa vào một ConnectionFactory (không phải QueueConnectionFactory), và sau đó vẫn còn với các đối tượng tên miền chéo (Connection, Session, MessageProducer).

+2

MQ đã được bật XA. Có vẻ như các trình điều khiển EMS không. [Bật LPS] (https://www.ibm.com/developerworks/wikis/display/xdcomputegrid/Enabling+last+participant+support) đã hoạt động. Cảm ơn bạn. – Synesso

+0

Liên kết để bật LPS được tìm thấy ở đây. http://www-01.ibm.com/support/docview.wss?uid=swg21244805 – asgs

1

Tôi gặp vấn đề tương tự. Tôi đã cấu hình Queue, QCF và AC của mình nhưng sau khi tôi nhận được thông báo, giao dịch đã được khôi phục và bản cập nhật DB cũng không thành công. Tôi đã thêm @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) trong phương thức onMessage.

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
public void onMessage(Message message) {//Logic } 

Hy vọng nó sẽ giúp ai đó. Tôi là WAS 7 với MDB để nghe tin nhắn.

`