powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Log4j -> ActiveMQ
20 сообщений из 20, страница 1 из 1
Log4j -> ActiveMQ
    #39858547
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Зависает при логгировании сообщения с помощью Log4j2 JMS Appender.

log4j2.xml
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <ThresholdFilter level="all"/>
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
        </Console>
        <JMS name="jmsQueue"
             destinationBindingName="logQueue"
             factoryBindingName="ConnectionFactory"
             factoryName="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
             providerURL="failover:tcp://192.168.0.xxx:xxxxxx"
             userName="xxx"
             password="xxx">
            <MessageLayout />
        </JMS>
    </Appenders>
    <Loggers>
        <Root level="all">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="jmsQueue"/>
        </Root>
    </Loggers>
</Configuration>


jndi.properties
Код: java
1.
queue.logQueue=Test_Queue


MainApp.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class MainApp {
    
    private static final Logger log
            = LogManager.getLogger(MainApp.class.getName());
    
    public static void main(String[] args) {
        log.info("Just a test!");
    }
    
}


На экране:
Код: java
1.
2.
 INFO | Successfully connected to tcp://192.168.0.158:61616
[INFO ] 2019-09-06 16:57:19.690 [main] MainApp - Just a test!


Run (MainApp) ...
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39858554
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он не зависает. Все отработало нормально как и ожидалось.
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39858564
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему тогда MainApp не завершается?
maytonОн не зависает. Все отработало нормально как и ожидалось.
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39858567
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу предположить что технология ActiveMq запускает пулы потоков которые надо завершить вручную. Как - хз. Надо почитать доки.
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39858581
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar, у меня с настройками логгера:

Код: xml
1.
2.
factoryName="org.jboss.naming.remote.client.InitialContextFactory"
providerURL="http-remoting://127.0.0.1:8080"



все нормально на клиенте завершается
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39858622
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Брокера надо проверить.
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39858634
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите, пожалуйста, все настройки и код
KachalovMolasar, у меня с настройками логгера:

Код: xml
1.
2.
factoryName="org.jboss.naming.remote.client.InitialContextFactory"
providerURL="http-remoting://127.0.0.1:8080"



все нормально на клиенте завершается
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39858635
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov, а как потом вы получаете сообщение и приводите к нужному типу?
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39858822
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нихена себе еще кто то jms пользует)
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859033
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarПокажите, пожалуйста, все настройки и код
- все остальное также как у Вас
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859034
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarKachalov, а как потом вы получаете сообщение и приводите к нужному типу?
- ничего особенного, тривиальный MDB:


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
@MessageDriven(name = "LogEntryListenerMDB", activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/queue/XXX"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") 
})
public class LogEntryListener implements MessageListener {
    
    private static final Logger LOG = LogManager.getLogger(LogEntryListener.class);
    
    @EJB
    private LogEntryDAO entryDAO;
    
    @Override
    public void onMessage(Message msg) {
        String text = null;
        try {
            if (!(msg instanceof TextMessage)) {
                throw new EJBException("invalid message type, need TextMessage");
            }
            TextMessage message = (TextMessage) msg;
            text = message.getText();
            JSONObject object = new JSONObject(text);            
            LogEntry entry = new LogEntry(object);
            entryDAO.addEntry(entry);            
        } catch (Exception ex) {
            LOG.error(text, ex);
        }
    }
    
}


...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859287
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня почему то принятое сообщение is not instanceof TextMessage...

KachalovMolasarKachalov, а как потом вы получаете сообщение и приводите к нужному типу?
- ничего особенного, тривиальный MDB:


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
@MessageDriven(name = "LogEntryListenerMDB", activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/queue/XXX"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") 
})
public class LogEntryListener implements MessageListener {
    
    private static final Logger LOG = LogManager.getLogger(LogEntryListener.class);
    
    @EJB
    private LogEntryDAO entryDAO;
    
    @Override
    public void onMessage(Message msg) {
        String text = null;
        try {
            if (!(msg instanceof TextMessage)) {
                throw new EJBException("invalid message type, need TextMessage");
            }
            TextMessage message = (TextMessage) msg;
            text = message.getText();
            JSONObject object = new JSONObject(text);            
            LogEntry entry = new LogEntry(object);
            entryDAO.addEntry(entry);            
        } catch (Exception ex) {
            LOG.error(text, ex);
        }
    }
    
}


...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859314
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarПокажите, пожалуйста, все настройки и код
- может дело в паттерне (я уже подзабыл какие там подводные камни были):


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<JMS name="JMS_LOGGER"
             userName="logger"
             password="logger"
             destinationBindingName="jms/queue/XXX" 
             factoryBindingName="jms/RemoteConnectionFactory"
             factoryName="org.jboss.naming.remote.client.InitialContextFactory"
             providerURL="http-remoting://127.0.0.1:8080"
             ignoreExceptions="true"
             immediateFail="true">
            <PatternLayout>
                <pattern>%m</pattern>
            </PatternLayout>
        </JMS>


...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859340
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы используете файл jndi.properties?
Если я указываю, как вы, destinationBindingName="jms/queue/Имя очереди" без ссылки на jndi, то получаю ошибку:
ERROR An exception occurred processing Appender jmsQueue org.apache.logging.log4j.core.appender.AppenderLoggingException: Error sending to JMS Manager 'jmsQueue': JMS message producer not available

Чтобы не было ошибки, я использую:
destinationBindingName="destinationBindingName="logQueue"
а в файле jndi.properties указываю:
queue.logQueue=DSS_Test_Queue
KachalovMolasarПокажите, пожалуйста, все настройки и код
- может дело в паттерне (я уже подзабыл какие там подводные камни были):


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<JMS name="JMS_LOGGER"
             userName="logger"
             password="logger"
             destinationBindingName="jms/queue/XXX" 
             factoryBindingName="jms/RemoteConnectionFactory"
             factoryName="org.jboss.naming.remote.client.InitialContextFactory"
             providerURL="http-remoting://127.0.0.1:8080"
             ignoreExceptions="true"
             immediateFail="true">
            <PatternLayout>
                <pattern>%m</pattern>
            </PatternLayout>
        </JMS>


...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859380
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarВы используете файл jndi.properties?
Если я указываю, как вы, destinationBindingName="jms/queue/Имя очереди" без ссылки на jndi, то получаю ошибку
- не надо указывать "как я". У меня на бэкенде WildFly со встроенным JMS провайдером (Artemis), а на клиенте (для тестов) консольное Java приложение без дополнительных настроек JNDI (только то что указано в настройках Log4J2). У Вас бэкенд другой.
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859391
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял.

А можно передавать свои объекты в JMS через Log4j?
Что типа:
Код: java
1.
2.
3.
Person person = new Person();
person.setName("Peter");
logger.info(person);



KachalovMolasarВы используете файл jndi.properties?
Если я указываю, как вы, destinationBindingName="jms/queue/Имя очереди" без ссылки на jndi, то получаю ошибку
- не надо указывать "как я". У меня на бэкенде WildFly со встроенным JMS провайдером (Artemis), а на клиенте (для тестов) консольное Java приложение без дополнительных настроек JNDI (только то что указано в настройках Log4J2). У Вас бэкенд другой.
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859404
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarА можно передавать свои объекты в JMS через Log4j?
Что типа:
Код: java
1.
2.
3.
Person person = new Person();
person.setName("Peter");
logger.info(person);



- вроде можно, но будут сложности: объект должен быть сериализуемым и класс сериализуемого объекта должен быть доступен на принимающей стороне (в CLASSPATH ActiveMQ). IMHO, лучше сериализовать как строку в XML или JSON - дешевле для здоровья
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859438
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть объект Event, в котором одно поле Properties.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Event event = new Event();
event.getProperties().put("id", "12345678");
event.getProperties().put("type", "transaction");

ByteArrayOutputStream byteArrayOutputStream
        = new ByteArrayOutputStream();
try (ObjectOutputStream objectOutputStream
        = new ObjectOutputStream(byteArrayOutputStream)) {
     objectOutputStream.writeObject(event);
            objectOutputStream.flush();
     }
        
logger.info(byteArrayOutputStream);
Message message = consumer.receive();
        
ByteArrayOutputStream byteArrayOutputStream2 
      = (ByteArrayOutputStream) ((ObjectMessage) message)
             .getObject();


Ошибка:
Exception in thread "main" java.lang.ClassCastException: org.apache.activemq.command.ActiveMQTextMessage cannot be cast to javax.jms.ObjectMessage
Такое ощущение, что всё что передается в логгер преобразуется в тип TextMessage.

KachalovMolasarА можно передавать свои объекты в JMS через Log4j?
Что типа:
Код: java
1.
2.
3.
Person person = new Person();
person.setName("Peter");
logger.info(person);



- вроде можно, но будут сложности: объект должен быть сериализуемым и класс сериализуемого объекта должен быть доступен на принимающей стороне (в CLASSPATH ActiveMQ). IMHO, лучше сериализовать как строку в XML или JSON - дешевле для здоровья
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859447
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал через Json cериализацию:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Event event = new Event();
        event.getProperties().put("id", "12345678");
        event.getProperties().put("type", "transaction");

        StringWriter writer = new StringWriter();
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(writer, event);
        String result = writer.toString();

        logger.info(result);
        ActiveMQConnectionFactory connectionFactory
                = new ActiveMQConnectionFactory(username, password, url);
        connectionFactory.setTrustAllPackages(true);

        Connection connection = connectionFactory.createConnection();
        ((ActiveMQConnection) connection).setUseAsyncSend(true);
        connection.start();
        Session session = connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);
        MessageConsumer consumer
                = session.createConsumer(session.createQueue(queue));

        Thread.sleep(500);
        Message message = consumer.receive();

        TextMessage textMessage = (TextMessage) message;
        
        StringReader reader = new StringReader(textMessage.getText());
        mapper = new ObjectMapper();
        event = mapper.readValue(reader, Event.class);
...
Рейтинг: 0 / 0
Log4j -> ActiveMQ
    #39859674
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда десктоп приложение висит и не закрывается, через JVisaulVM вижу активный процесс ActiveMQ Transport.
Как правильно закрыть этот процесс, чтобы приложение нормально закрывалось?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Log4j -> ActiveMQ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]