Java 通过ActiveMQ代理插件发送消息

Java 通过ActiveMQ代理插件发送消息,java,activemq,Java,Activemq,我正在使用ActiveMQ 5.16.1。我正试图使用下面的代码片段,通过类的send消息发送有关主题的消息 public void addConnection(ConnectionContext上下文,ConnectionInfo信息)引发异常{ 试一试{ ActiveMQTextMessage=新的ActiveMQTextMessage(); message.setText(“你好”); message.setType(“abc”); ActiveMQDestination amqDesti

我正在使用ActiveMQ 5.16.1。我正试图使用下面的代码片段,通过类的send消息发送有关主题的消息

public void addConnection(ConnectionContext上下文,ConnectionInfo信息)引发异常{
试一试{
ActiveMQTextMessage=新的ActiveMQTextMessage();
message.setText(“你好”);
message.setType(“abc”);
ActiveMQDestination amqDestination=新的ActiveMQTopic();
amqDestination.setPhysicalName(“你好”);
message.setDestination(amqDestination);
ProducerBrokerExchange ProducerBrokerExchange=新ProducerBrokerExchange();
producerBrokerExchange.setConnectionContext(上下文);
发送(producerBrokerExchange、消息);
}
捕获(例外情况除外){
logger.error(“发送消息时出错”);
logger.error(例如toString());
}
}
public void send(final ProducerBrokerExchange producerExchange,final messageSend)引发异常{
super.send(producerExchange、messageSend);
}
调用覆盖的send方法时,我得到:

java.lang.NullPointerException
    at org.apache.activemq.broker.region.Topic.send(Topic.java:367)
    at org.apache.activemq.broker.region.AbstractRegion.send(AbstractRegion.java:508)
    at org.apache.activemq.broker.region.RegionBroker.send(RegionBroker.java:477)
    at org.apache.activemq.broker.jmx.ManagedRegionBroker.send(ManagedRegionBroker.java:293)
    at org.apache.activemq.broker.BrokerFilter.send(BrokerFilter.java:154)
    at org.apache.activemq.broker.CompositeDestinationBroker.send(CompositeDestinationBroker.java:96)
    at org.apache.activemq.broker.TransactionBroker.send(TransactionBroker.java:295)
    at org.apache.activemq.broker.BrokerFilter.send(BrokerFilter.java:154)
    at com.ef.apps.amq.plugin.TopicAuthorization.send(TopicAuthorization.java:85)
    at com.ef.apps.amq.plugin.TopicAuthorization.addConnection(TopicAuthorization.java:67)
    at org.apache.activemq.broker.BrokerFilter.addConnection(BrokerFilter.java:99)
    at org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:844)
    at org.apache.activemq.broker.jmx.ManagedTransportConnection.processAddConnection(ManagedTransportConnection.java:77)
    at org.apache.activemq.command.ConnectionInfo.visit(ConnectionInfo.java:139)
    at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:331)
    at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:200)
    at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50)
    at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:125)
    at org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:301)
    at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
    at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:233)
    at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)
    at java.lang.Thread.run(Thread.java:748)

我的要求是在创建新连接时发送有关主题的消息。

您需要正确初始化ProducerBrokerExchange和出站消息才能正常工作。您还需要知道,如果配置启用了生产者流控制,则发送可能会被阻止

下面是“AdvisoryBroker.java”中的一个示例方法,该方法激发ActiveMQ advisory message以获取灵感,请注意要正确发送消息所需的MessageID等详细信息

public void fireAdvisory(ConnectionContext context, ActiveMQTopic topic, Command command, ConsumerId targetConsumerId, ActiveMQMessage advisoryMessage) throws Exception {
    //set properties
    advisoryMessage.setStringProperty(AdvisorySupport.MSG_PROPERTY_ORIGIN_BROKER_NAME, getBrokerName());
    String id = getBrokerId() != null ? getBrokerId().getValue() : "NOT_SET";
    advisoryMessage.setStringProperty(AdvisorySupport.MSG_PROPERTY_ORIGIN_BROKER_ID, id);

    String url = getBrokerService().getVmConnectorURI().toString();
    //try and find the URL on the transport connector and use if it exists else
    //try and find a default URL
    if (context.getConnector() instanceof TransportConnector
            && ((TransportConnector) context.getConnector()).getPublishableConnectString() != null) {
        url = ((TransportConnector) context.getConnector()).getPublishableConnectString();
    } else if (getBrokerService().getDefaultSocketURIString() != null) {
        url = getBrokerService().getDefaultSocketURIString();
    }
    advisoryMessage.setStringProperty(AdvisorySupport.MSG_PROPERTY_ORIGIN_BROKER_URL, url);

    //set the data structure
    advisoryMessage.setDataStructure(command);
    advisoryMessage.setPersistent(false);
    advisoryMessage.setType(AdvisorySupport.ADIVSORY_MESSAGE_TYPE);
    advisoryMessage.setMessageId(new MessageId(advisoryProducerId, messageIdGenerator.getNextSequenceId()));
    advisoryMessage.setTargetConsumerId(targetConsumerId);
    advisoryMessage.setDestination(topic);
    advisoryMessage.setResponseRequired(false);
    advisoryMessage.setProducerId(advisoryProducerId);
    boolean originalFlowControl = context.isProducerFlowControl();
    final ProducerBrokerExchange producerExchange = new ProducerBrokerExchange();
    producerExchange.setConnectionContext(context);
    producerExchange.setMutable(true);
    producerExchange.setProducerState(new ProducerState(new ProducerInfo()));
    try {
        context.setProducerFlowControl(false);
        next.send(producerExchange, advisoryMessage);
    } finally {
        context.setProducerFlowControl(originalFlowControl);
    }
}

请包括异常详细信息,否则您只是让人们猜测我正在使用ActiveMQ 5.16.1