`

msmq 之端口开放问题

    博客分类:
  • msmq
阅读更多

项目中需要用java访问远端的msmq,从网上找了一个开源的实现:

http://msmqjava.codeplex.com

使用上一波三折,经过分析验证,打开队列采用不同的AccessMode,会决定访问远端的不同接口,佩服微软提供的API,竟然有如此威力。

 

现记录下分析的主要内容,以备查找。

 

MSMQ端口

http://support2.microsoft.com/kb/178517

 

Opening Queues

http://msdn.microsoft.com/en-us/library/ms706937(v=vs.85).aspx

 

Opening Remote Queues with Send Access

http://msdn.microsoft.com/en-us/library/ms705186(v=vs.85).aspx

 

  

此时采用的端口根据实际验证,应该只采用1801端口。

 

Opening Remote Queues with Peek or Receive Access

http://msdn.microsoft.com/en-us/library/ms699862(v=vs.85).aspx

 

 

 

此时采用的端口根据实际验证,包括135端口。

 

封装内容解析

参见下述组件中的程序源码:

http://msmqjava.codeplex.com/

 

封装的内容如下所示,根据access决定如何openQueue(),根据代码看,如果是创建Queue不传递参数,则为

OpenQueueWithAccess(jniEnv, object, queuePath, MQ_SEND_ACCESS | MQ_RECEIVE_ACCESS);

此时,MQ_SEND_ACCESS | MQ_RECEIVE_ACCESS=3

按照下面代码分析,如果MQ_SEND_ACCESSMQ_RECEIVE_ACCESS同时设置,按MQ_RECEIVE_ACCESS 的openQueue()方式处理...

 

jint OpenQueueWithAccess

        (JNIEnv *jniEnv, jobject object, jstring queuePath, int access)

{

    jclass cls = jniEnv->GetObjectClass(object);

    jfieldID fieldId;

    HRESULT hr;

 

    try {

        MsmqQueue * sender= NULL;

        MsmqQueue * receiver= NULL;

 

        const char *szQueuePath = jniEnv->GetStringUTFChars(queuePath, 0);

        DIAG("OpenQueueWithAccess (%s)\n", szQueuePath );

 

        if (access & MQ_RECEIVE_ACCESS) {

            receiver = new MsmqQueue();

            // dinoch - Wed, 11 May 2005  13:48

            // MQ_ADMIN_ACCESS == use the local, outgoing queue for remote queues. ??

            hr = receiver->openQueue((char *) szQueuePath, MQ_RECEIVE_ACCESS ); // | MQ_ADMIN_ACCESS

            if (hr != 0) {

                delete receiver;

                return hr;

            }

        }

 

        if (access & MQ_SEND_ACCESS) {

            sender = new MsmqQueue();

            // dinoch - Wed, 11 May 2005  13:48

            // MQ_ADMIN_ACCESS == use (local) outgoing queue for remote queues

            hr = sender->openQueue((char *) szQueuePath, MQ_SEND_ACCESS ); // | MQ_ADMIN_ACCESS

            if (hr != 0) {

                delete sender;

                if (receiver!=NULL) delete receiver;

                return hr;

            }

        }

 

        jniEnv->ReleaseStringUTFChars(queuePath, szQueuePath);

 

        int slot= StoreHandles(receiver, sender);

        if (slot == -1) return -2;

 

        // use JNI to set the _queueSlot field on the caller

        fieldId = jniEnv->GetFieldID(cls, "_queueSlot", "I");

        if (fieldId == 0) return -3;

        jniEnv->SetIntField(object, fieldId, (jint)slot);

 

    }

    catch(...) {

        DIAG("openQueue : Exception. \n");

        jniEnv->ExceptionDescribe();

        jniEnv->ExceptionClear();

        hr = -99;

    }

 

    fflush(stdout);

 

    return (jint) hr;

}

 

 

  • 大小: 4.9 KB
  • 大小: 7.2 KB
分享到:
评论

相关推荐

    msmq消息队列相关

    **MSMQ_FAQ.rar** 很可能是常见问题解答集合,包括了用户在使用MSMQ过程中可能会遇到的问题及解决方案,有助于快速解决实际操作中遇到的难题。 **Msmq.PerfermanceTest.rar** 这个文件可能包含的是MSMQ性能测试工具...

    一个封装MSMQ操作的类.zip_MSMQ C++_VC msmq_msmq_msmq c_vc ms

    MSMQ,全称为Microsoft Message Queuing,是微软提供的一种可靠的消息队列技术,它允许应用程序在不可靠的网络环境中进行通信。在这个压缩包文件中,包含的是一个使用C++编写的MSMQ操作类的示例,它已经被封装好,...

    msmq.rar_java msmq_java 消息队列_java消息队列_msmq_消息队列

    Java MSMQ(Message Queuing)是Java编程中用于实现异步通信的一种技术,它基于微软的MSMQ(Microsoft Message Queue)服务。在分布式系统中,消息队列扮演着至关重要的角色,因为它允许不同组件之间解耦,使得系统...

    无法启动MSMQ服务

    当遇到“无法启动MSMQ服务”的问题时,首先要确定是否是因为DTC服务未启动导致的。通过手动启动DTC服务或使用命令行工具重新安装和启动DTC服务通常可以解决此类问题。如果问题依然存在,则需要进一步检查是否有其他...

    NET中MSMQ完整教程+Msmq.PerfermanceTest

    .NET中的MSMQ(Message Queuing)是微软提供的一种可靠的消息传递技术,用于应用程序之间的异步通信。本教程全面涵盖了MSMQ的关键概念和技术,包括它的设计原理、安装与配置、编程接口以及性能测试。 首先,MSMQ是...

    MSMQ__Demo

    **MSMQ 概述** MSMQ,全称为 Microsoft Message Queuing,是微软提供的一种消息队列技术,用于在分布式系统中可靠地传递消息。MSMQ 使得应用程序可以在网络不稳定或者目标系统不可用的情况下,仍然能够发送和接收...

    Java通过MsmqJava读写MSMQ源码及例子

    Java通过MsmqJava读写MSMQ是一种在Java应用程序中利用消息队列(MSMQ)技术的方法。MSMQ,全称Microsoft Message Queuing,是由微软提供的一个可靠的消息传递服务,用于在不同网络环境、应用程序之间或者在不可靠的...

    MSMQ实例源码 C#

    MSMQ(Microsoft Message Queuing)是微软提供的一种异步消息传递技术,用于在分布式系统中进行可靠的信息交换。它允许应用程序之间通过消息队列进行通信,即使这些应用程序在网络不稳定或者暂时不可用的情况下也能...

    Msmq自用-请勿下载

    ** MSMQ 概述 ** MSMQ,全称为Microsoft Message Queuing,是微软提供的一种消息队列技术。它允许应用程序在不可靠的网络环境中可靠地交换数据,即使发送方和接收方之间的通信暂时中断,消息也能被存储并稍后传递。...

    msmq消息队列相关demo

    MSMQ,全称为Microsoft Message Queuing,是微软提供的一种异步通信技术,它允许应用程序在不同时刻通过网络进行通信,即使发送方和接收方在通信时不在线也能完成消息传递。这种技术对于构建可靠且容错的分布式系统...

    远程访问消息队列、MSMQ

    消息队列(Message Queuing,简称MSMQ)是微软提供的一种企业级的异步通信技术,它允许应用程序在不直接连接的情况下发送和接收消息。在远程访问消息队列的场景中,这一技术尤为重要,因为它可以跨越网络障碍,即使...

    MSMQ C++ API 例子

    C++ API示例会展示如何捕获和处理可能出现的错误,如网络问题、权限问题或队列不存在的情况。 5. **队列管理**:除了基本的消息操作,示例可能还包括管理队列的其他功能,如查询队列信息、删除队列或改变队列属性。...

    MSMQ客户端

    7. **错误处理**:在开发MSMQ客户端时,需要编写适当的错误处理代码,处理可能出现的网络问题、权限问题或消息队列不存在等问题。 8. **队列管理**:客户端可能需要动态地创建、查询或删除消息队列,这涉及到对MSMQ...

    C#MSMQ 消息队列工具

    **C# MSMQ 消息队列工具详解** 在IT领域,消息队列(Message Queue,简称MQ)是一种常用于应用程序之间异步通信的技术。MSMQ(Microsoft Message Queuing)是微软公司提供的一种消息队列服务,它允许分布式系统中的...

    MSMQ使用总结(事务性、线程监控、文件发送接收和远程信息交互)

    事务性消息传输是MSMQ的关键特性之一,它确保了消息的可靠性和一致性。在事务环境中,MSMQ支持分布式事务处理(DTC)来协调多个操作,保证消息要么全部成功发送,要么全部失败回滚。这对于关键业务系统至关重要,例如...

    MSMQ项目总结.rar

    MSMQ项目总结示例代码 MSMQ项目总结\MSMQ数据库数据传输.rar MSMQ项目总结\MSMQ基类.rar MSMQ项目总结\MQ事务性消息传输.rar MSMQ项目总结\MSMQ单线程监控.rar MSMQ项目总结\MSMQ文件发送接收.rar MSMQ项目总结\MSMQ...

    简单的MSMQ程序仅供学习

    MSMQ,全称为Microsoft Message Queuing,是微软提供的一种异步消息传递技术,主要用于在不同应用程序之间或在不可靠的网络环境中可靠地传递消息。它允许应用程序在无法立即响应的情况下发送消息,例如当接收方不...

    MSMQ通信程序

    这种技术特别适用于网络不稳定或系统间同步问题的情况。通过MSMQ,即使目标应用程序暂时无法接收,消息也不会丢失,而是被存储在队列中等待处理。 在“MSMQ2”和“MSMQ”这两个文件中,可能包含了实现MSMQ通信的...

    简单的msmq例子

    MSMQ,全称为Microsoft Message Queuing,是微软提供的一种异步消息传递技术。它允许应用程序在不同时刻发送和接收消息,即使发送方和接收方不在同一时间在线也能正常工作。这种技术对于处理网络不稳定、应用程序...

    MSMQ开发范例

    **MSMQ(Microsoft Message Queuing)开发范例详解** MSMQ,全称为Microsoft Message Queuing,是微软提供的一种异步消息传递技术。它允许应用程序在不可靠或延迟的网络环境中可靠地交换信息,通过将消息放入队列来...

Global site tag (gtag.js) - Google Analytics