RabbitMQ 원격 (Remote) 접속 시 다음과 같은 예외에 직면할 수 있다.


Caused by: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.


3.3.2-1 버전의 경우,


원격으로 guest 계정으로의 로그인이 막혀있기 때문이다.


추가한 계정으로 로그인 정보를 명시적으로 제공해야만 한다.


스프링 부트 (Spring Boot) AMQP를 사용한다면,


다음과 같이 ConnectionFactory를 생성하면 된다.


@Bean

ConnectionFactory connectionFactory(

@Value("${rabbitmq.server}") String server,

@Value("${rabbitmq.port}") int port,

@Value("${rabbitmq.username}") String username,

@Value("${rabbitmq.password}") String password) {

CachingConnectionFactory connectionFactory = new CachingConnectionFactory(

server, port);

connectionFactory.setUsername(username);

connectionFactory.setPassword(password);

return connectionFactory;

}

Posted by izeye

댓글을 달아 주세요

Netty에서 다음과 같은 예외에 직면할 수 있다.


io.netty.channel.ChannelPipelineException: com.izeye.test.service.ConsolePrintingChannelInboundHandler is not a @Sharable handler, so can't be added or removed multiple times.


해당 ChannelHandler에 @Sharable 애노테이션 (Annotation)을 추가해주면 된다.

Posted by izeye

댓글을 달아 주세요

다음과 같이 MyBatis에서 INSERT ... SELECT 쿼리로 생성된 키를 가져올 때,


<insert id="addSomething" parameterType="Somthing" useGeneratedKeys="true" keyColumn="SOMETHING_ID" keyProperty="id">

INSERT 

INTO 

    TB_SOMETHING

    (

        SOMETHING_ID, 

        NAME, 

        RGST_YMDT

    ) 

SELECT 

    SEQ_SOMETHING.NEXTVAL, 

    :name,

    SYSDATE 

FROM 

    DUAL 

WHERE 

    NOT EXISTS 

    (

    SELECT 

        1 

    FROM 

        TB_SOMETHING

    WHERE 

        NAME = 'Something' AND DEL_YMDT IS NULL

    )

</insert>


다음과 같은 에러에 직면한다.


Caused by: java.sql.SQLException: ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다


다음과 같이 스프링 (Spring) NamedParameterJdbcTemplate을 사용하더라도 동일한 문제가 있다.


@Autowired

DataSource dataSource;


NamedParameterJdbcTemplate jdbTemplate;


@Before

public void setUp() {

this.jdbTemplate = new NamedParameterJdbcTemplate(this.dataSource);

}


@Test

public void test() {

Map<String, Object> parameters = new HashMap<String, Object>();

parameters.put("name", "test");

String sql = "INSERT INTO TB_SOMETHING (SOMETHING_ID, NAME, RGST_YMDT) SELECT SEQ_SOMETHING.NEXTVAL, :name, SYSDATE FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM TB_SOMETHING WHERE NAME = :name AND DEL_YMDT IS NULL)";

KeyHolder keyHolder = new GeneratedKeyHolder();

SqlParameterSource sqlParameterSource = new MapSqlParameterSource(

parameters);

jdbTemplate.update(sql, sqlParameterSource);

// jdbTemplate.update(sql, sqlParameterSource, keyHolder);

// System.out.println(keyHolder);

}


INSERT ... SELECT 쿼리를 사용하든, 생성된 키를 취하든 둘 중에 하나만 가능하다.


이것이 JDBC 스펙 상의 문제인지, 오라클 (Oracle) JDBC 드라이버 (Driver)의 문제인지는 확인해보지 못했다.


Reference:

http://stackoverflow.com/questions/3261274/getting-inserted-id-after-insert-select-on-oracle

Posted by izeye

댓글을 달아 주세요

젠킨스 (Jenkins)에서 Gradle Plugin으로 빌드 (Build) 시 다음과 같은 에러에 직면할 수 있다.


FATAL: command execution failed

java.io.IOException: Cannot run program "gradle" (in directory "/var/lib/jenkins/workspace/Something"): error=2, 그런 파일이나 디렉터리가 없습니다


이 경우 다음과 같이 gradle 실행파일에 심볼릭 링크 (Symbolic Link)를 생성해서 해결할 수 있다.


sudo ln -s /home/izeye/programs/gradle-1.12/bin/gradle /usr/bin/gradle


이런 꽁수말고 일반적인 해결책이 있을 듯한데 귀찮아서 패스.

Posted by izeye

댓글을 달아 주세요

HttpServletResponse에서 다음 메소드들을 사용하려면, Servlet 3.0 이상을 사용해야만 한다.


response.getStatus();

response.getHeaderNames();

response.getHeader(headerName));


다음과 같이 Servlet 2.5에서


<dependency>

<groupId>javax.servlet</groupId>

<artifactId>servlet-api</artifactId>

<version>2.5</version>

<scope>provided</scope>

</dependency>


3.0으로 업그레이드하니


<dependency>

<groupId>javax.servlet</groupId>

<artifactId>servlet-api</artifactId>

<version>3.0</version>

<scope>provided</scope>

</dependency>


다음과 같은 에러가 발생했다.


Missing artifact javax.servlet:servlet-api:jar:3.0


다음과 같이 artifactId가 변경된 모양이다.


<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.0.1</version>

<scope>provided</scope>

</dependency>


References:

https://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/http/HttpServletResponseWrapper.html#getStatus()

http://stackoverflow.com/questions/1979957/maven-dependency-for-servlet-3-0-api

Posted by izeye

댓글을 달아 주세요

Gradle에서 다음과 같은 경고 (Warning) 발생 시


warning: [options] bootstrap class path not set in conjunction with -source 1.7


다음과 같이 bootClasspath 값을 설정해준다.


compileJava {

sourceCompatibility = 1.7

targetCompatibility = 1.7

options.bootClasspath="$System.env.JAVA_HOME/jre/lib/rt.jar"

}


물론 JAVA_HOME은 자바 (Java) 7이어야만 의미있겠다.


References:

http://stackoverflow.com/questions/7816423/warning-options-bootstrap-class-path-not-set-in-conjunction-with-source-1-5

https://blogs.oracle.com/darcy/entry/bootclasspath_older_source

http://stackoverflow.com/questions/22681544/how-to-set-gradle-options-bootclasspath-in-an-os-independent-manner

Posted by izeye

댓글을 달아 주세요

Gradle에서 빌드 (Build) 시 다음과 같은 에러에 직면할 수 있다.


invalid source release: 1.8

Could not execute build using Gradle distribution 'http://services.gradle.org/distributions/gradle-1.10-bin.zip'.


STS.ini 파일 내 다음과 같이 JDK 1.8로 설정한다.


-vm

C:\Program Files\Java\jdk1.8.0_05\bin/javaw.exe


Reference:

http://forums.gradle.org/gradle/topics/gradle_1_10_and_java8_jdk8_invalid_source_release_1_8

Posted by izeye

댓글을 달아 주세요

glibc 2.3.4에서 자바 7 구동 시 다음과 같은 에러가 발생한다.


$ ./java

Error: dl failure on line 863

Error: failed /home/izeye/programs/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so, because /lib64/tls/libc.so.6: version `GLIBC_2.4' not found (required by /home/izeye/programs/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so)

$


glibc 버전을 업그레이드하거나, OS를 새로 설치해야만 한다.


glibc에 대한 의존성이 복잡하기 때문에 가능하다면 OS 재설치가 쉽겠다.

Posted by izeye

댓글을 달아 주세요

톰캣 (Tomcat) JSP 파일 (File)을 고속으로 요청하면,


다음과 같은 예외에 직면할 수 있다.


Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: Java heap space


톰캣에 메모리 누수 (Memory Leak)가???


힙 덤프 (Heap Dump)를 확인해보니,


ConcurrentHashMap 관련 객체가 엄청나게 쌓여있었다.


ConcurrentHashMap 레퍼런스 (Reference) 확인하니, StandardSession 객체였다.


conf/web.xml을 확인하니, 다음과 같이 세션 타이아웃 (Session Timeout)이 30분이었다.


<session-config>

  <session-timeout>30</session-timeout>

</session-config>


JSP 페이지 (Page)가 세션을 유지할 필요가 없다면, 다음과 같이 해결할 수 있다.


<%@ page session="false" %>

Posted by izeye

댓글을 달아 주세요

자바 메모리 누수를 확인하기 위해


JConsole의 Memory 탭 내 Memory Pool "PS Old Gen" 차트 (Chart)가 계속 증가함을 확인한다.


메모리 누수가 확인되면,


jmap 명령으로 다음과 같이 힙 (Heap) 덤프 (Dump)를 한다.


$ jps

3913 Bootstrap

3955 Jps

$ jmap -dump:format=b,file=heap.dump.hprof 3913


힙 덤프 파일 (File)은 Mat (Memory Analyzer)를 통해 분석할 수 있다.


File -> Open Heap Dump... -> Histogram


List objects -> with incoming references


References:

http://www.idanfridman.com/java/monitoring-and-fixing-memory-leaks-in-your-application/

http://www.eclipse.org/mat/

Posted by izeye

댓글을 달아 주세요