使用Azure上的AppFabric ServiceBus实现可靠的角色间通信,IObserver模式

时间:2011-02-15 21:40:17

标签: azure communication appfabric servicebus azure-worker-roles

我一直在尝试关注this example(从网站上的链接或here下载源代码,但我一直遇到示例中嵌入的错误。

我的程序如下(安装AppFabric SDK和其他依赖项后):

  1. 下载来源
  2. 在AppFabric上创建服务命名空间。
  3. 将项目导入具有一个辅助角色的新Windows Azure项目,确保它全部编译并且默认的辅助角色运行()方法启动并运行。
  4. 使用我的AppFabric服务命名空间中的ServiceNameSpace和IssuerSecret在InterRoleCommunicationExtension.cs中配置方法GetInterRoleCommunicationEndpoint(IssuerName和ServicePath保持默认值)。这是我自己的参数的硬连线。
  5. 将初始化逻辑从演示中的“SampleWorkerRole.cs”文件复制/粘贴到项目的Worker Role的OnStart()方法中
  6. 注释掉对Tracemanager。*的引用,因为演示代码没有实现Tracemanager方法,并且它们对于此测试的工作并不重要。这些参考文献中大约有7-10个(只需在整个解决方案中执行查找 - >“Tracemanager”)。
  7. 成功构建。
  8. 在本地Compute Emulator上运行。
  9. 当我运行此测试时,在初始化新的InterRoleCommunicationExtension(要初始化的第一个角色间通信基础架构this.interRoleCommunicator = new InterRoleCommunicationExtension();)期间,会出现错误:“值不能是null。参数名称:contractType。“

    稍微深入研究一下,我在ServiceBusHostFactory.cs(示例中的一个文件)中执行以下方法:
    public static Type GetServiceContract(Type serviceType) { Guard.ArgumentNotNull(serviceType, "serviceType");

    {{1} }

            Type[] serviceInterfaces = serviceType.GetInterfaces();
    
            if (serviceInterfaces != null && serviceInterfaces.Length > 0)
            {
                foreach (Type serviceInterface in serviceInterfaces)
                {
                    ServiceContractAttribute serviceContractAttr = FrameworkUtility.GetDeclarativeAttribute<ServiceContractAttribute>(serviceInterface);
    
                    if (serviceContractAttr != null)
                    {
                        return serviceInterface;
                    }
                }
            }
    
            return null;
        }
    


    serviceType参数的Name属性是“IInterRoleCommunicationServiceContract”,它是演示的一个类,它扩展了IObservable。对serviceType.GetInterfaces()的调用返回“System.IObservable`1”接口,然后将其传递到 Type[] serviceInterfaces = serviceType.GetInterfaces(); if (serviceInterfaces != null && serviceInterfaces.Length > 0) { foreach (Type serviceInterface in serviceInterfaces) { ServiceContractAttribute serviceContractAttr = FrameworkUtility.GetDeclarativeAttribute<ServiceContractAttribute>(serviceInterface); if (serviceContractAttr != null) { return serviceInterface; } } } return null; } ,其中包含以下代码:

    FrameworkUtility.GetDeclarativeAttribute(serviceInterface);

    public static IList GetDeclarativeAttributes(Type type) where T : class { Guard.ArgumentNotNull(type, "type"); 1,“此方法返回一个空数组,这会导致函数返回null,并将上述消息的异常返回到被提出。

    我非常有兴趣让这个场景有效,因为我认为发布/订阅消息传递范例是我的应用程序的完美解决方案。有没有人能够获得这个演示代码(来自AppFabric CAT团队本身!)工作,或者可以发现我的错误?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

在原始博文中回答(见下面的链接)。如果您仍然遇到问题,请告知。我们致力于尽最大努力支持我们的样品。

http://blogs.msdn.com/b/appfabriccat/archive/2010/09/30/implementing-reliable-inter-role-communication-using-windows-azure-appfabric-service-bus-observer-pattern-amp-parallel-linq.aspx#comments