【问题标题】:Topic creation in ActiveMQActiveMQ 中的主题创建
【发布时间】:2012-07-18 21:27:16
【问题描述】:

http://docs.oracle.com/javaee/1.4/api/javax/jms/Session.html#createTopic(java.lang.String) 此 API 表示 session.createTopic(topicname) 不是用于创建物理主题。这是什么意思?

如果我希望一组具有“admin”权限的用户负责创建主题,而另一组具有“write”权限的用户负责向该主题发布消息,我该如何实现?看来后一组也必须有“admin”的权限,因为他们必须使用这种方法:session.createTopic(topicname)

如何区分“admin”和“write”权限?

【问题讨论】:

    标签: java activemq authority


    【解决方案1】:

    JMS 规范的意思是 createTopic(String) 用于为您提供一个逻辑句柄(javax.jms.Topic,Destination 的子类型),您随后可以在其他调用中使用该句柄,例如 createProducer(Destination) 或 createConsumer (目的地)。在 ActiveMQ 中,a physical destination will be created at the same time 就是这样发生的。

    如果您想确保用户只能发布到已创建的目标,请分配该组的读写权限,而不是管理员权限。显然,假设这些主题已经存在 - 如果它们不存在,那么您将抛出异常。

    您还没有确切说明您希望如何管理主题创建,但如果您可以在 ActiveMQ 配置中将它们设置为 created at startup,然后在目标块中定义这些主题:

    <broker xmlns="http://activemq.apache.org/schema/core">
      <destinations>
        <topic physicalName="topic.1" />
        <topic physicalName="topic.2" />
      </destinations>
    </broker>
    

    【讨论】:

    • 哦,这正是我现在的问题。我不想使用 ActiveMQ 配置,因为我需要重新启动服务器才能使更改生效。我现在正在做的是在另一个应用程序中调用session.createTopic(topicname),但似乎这不起作用。你有什么建议吗?
    • 回答批准后发表评论。我会非常小心地以编程方式执行此操作,因为您正在引入一个隐藏的时间问题。如果出于某种原因,您需要删除消息存储(可能安装在新服务器上),则该主题创建代码需要在您的任何普通订阅者连接消息之前运行。因此,虽然您可能可以让它工作,但您应该考虑将来如何操作该系统。
    • 是的,这确实是一个我应该考虑的问题。但是如果主题不存在,订阅者会得到一个异常,也许我可以让他稍后连接?
    • 另外,你能帮我解决这个问题吗? stackoverflow.com/questions/11494795/activemq-authorization
    【解决方案2】:

    JMS api 不用于管理,仅用于使用现有主题和队列。在 ActiveMQ 中,默认是物理队列/主题在需要时自动创建(有人正在向它发送/从它消费)。

    如何在 JMS 实现中创建物理对象是特定于供应商的,您应该查看 ActiveMQ 中是如何处理的。

    How this is treated in AMQ

    【讨论】:

    • "物理队列/主题会在需要时自动创建(有人向它发送/从它消费)"---这是否意味着如果我只调用session.createTopic(topicname),物理不会创建主题?因此,如果我想创建一个物理主题,我需要发布一些内容吗?
    • 真的真的非常感谢,它现在可以工作了!在发布者发布消息之前,我向新创建的主题发布了一些内容。嗯,我已经为此工作了几天,终于成功了。
    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2021-07-14
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2018-08-03
    • 2018-06-01
    相关资源
    最近更新 更多