SpringBoot应用程序发布并读取ActiveMQ主题

2024-01-12

我有两个应该从一个主题中读取的接收器。但只有一个随机接收者收到消息,就像它实际上是从队列而不是主题中读取的一样。我读了this https://stackoverflow.com/questions/40144561/how-to-listen-to-topic-using-spring-boot-jms答案,但似乎不起作用。这是我的代码。

应用程序.java:

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;

import javax.jms.ConnectionFactory;

@SpringBootApplication
@EnableJms
public class Application {
    public static final String MAILBOX_TOPIC = "inbox.topic";

    public static void main(String[] args) {
        // Launch the application
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

        JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);

        // Send a message with a POJO - the template reuse the message converter
        System.out.println("Sending an email message.");
        jmsTemplate.convertAndSend(MAILBOX_TOPIC, new Email("[email protected] /cdn-cgi/l/email-protection", "Hello"));
    }

    @Bean
    public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory,
                                                               DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setPubSubDomain(true);
        configurer.configure(factory, connectionFactory);
        return factory;
    }

    @Bean // Serialize message content to json using TextMessage
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }
}

FirstReceiver.java:

package hello;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import static hello.Application.MAILBOX_TOPIC;

@Component
public class FirstReceiver {

    @JmsListener(destination = MAILBOX_TOPIC, containerFactory = "topicListenerFactory")
    public void receiveMessage(Email email) {
        System.out.println("FirstReceiver <" + email + ">");
    }

}

SecondReceiver.java:

package hello;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

import static hello.Application.MAILBOX_TOPIC;

@Component
public class SecondReceiver {
    @JmsListener(destination = MAILBOX_TOPIC, containerFactory = "topicListenerFactory")
    public void receiveMessage(Email email) {
        System.out.println("SecondReceiver <" + email + ">");
    }

}

电子邮件.java:

package hello;

public class Email {

    private String to;
    private String body;

    public Email() {
    }

    public Email(String to, String body) {
        this.to = to;
        this.body = body;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    @Override
    public String toString() {
        return String.format("Email{to=%s, body=%s}", getTo(), getBody());
    }

}

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-messaging-jms</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

请帮助我。


add spring.jms.pub-sub-domain=true to application.properties

UPDATE:

你需要改变两件事:

1.

@Bean
public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory,
                                                           DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    // the configurer will use PubSubDomain from application.properties if defined or false if not
    //so setting it on the factory level need to be set after this
    configurer.configure(factory, connectionFactory);
    factory.setPubSubDomain(true);
    return factory;
}

2.

    jmsTemplate.convertAndSend( new ActiveMQTopic(MAILBOX_TOPIC), new Email("[email protected] /cdn-cgi/l/email-protection", "Hello"));

或者注入这个bean

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot应用程序发布并读取ActiveMQ主题 的相关文章

随机推荐

  • 如何在高图表中包装图例项目?

    我在使用 highcharts 时遇到了一个大问题 因为我已经尝试了几个小时来包装图例项目 如果它们很长 我尝试设置图例和图例项宽度 但我的文本仍然从图例中出来 我唯一发现的就是改变highcharts src js但我认为这不是解决这个问
  • Apex 代码版本控制

    有没有办法集成 Apex 和 Visualforce 代码的版本控制系统 我可以考虑保留一个单独的存储库 但无法将其与 Salesforce Platform 集成 提前致谢 您可以通过使用 Subversion 和 Force com E
  • 如何判断一个点是否在圆内?

    如何测试 LatLng 点是否在圆的范围内 谷歌地图 JavaScript v3 getBounds 方法返回圆的边界框 圆是一个矩形 因此如果一个点落在圆之外但在边界框内 您将得到错误的答案 Use the 球面几何库 https dev
  • 如何访问列表中的随机项?

    我有一个 ArrayList 我需要能够单击一个按钮 然后从该列表中随机挑选一个字符串并将其显示在消息框中 我该怎么做呢 创建一个实例Random某处上课 请注意 不要在每次需要随机数时都创建一个新实例 这一点非常重要 您应该重用旧实例以实
  • spring boot OAuth2 基于角色的授权

    我们有一个扩展 AuthorizationServerConfigurerAdapter 的专用授权服务器 我们在其中设置了覆盖 void configure ClientDetailsS erviceConfigurerclients 方
  • Goertzel算法获取相位?

    我正在使用 Goertzel 算法来获取特定频率的幅度 我现在正在尝试从中获取相位 但我不知道如何 有人可以解释一下 并向我展示如何从这段代码中获取某个 f 的相位吗 另外 我使用它的频率为 16khz 采样率为 44 1 我可以运行的最小
  • 有没有办法在不调用 System.exit() 的情况下终止使用 java3d 的 java 应用程序?

    Java3D 启动多个系统线程 并且不会在它们上设置 isDaemon 标志 当我处置应用程序的 唯一 JFrame 时 它 不会终止 因为这些线程仍在运行 调用 System exit 似乎是终止应用程序的唯一方法 当然 或者从外部杀死它
  • 查找位数组中的第一个零

    我有一个位图 uint64 t bitmap 10000 跟踪系统中分配的资源 现在的问题是如何有效地找到该位图中的第一个未设置 零 位 我知道有ffsll unsigned long long 在 glibc 中查找第一个设置位 我认为这
  • 我正在使用带有加号按钮的底部选项卡,但是加号按钮在 android 中的本机反应中的一半区域中不可单击?

    我在 React Native 中使用 react navigation bottom tabs 我需要该区域上方的加号按钮 所以我能够实现它 但在 Android 中 加号图标的上方一半区域在 android 中不可单击 但在 IOS 中
  • 使用 ApplicationSettingsBase 存储通用 List

    我正在尝试使用 ApplicationSettingsBase 保存 List 但是即使填充了列表 它也仅输出以下内容
  • Foundation Small-12 色谱柱的更改顺序

    我有一个布局 左侧有图像 右侧有文本 适用于中型和大型视图 不过 我希望文本位于 small 12 上的图像之前 拉 推机制似乎不适用于 xxx 12 列 这些是我的 div div class large 4 medium 6 small
  • 如何在 Matlab 中将单个二维曲线绘制到颜色图上?

    我使用 Matlab 中现有的编译数据创建了一个平滑的颜色渐变二维等值线图 我将 x 轴 y 轴和 z 数据轮廓绘制为颜色图 我的目标是在颜色图上绘制一条二维曲线 代表单个 z 数据值 但我不知道如何做 有谁知道如何将 2 D 曲线绘制到
  • Dijkstra 的单源最短路径,带有权重为“w”的额外边

    在最近的一次采访中 我被要求实现单源最短路径算法 用于无向和正加权图 并稍作修改 即我们获得了权重为 w 的额外边缘 我们必须找到一条比 SSSP 算法计算的路径更短的路径 通过在两个尚未连接的节点之间连接权重 w 的额外边 这是一张图片
  • 在 Android 中使用 Google Maps API 从用户位置获取附近地点的结果

    这是第一次使用谷歌地图API和谷歌地点API 我正在做一个演示应用程序 它显示距离用户位置最近的医院列表 例如 以及到每家医院的路线 我能够使用下面的代码获取用户的位置 public class MainActivity extends A
  • 为什么对话框会删除其内容而不刷新?

    我遇到了一个非常奇怪的问题 窗口似乎正在擦除其内容 并且在擦除后没有重新绘制它 该对话框源自CDHtmlDialog 我认为这是问题的一部分 发生某种非确定性代码执行 导致某些代码在某些情况下先于其他代码执行 而在其他情况下则相反 涉及的消
  • android可扩展列表视图从firebase检索数据

    我该如何使用firebase检索我的数据Expandable listview my firebase节点是这样的 适配器类 public class CustomExpandableListViewAdapter extends Base
  • 等待进程结束

    您好 我必须编写必须打开一些系统属性的程序 例如 Process sound new Process sound StartInfo FileName mmsys cpl sound Start Place 1 Process device
  • numpy:沿新轴扩展数组?

    当然一定有办法做到这一点 我无法解决 我有一个 9 4 数组 我想沿第三轴重复它 4096 次 所以它变得简单 9 4 4096 9 4 数组中的每个值简单地重复 4096 次沿着新的轴线 如果我可疑的 3D 图有意义 对角线是 z 轴 4
  • 雅可比坐标系中的椭圆曲线加法

    我尝试在素数场上的椭圆曲线上添加两个点 将这些点从仿射 仿射坐标转换 但无法获得正确的结果 我正在测试的曲线有 a 0 任何人都可以看到出了什么问题吗 From Affine BigInteger X1 P x BigInteger Y1
  • SpringBoot应用程序发布并读取ActiveMQ主题

    我有两个应该从一个主题中读取的接收器 但只有一个随机接收者收到消息 就像它实际上是从队列而不是主题中读取的一样 我读了this https stackoverflow com questions 40144561 how to listen