2 идентичных слушателя JMS реализованы вместо 1-го. ActiveMQ и не может передать и получить объект - PullRequest
1 голос
/ 08 февраля 2020

Я пишу приложение в Spring (я не использую Spring Boost). Приложение использует JMS-брокер ActiveMQ.

Прослушиватель:

@Component
public class ReceiveMessage {

private HistoryService historyService;

@Autowired
public void setHistoryService(HistoryService historyService) {

    this.historyService = historyService;
}

 @JmsListener(destination = "my_topic")
public void receiveMessage(ObjectMessage objectMessage) throws JMSException {

    Object object = ((ObjectMessage) objectMessage).getObject();
    System.out.println(object);
    if(objectMessage.getObject() instanceof History) {
        History history = (History) objectMessage.getObject();
        try {
            historyService.add(history);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
 }

Источник сообщений:

@Component
public class MessageProducer {

@Autowired
JmsTemplate jmsTemplate;

public void sendMessage(History history) {
   jmsTemplate.send("my_topic", new MessageCreator() {
        public Message createMessage(Session session) throws JMSException {
            ObjectMessage objectMessage = session.createObjectMessage(history);
            return objectMessage;
        }
    }
    );
        }
}

Конфигурация JMS:

@Configuration
@EnableJms
@ComponentScan(basePackages = "com.mycomp")
public class JMSConfig {

String BROKER_URL = "tcp://localhost:61616";
String BROKER_USERNAME = "admin";
String BROKER_PASSWORD = "admin";

@Bean
public ActiveMQConnectionFactory connectionFactory(){
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    connectionFactory.setBrokerURL(BROKER_URL);
    connectionFactory.setPassword(BROKER_USERNAME);
    connectionFactory.setUserName(BROKER_PASSWORD);
    return connectionFactory;
}


@Bean
public JmsTemplate jmsTemplate(){
    JmsTemplate template = new JmsTemplate();
    template.setConnectionFactory(connectionFactory());
    template.setPubSubDomain(true); // для работы с topic
    //утсановка места назначения для отправки и приема по умалчанию
  // Destination defaultDestination = new ActiveMQTopic("my_topic");
  // template.setDefaultDestination(defaultDestination);

    return template;
}



@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    factory.setConcurrency("1-1");

    factory.setPubSubDomain(true); // для работы с topic
    return factory;
}

}

История класс:

@Entity (name = "History")
@Table(name = "HISTORY", schema = "PUBLIC")
public class History implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;

@Column(name = "CHANGETYPE")
private String changeType;

@Column(name = "CHANGEENTITY")
private String changeEntity;

@Column(name = "VALUE")
private String value;

public History(){
}
//..
//setters getters

ActiveMQ:

https://i.stack.imgur.com/iFDAz.png

Проблемы:

1) вместо 1 слушателя, 2 слушатели реализованы.

2) Я не могу привести объект при получении сообщения к типу History.

Я попытался посмотреть, что отправлено и получено в режиме отладки

Отправка в MessageProducer :

https://i.stack.imgur.com/OG02i.png

Вот что получает слушатель:

https://i.stack.imgur.com/cX06G.jpg

Но Кажется, что некоторые данные здесь:

https://i.stack.imgur.com/l1US5.png

...