You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apex.apache.org by "Kottapalli, Venkatesh" <VK...@DIRECTV.com> on 2015/11/03 23:37:38 UTC

Regarding logging and exception handling framework

Hi,

                With the framework malhar has, Can we use AOP interception technique for logging and exception handling?  I have tried but unable to proxy Operator classes to intercept during DAG preparation. Please suggest.

Regards,
Venkatesh.

Re: Regarding logging and exception handling framework

Posted by Timothy Farkas <ti...@datatorrent.com>.
Hi Venkatesh,

Can you provide a small code example of what you are trying to do, as well
as the error message you are receiving?

Thanks,
Tim

On Tue, Nov 3, 2015 at 2:37 PM, Kottapalli, Venkatesh <
VKottapalli@directv.com> wrote:

> Hi,
>
>                 With the framework malhar has, Can we use AOP interception
> technique for logging and exception handling?  I have tried but unable to
> proxy Operator classes to intercept during DAG preparation. Please suggest.
>
> Regards,
> Venkatesh.
>

Re: Regarding logging and exception handling framework

Posted by Chandni Singh <ch...@datatorrent.com>.
Hi Venkatesh,

I am not very familiar with AOP but here is some information I found and I
guess you may have seen this as well.
http://stackoverflow.com/questions/13461985/classcastexception-proxy-cannot-be-cast-to-using-aop

This says that target object needs to implement an interface. However it
refers to the link below if the target is a class.

http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html

Can you please follow the steps in the above doc and let me know how it
goes.

Thanks,
Chandni


On Tue, Nov 3, 2015 at 3:44 PM, Kottapalli, Venkatesh <
VKottapalli@directv.com> wrote:

> I am trying to log exceptions, some entry and exit parameters for certain
> function calls in my implementation, hence I have defined beans to
> intercept in the following way. Please let me know if you need more inputs
> on this.
>
> I have used spring core jars :
> =====================
>                 <dependency>
>                         <groupId>org.springframework</groupId>
>                         <artifactId>spring-core</artifactId>
>                         <version>${spring.version}</version>
>                 </dependency>
>                 <dependency>
>                         <groupId>org.springframework</groupId>
>                         <artifactId>spring-context</artifactId>
>                         <version>${spring.version}</version>
>                 </dependency>
>
>
> ApplicationContext definitions :
> ===========================
>
>         <bean id=" fileSplitter" class="com.package.SimpleService"/>
>         <bean id="secondServiceBean" class="com.package.SecondService"/>
>
>         <bean id="logEntryBean" class="com.package.LogEntry" />
>         <bean id="logExitBean" class="com.package.LogReturn" />
>         <bean id="logExceptionBean" class
> ="com.package.logging.ExceptionLogger"/>
>
>
>                 <bean id="secondServiceProxy"
> class="org.springframework.aop.framework.ProxyFactoryBean">
>                 <property name="target" ref="secondServiceBean" />
>                 <property name="interceptorNames">
>                         <list>
>                                 <value>logEntryBean</value>
>                                 <value>logExitBean</value>
>                                 <value>logExceptionBean</value>
>                         </list>
>                 </property>
>         </bean>
>
>
> Application.java
> ===============
>
>         ConfigurableApplicationContext context = new
> ClassPathXmlApplicationContext("ApplicationContext.xml");
>          FileSplitter call =(FileSplitter) context.getBean("fileSplitter");
>          SecondService secondService =(SecondService)
> context.getBean("secondServiceProxy");
>
>         FileSplitter fileSplitter = dag.addOperator("FileSplitter", call);
>         SecondService reader=dag.addOperator("reader", secondService);
>
>         ConsoleOutputOperator cons = dag.addOperator("console", new
> ConsoleOutputOperator());
>         dag.addStream("blockin", fileSplitter.blocksMetadataOutput,
> reader.blocksMetadataInput);
>         dag.addStream("randomData", reader.batchData, cons.input);
>
>
> LogEntry :
> =========
>
> package com.package.logging;
>
> import java.lang.reflect.Method;
>
> import org.apache.log4j.Logger;
> import org.springframework.aop.MethodBeforeAdvice;
>
> public class LogEntry implements MethodBeforeAdvice {
>         private final static Logger logger =
> Logger.getLogger(LogEntry.class);
>
>         public void before(Method method, Object[] args, Object target)
> throws Throwable {
>
>                 if(logger.isDebugEnabled())
>                 logger.info("logged entry for method : " +
> method.getName());
>         }
>
> }
>
>
> SecondService does not implement any interface, it extends CSVBlockReader
> class which again extends AbstractBlockReader class.
> =========================================================================
>
> Exception while running Junit :
> ===========================
>
> java.lang.ClassCastException: com.sun.proxy.$Proxy11 cannot be cast to
> com.package.filesplitterimpl.SecondService
>         at
> com.package.filesplitterimpl.Application.populateDAG(Application.java:28)
>         at
> com.datatorrent.stram.plan.logical.LogicalPlanConfiguration.prepareDAG(LogicalPlanConfiguration.java:1191)
>         at
> com.datatorrent.stram.LocalModeImpl.prepareDAG(LocalModeImpl.java:57)
>         at
> com.dtv.myapexapp.ApplicationTest.testApplication(ApplicationTest.java:28)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>         at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.lang.reflect.Method.invoke(Method.java:606)
>         at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
>         at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>         at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
>         at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>         at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
>         at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
>         at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
>         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
>         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
>         at
> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
>         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
>         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
>         at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
>         at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
>         at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>         at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
>         at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
>         at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
>         at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
>
> regards,
> Venkatesh.
>
> -----Original Message-----
> From: Chandni Singh [mailto:chandni@datatorrent.com]
> Sent: Tuesday, November 03, 2015 2:46 PM
> To: dev@apex.incubator.apache.org
> Subject: Re: Regarding logging and exception handling framework
>
> Hi Venkatesh,
>
> Can you please provide a small code snippet or example which shows what
> you want to do?
>
> If you want to find out any validation exception during preparation of
> logical plan, then you can take a look at the LogicalPlanTest in Apache
> Apex repository.
>
> Thanks,
> Chandni
>
>
> On Tue, Nov 3, 2015 at 2:37 PM, Kottapalli, Venkatesh <
> VKottapalli@directv.com> wrote:
>
> > Hi,
> >
> >                 With the framework malhar has, Can we use AOP
> > interception technique for logging and exception handling?  I have
> > tried but unable to proxy Operator classes to intercept during DAG
> preparation. Please suggest.
> >
> > Regards,
> > Venkatesh.
> >
>

RE: Regarding logging and exception handling framework

Posted by "Kottapalli, Venkatesh" <VK...@DIRECTV.com>.
I am trying to log exceptions, some entry and exit parameters for certain function calls in my implementation, hence I have defined beans to intercept in the following way. Please let me know if you need more inputs on this.

I have used spring core jars :
=====================
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>


ApplicationContext definitions :
===========================

	<bean id=" fileSplitter" class="com.package.SimpleService"/>
	<bean id="secondServiceBean" class="com.package.SecondService"/>

	<bean id="logEntryBean" class="com.package.LogEntry" />
	<bean id="logExitBean" class="com.package.LogReturn" />
	<bean id="logExceptionBean" class ="com.package.logging.ExceptionLogger"/>

	
		<bean id="secondServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target" ref="secondServiceBean" />
		<property name="interceptorNames">
			<list>
				<value>logEntryBean</value>
				<value>logExitBean</value>
				<value>logExceptionBean</value>
			</list>
		</property>
	</bean>
	

Application.java
===============

	ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
	 FileSplitter call =(FileSplitter) context.getBean("fileSplitter");
	 SecondService secondService =(SecondService) context.getBean("secondServiceProxy");
		
	FileSplitter fileSplitter = dag.addOperator("FileSplitter", call);  
	SecondService reader=dag.addOperator("reader", secondService);
	
	ConsoleOutputOperator cons = dag.addOperator("console", new ConsoleOutputOperator());
    	dag.addStream("blockin", fileSplitter.blocksMetadataOutput, reader.blocksMetadataInput);
    	dag.addStream("randomData", reader.batchData, cons.input);


LogEntry : 
=========

package com.package.logging;

import java.lang.reflect.Method;

import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;

public class LogEntry implements MethodBeforeAdvice {
	private final static Logger logger = Logger.getLogger(LogEntry.class);

	public void before(Method method, Object[] args, Object target) throws Throwable {

		if(logger.isDebugEnabled())
		logger.info("logged entry for method : " + method.getName());
	}

}


SecondService does not implement any interface, it extends CSVBlockReader class which again extends AbstractBlockReader class.
=========================================================================

Exception while running Junit :
===========================

java.lang.ClassCastException: com.sun.proxy.$Proxy11 cannot be cast to com.package.filesplitterimpl.SecondService
	at com.package.filesplitterimpl.Application.populateDAG(Application.java:28)
	at com.datatorrent.stram.plan.logical.LogicalPlanConfiguration.prepareDAG(LogicalPlanConfiguration.java:1191)
	at com.datatorrent.stram.LocalModeImpl.prepareDAG(LocalModeImpl.java:57)
	at com.dtv.myapexapp.ApplicationTest.testApplication(ApplicationTest.java:28)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

regards,
Venkatesh.

-----Original Message-----
From: Chandni Singh [mailto:chandni@datatorrent.com] 
Sent: Tuesday, November 03, 2015 2:46 PM
To: dev@apex.incubator.apache.org
Subject: Re: Regarding logging and exception handling framework

Hi Venkatesh,

Can you please provide a small code snippet or example which shows what you want to do?

If you want to find out any validation exception during preparation of logical plan, then you can take a look at the LogicalPlanTest in Apache Apex repository.

Thanks,
Chandni


On Tue, Nov 3, 2015 at 2:37 PM, Kottapalli, Venkatesh < VKottapalli@directv.com> wrote:

> Hi,
>
>                 With the framework malhar has, Can we use AOP 
> interception technique for logging and exception handling?  I have 
> tried but unable to proxy Operator classes to intercept during DAG preparation. Please suggest.
>
> Regards,
> Venkatesh.
>

Re: Regarding logging and exception handling framework

Posted by Chandni Singh <ch...@datatorrent.com>.
Hi Venkatesh,

Can you please provide a small code snippet or example which shows what you
want to do?

If you want to find out any validation exception during preparation of
logical plan, then you can take a look at the LogicalPlanTest in Apache
Apex repository.

Thanks,
Chandni


On Tue, Nov 3, 2015 at 2:37 PM, Kottapalli, Venkatesh <
VKottapalli@directv.com> wrote:

> Hi,
>
>                 With the framework malhar has, Can we use AOP interception
> technique for logging and exception handling?  I have tried but unable to
> proxy Operator classes to intercept during DAG preparation. Please suggest.
>
> Regards,
> Venkatesh.
>