2011-07-27 29 views
6

Mam MDB w WebSphere 6. MessageListener jest połączony z kolejką Tibco EMS. W komponencie MDB próbuję pisać do kolejki produktu WebSphere MQ. Pojawia się następujący błąd:Niedozwolona próba zatwierdzenia zasobu jednofazowego z istniejącymi zasobami dwufazowymi

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. 

Instancja QueueConnectionFactory jest com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle. Czy mogę uzyskać od tego XAConnection? Czy muszę? Wolałbym pozostać przy wanilii JMS, jeśli to możliwe.

Realizacja MDB jest zbliżona do:

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 
} 

Odpowiedz

7

Patrząc na błąd, masz jeden zasób XA i jeden JCA LocalTransaction

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

i

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

Brzmi jak ty albo nie ustawiłem właściwości ConnectionFactory na XA, patrz:

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

(przewinąć w dół do "XA Enabled") lub połączenie Tibco EMS nie jest zdolny XA. Jeśli jest to drugie i nie ma odpowiedniego sterownika XA, to możesz popatrzeć na wsparcie Ostatniego Uczestnika w centrum informacyjnym WAS, które może zrobić to, czego potrzebujesz - tj. WAS przygotowałoby transakcję WMQ XA, lokalnie zatwierdziłoby Tibco, a następnie zatwierdziłoby WMQ, jeśli zatwierdzenie Tibco zadziałało (lub wycofało się w inny sposób). Jeśli połączenie Tibco ma zdolność XA, to WAS ma pełną obsługę XA dla WMQ, więc nie ma powodu, aby nie używać dwufazowej transakcji dla całej operacji.

chodzi

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.

Nie powinno to zrobić, wystarczy trzymać się prostych JMS. Ogólnie rzecz biorąc, lepiej jest rzucić na ConnectionFactory (nie QueueConnectionFactory), a następnie pozostać z obiektami między domenami (Connection, Session, MessageProducer).

+2

MQ został włączony XA. Wygląda na to, że sterowniki EMS nie były. Włączono [Enabling LPS] (https://www.ibm.com/developerworks/wikis/display/xdcomputegrid/Enabling+last+participant+support). Dziękuję Ci. – Synesso

+0

Link do włączenia LPS znajduje się tutaj. http://www-01.ibm.com/support/docview.wss?uid=swg21244805 – asgs

1

Miałem ten sam problem. Skonfigurowałem kolejkę, QCF i AC, ale po otrzymaniu wiadomości transakcja została wycofana i aktualizacja bazy danych również się nie udała. Dodałem @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) w metodzie onMessage.

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

Mam nadzieję, że komuś pomaga. Mój jest WAS 7 z MDB do słuchania wiadomości.

`