Lin245709189 2019-05-14 11:55 采纳率: 100%
浏览 394
已采纳

activemq从节点获取不了主节点的队列内容?

activemq以jdbc持久化master+slave的方式配置(没有用zookeeper),启动时已看到链接成功

2019-05-14 11:15:28,562 | INFO  | Network connection between vm://slave#0 and tcp://0.0.0.0:61616 (master) has been established. | org.apache.activemq.network.DemandForwardingBridgeSupport | triggerStartAsyncNetworkBridgeCreation: remoteBroker=unconnected, localBroker= vm://slave#0

链接url,因为开发电脑虚拟出了两台虚机,所以都是61616端口,下面的ip实际上是不一样的

private String brokerURL = "failover://(tcp://0.0.0.0:61616,tcp://0.0.0.0:61616)";

两个节点启动完成后,程序发送信息

    public static void main(String[] args) {
        TestContro send = new TestContro();
        send.start();
    }

//    public static void main(String[] args) {
//      TestContro cons = new TestContro();
//      cons.consum();
//    }
//    
    public void start(){
        try {
            //根据用户名,密码,url创建一个连接工厂
            factory = new ActiveMQConnectionFactory(userName, password, brokerURL);
            //从工厂中获取一个连接
            connection = factory.createConnection();
            //测试过这个步骤不写也是可以的,但是网上的各个文档都写了
            connection.start();
            //创建一个session
            //第一个参数:是否支持事务,如果为true,则会忽略第二个参数,被jms服务器设置为SESSION_TRANSACTED
            //第二个参数为false时,paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个。
            //Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。哪怕是接收端发生异常,也会被当作正常发送成功。
            //Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会当作发送成功,并删除消息。
            //DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。
            session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
            //创建一个到达的目的地,其实想一下就知道了,activemq不可能同时只能跑一个队列吧,这里就是连接了一个名为"text-msg"的队列,这个会话将会到这个队列,当然,如果这个队列不存在,将会被创建
            destination = session.createQueue("test");
            //从session中,获取一个消息生产者
            producer = session.createProducer(destination);
            //设置生产者的模式,有两种可选
            //DeliveryMode.PERSISTENT 当activemq关闭的时候,队列数据将会被保存
            //DeliveryMode.NON_PERSISTENT 当activemq关闭的时候,队列里面的数据将会被清空
            producer.setDeliveryMode(DeliveryMode.PERSISTENT);

            //创建一条消息,当然,消息的类型有很多,如文字,字节,对象等,可以通过session.create..方法来创建出来
            TextMessage textMsg = session.createTextMessage("呵呵");
            for(int i = 0 ; i < 3 ; i ++){
                //发送一条消息
                producer.send(textMsg);
            }
            System.out.println("发送消息成功");
            //即便生产者的对象关闭了,程序还在运行哦
            producer.close();

        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

在主节点控制台能看到待消费数量增加,但是从节点看不到数量变化,而且杀死主节点后,程序自动连接从节点发送,mq报数据库主键冲突
配置文件

<networkConnectors>
<networkConnector uri="static:(tcp://x.x.x.x:61616)" duplex="false"/>
</networkConnectors>

求大神帮忙看看。

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-05-14 12:33
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?