2015-03-25 15 views
5

Vì vậy, tôi đang cố gắng để có được một MQXAQueueConnectionFactory để làm việc, tôi đã tạo ra một lớp mở rộng từ JmsComponent để xử lý tên người dùng và mật khẩu khi gửi dữ liệu đến hàng đợi. Nó lấy/đặt tin nhắn trong hàng đợi, nhưng trong trường hợp của tôi, tôi đã tạo một router để kiểm tra XA nhưApache Camel MQXAQueueConnectionFactory

from("wmq:queue:incomingQueue") 
    .process(new Processor(){ 
    ... Thread.sleep(20000) 
    }) 
    .to("wmq:queue:outgoingQueue") 

trong khi được trong giấc ngủ, tôi tắt queuemanager. Tuy nhiên, khi cố gắng nhận các thông báo không mong muốn từ hàng đợi DISPLAY QSTATUS ('qChainQueue') tôi nhận được CURDEPTH (0), trong khi tôi phải là 1 khi tôi hiểu phần XA.

  • Tôi làm điều này hoàn toàn sai?
  • Làm cách nào để kiểm tra?

HelpClass để xử lý WMQ:

public class WMQComponent extends JmsComponent { 
    private final String username; 
    private final String password; 

    public WMQComponent(String hostname, int port, String username, String password, 
         String queueManager, String channel) throws JMSException { 
     super(); 
     this.username = username; 
     this.password = password; 

     MQXAQueueConnectionFactory connectionFactory = new MQXAQueueConnectionFactory(); 
     connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); 
     connectionFactory.setFailIfQuiesce(1); 

     connectionFactory.setHostName(hostname); 
     connectionFactory.setPort(port); 
     connectionFactory.setQueueManager(queueManager); 
     connectionFactory.setChannel(channel); 

     setConnectionFactory(connectionFactory); 
    } 

    @Override 
    public Endpoint createEndpoint(String uri) throws Exception { 
     if (uri.contains("username") || uri.contains("password")) { 
      throw new IllegalStateException("Username and password is set by the component"); 
     } 
     if (uri.contains("?")) { 
      return super.createEndpoint(uri + "&username=" + username + "&password=" + password); 
     } else { 
      return super.createEndpoint(uri + "?username=" + username + "&password=" + password); 
     } 
    } 

} 

Với các lỗi sau đây:

2015-03-25 14:01:12,077 [ #2 - Multicast] INFO dest_chain_ldap    - org.springframework.jms.IllegalStateException: JMSWMQ0018: Failed to connect to queue manager 'QMBATCHESB' with connection mode 'Client' and host name 'hostname.com'.; nested exception is com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: Failed to connect to queue manager 'QMBATCHESB' with connection mode 'Client' and host name 'hostname.com'. Check the queue manager is started and if running in client mode, check there is a listener running. Please see the linked exception for more information.; nested exception is com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2059' ('MQRC_Q_MGR_NOT_AVAILABLE'). 
    at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:279) 
    at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168) 
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:469) 
    at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.send(JmsConfiguration.java:228) 
    at org.apache.camel.component.jms.JmsProducer.doSend(JmsProducer.java:431) 
    at org.apache.camel.component.jms.JmsProducer.processInOnly(JmsProducer.java:385) 
    at org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:153) 
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:120) 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) 
    at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163) 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:416) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:51) 
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:120) 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) 
    at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:416) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:105) 
    at org.apache.camel.processor.MulticastProcessor.doProcessParallel(MulticastProcessor.java:732) 
    at org.apache.camel.processor.MulticastProcessor.access$200(MulticastProcessor.java:82) 
    at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:303) 
    at org.apache.camel.processor.MulticastProcessor$1.call(MulticastProcessor.java:288) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: Failed to connect to queue manager 'QMBATCHESB' with connection mode 'Client' and host name 'hostname.com'. Check the queue manager is started and if running in client mode, check there is a listener running. Please see the linked exception for more information. 
    at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:496) 
    at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:236) 
    at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:430) 
    at com.ibm.msg.client.wmq.internal.WMQXAConnection.<init>(WMQXAConnection.java:70) 
    at com.ibm.msg.client.wmq.factories.WMQXAConnectionFactory.createV7ProviderConnection(WMQXAConnectionFactory.java:190) 
    at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:6210) 
    at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:278) 
    at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6155) 
    at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:144) 
    at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:223) 
    at org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter.doCreateConnection(UserCredentialsConnectionFactoryAdapter.java:175) 
    at org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter.createConnection(UserCredentialsConnectionFactoryAdapter.java:150) 
    at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:184) 
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:456) 
    ... 29 more 
Caused by: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2059' ('MQRC_Q_MGR_NOT_AVAILABLE'). 
    at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:223) 
    ... 41 more 
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2059;AMQ9204: Connection to host 'hostname.com(1514)' rejected. [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2059;AMQ9213: A communications error for occurred. [1=java.net.ConnectException[Connection refused: connect],3=hostname.com]],3=hostname.com(1514),5=RemoteTCPConnection.connnectUsingLocalAddress] 
    at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiConnect(RemoteFAP.java:1831) 
    at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:345) 
    ... 40 more 
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2059;AMQ9213: A communications error for occurred. [1=java.net.ConnectException[Connection refused: connect],3=hostname.com] 
    at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.connnectUsingLocalAddress(RemoteTCPConnection.java:612) 
    at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:940) 
    at com.ibm.mq.jmqi.remote.internal.system.RemoteConnection.connect(RemoteConnection.java:1097) 
    at com.ibm.mq.jmqi.remote.internal.system.RemoteConnectionPool.getConnection(RemoteConnectionPool.java:348) 
    at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiConnect(RemoteFAP.java:1503) 
    ... 41 more 
Caused by: java.net.ConnectException: Connection refused: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) 
    at java.net.Socket.connect(Socket.java:579) 
    at java.net.Socket.connect(Socket.java:528) 
    at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection$2.run(RemoteTCPConnection.java:597) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.ibm.mq.jmqi.remote.internal.RemoteTCPConnection.connnectUsingLocalAddress(RemoteTCPConnection.java:588) 
    ... 45 more 

Trả lời

3

Vì vậy, tôi đã làm điều này một chút sai, nó không đủ để sử dụng MQXAConnectionFactory nhưng tôi đã phải tạo ra các JmsComponent như giao dịch.

Đã cố gắng dừng trình quản lý hàng đợi trong khi chạy ứng dụng và dừng ứng dụng trong khi xử lý tin nhắn và dường như thực hiện việc khôi phục như mong đợi.

Đã kết thúc với

public static JmsComponent mqXAComponentTransacted(String hostname, int port, String username, String password, 
          String queueManager, String channel) throws JMSException { 
    MQXAQueueConnectionFactory connectionFactory = new MQXAQueueConnectionFactory(); 
    connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); 
    connectionFactory.setFailIfQuiesce(1); 
    connectionFactory.setHostName(hostname); 
    connectionFactory.setPort(port); 
    connectionFactory.setQueueManager(queueManager); 
    connectionFactory.setChannel(channel); 

    UserCredentialsConnectionFactoryAdapter connectionFactoryAdapter=new UserCredentialsConnectionFactoryAdapter(); 
    connectionFactoryAdapter.setTargetConnectionFactory(connectionFactory); 
    connectionFactoryAdapter.setUsername(username); 
    connectionFactoryAdapter.setPassword(password); 

    return JmsComponent.jmsComponentTransacted(connectionFactoryAdapter); 
} 

Cũng sử dụng UserCredentialsConnectionFactoryAdapter, tôi không muốn sử dụng các thành phần mùa xuân nhưng kể từ khi gói JMS là đã phụ thuộc của nó, nó là dễ dàng hơn để sử dụng nó hơn giải pháp trước đây của tôi để xử lý thông tin đăng nhập.

4

Lý do đang 2059 và các lỗi khác nhau nói rằng các kết nối bị từ chối đề nghị hoặc một vấn đề cơ khí (tức là Listener không chạy) hoặc một vấn đề auths.

Nếu tôi đang cố gắng gỡ lỗi điều này, điều đầu tiên tôi làm là bật các sự kiện ủy quyền, sự kiện kênh và bất kỳ sự kiện nào khác bạn thường bật. Nếu bạn sử dụng MQ Explorer, cũng cài đặt MS0P Plugin cho phép bạn xem các thông báo sự kiện trong văn bản có thể đọc được.

Tiếp theo, tôi sẽ sử dụng các chương trình mẫu MQ để kiểm tra. Vì tôi luôn cài đặt toàn bộ máy khách hơn là lấy các tệp jar, tôi có sẵn amqsputc. Tuy nhiên, các lớp Java có các chương trình IVT (kiểm tra xác minh ban đầu). Những điều này đảm bảo rằng người nghe đang chạy, kênh được cấu hình và khả dụng, v.v. Theo v7.1, điều này cũng đảm bảo rằng các quy tắc CHLAUTH được đặt để cho phép truy cập. Kể từ phiên bản v8.0, hoặc nếu bạn đã cài đặt lối ra Capitalware, điều này cũng cho phép chúng tôi kiểm tra xác thực ID và mật khẩu người dùng.

Nhật ký lỗi của trình quản lý hàng đợi và các thông báo sự kiện sẽ cung cấp chẩn đoán tốt, giả sử yêu cầu kết nối sẽ chuyển sang MQ. Hãy chắc chắn tìm cả trong nhật ký lỗi QMgr cụ thể và nhật ký lỗi cài đặt toàn cục. Một khi tôi đã xác nhận rằng kết nối cơ bản được đặt ra, tôi sẽ điều chỉnh các tham số cấu hình phía máy khách cho máy chủ, cổng, kênh và nếu nó được chỉ định [rùng mình!] Tên QMgr. Giả sử đây là chính xác và đã được chứng minh công trình kết nối cơ bản, bây giờ có thể thử nghiệm các ứng dụng với một số sự tự tin.

Phương pháp tương tự cũng được áp dụng. Trước tiên, hãy đảm bảo yêu cầu kết nối của ứng dụng đưa nó vào QMgr. Nếu có và bị từ chối, các thông báo sự kiện và nhật ký lỗi sẽ lưu ý điều này và tại sao. Nếu không có dấu hiệu của một thất bại ở những nơi này, các ứng dụng không nhận được QMgr. Năm 2059 có thể chỉ ra rằng socket đã bị từ chối, rằng người nghe đã hết nhưng QMgr không phải là, các trường hợp kênh đã maxed, hoặc sau khi tạm thời bắt đầu kênh nó đã bị đóng bởi QMgr, thường là do quy tắc CHLAUTH. Trong mọi trường hợp, các thông báo sự kiện và nhật ký lỗi sẽ có giải thích chi tiết về lý do tại sao.

Các vấn đề liên quan