Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Log4j -> ActiveMQ / 20 сообщений из 20, страница 1 из 1
06.09.2019, 17:01
    #39858547
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Всем привет!

Зависает при логгировании сообщения с помощью 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
06.09.2019, 17:14
    #39858554
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Он не зависает. Все отработало нормально как и ожидалось.
...
Рейтинг: 0 / 0
06.09.2019, 17:30
    #39858564
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Почему тогда MainApp не завершается?
maytonОн не зависает. Все отработало нормально как и ожидалось.
...
Рейтинг: 0 / 0
06.09.2019, 17:36
    #39858567
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Могу предположить что технология ActiveMq запускает пулы потоков которые надо завершить вручную. Как - хз. Надо почитать доки.
...
Рейтинг: 0 / 0
06.09.2019, 17:53
    #39858581
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Molasar, у меня с настройками логгера:

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



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

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



все нормально на клиенте завершается
...
Рейтинг: 0 / 0
06.09.2019, 20:29
    #39858635
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Kachalov, а как потом вы получаете сообщение и приводите к нужному типу?
...
Рейтинг: 0 / 0
07.09.2019, 18:32
    #39858822
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
нихена себе еще кто то jms пользует)
...
Рейтинг: 0 / 0
08.09.2019, 21:15
    #39859033
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
MolasarПокажите, пожалуйста, все настройки и код
- все остальное также как у Вас
...
Рейтинг: 0 / 0
08.09.2019, 21:18
    #39859034
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
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
09.09.2019, 12:35
    #39859287
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
У меня почему то принятое сообщение 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
09.09.2019, 13:41
    #39859314
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
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
09.09.2019, 14:23
    #39859340
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Вы используете файл 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
09.09.2019, 15:08
    #39859380
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
MolasarВы используете файл jndi.properties?
Если я указываю, как вы, destinationBindingName="jms/queue/Имя очереди" без ссылки на jndi, то получаю ошибку
- не надо указывать "как я". У меня на бэкенде WildFly со встроенным JMS провайдером (Artemis), а на клиенте (для тестов) консольное Java приложение без дополнительных настроек JNDI (только то что указано в настройках Log4J2). У Вас бэкенд другой.
...
Рейтинг: 0 / 0
09.09.2019, 15:25
    #39859391
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Понял.

А можно передавать свои объекты в 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
09.09.2019, 15:39
    #39859404
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
MolasarА можно передавать свои объекты в JMS через Log4j?
Что типа:
Код: java
1.
2.
3.
Person person = new Person();
person.setName("Peter");
logger.info(person);



- вроде можно, но будут сложности: объект должен быть сериализуемым и класс сериализуемого объекта должен быть доступен на принимающей стороне (в CLASSPATH ActiveMQ). IMHO, лучше сериализовать как строку в XML или JSON - дешевле для здоровья
...
Рейтинг: 0 / 0
09.09.2019, 16:31
    #39859438
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
У меня есть объект 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
09.09.2019, 16:51
    #39859447
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Сделал через 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
10.09.2019, 09:13
    #39859674
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Log4j -> ActiveMQ
Когда десктоп приложение висит и не закрывается, через JVisaulVM вижу активный процесс ActiveMQ Transport.
Как правильно закрыть этот процесс, чтобы приложение нормально закрывалось?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Log4j -> ActiveMQ / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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