2013-08-05 3 views
0

Так что, я думаю, я немного смущен тем, как работает memcached. Я занимаюсь разработкой одного и того же API с использованием разных фреймворков, в состав которых входит memcached (версия java spymemcached). Когда я настроил memcached в своей первой структуре, он работал, как ожидалось. Теперь, когда я пытаюсь включить его во вторую структуру, которую я использую, я продолжаю получать ClassNotFoundException, где он пытается найти класс в первой используемой мне инфраструктуре и, таким образом, не кэширует что-либо. Может быть, кто-то может просветить меня до недостатка в моей логике. Вот два класса (они идентичны, так как я строю один и тот же API на разных платформах), класс core.Party находится в первом (который работает при запуске соответствующего приложения) pojo.PojoParty - это одна и вторая структура I Использование с этим, похоже, не связано с memcached.Memcached ClassNotFound exception

Вот конструктор класса, где это происходит:

package resources; 

import health.TemplateHealthCheck; 

import java.net.InetSocketAddress; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.Connection; 
import java.sql.ResultSetMetaData; 
import java.util.HashMap; 

import com.codahale.metrics.Gauge; 
import com.codahale.metrics.Meter; 
import com.codahale.metrics.MetricRegistry; 
import com.codahale.metrics.Counter; 
import com.codahale.metrics.RatioGauge; 

import contextListener.MyAdminServletContextListener; 

import pojo.PartyPojo; 

import net.spy.memcached.MemcachedClient; 

    public class DBConnection { 

     public static Connection con; 
     private static ResultSet resultSet; 
     private static PreparedStatement ps; 
     private static ResultSetMetaData meta; 
     private static HashMap<String,PartyPojo> map; 
     private static DBConnection connection; 
     private static PartyPojo party; 
     private static final InetSocketAddress isa= new InetSocketAddress("atom1.cisco.com",11211); 
     private static MemcachedClient memcache; 
     private static Meter hits = MyAdminServletContextListener.registry.meter(MetricRegistry.name("Meter", 
       "get-hits")); 
     private static Meter calls = MyAdminServletContextListener.registry.meter(MetricRegistry.name("Meter", 
       "get-calls")); 
     private static Counter evictions = MyAdminServletContextListener.registry.counter(MetricRegistry.name("Counter", 
       "Memcache-Evictions")); 
     private static int getHits,getCalls; 
     private final static int MAX_MEMCACHED_EXPIRATION=2505600; 

     private DBConnection() 
     { 
      try 
      { 
       map = new HashMap<String,PartyPojo>(); 
       Class.forName("com.mysql.jdbc.Driver"); 
       con = DriverManager.getConnection(
         "jdbc:mysql://atom3.cisco.com:3306/reddb", "redteam", 
         "redteam");  
       //initialize memcache 
       memcache = new MemcachedClient(isa); //this line produces error 
       //this is just a integer variable I was using to make sure my Meters were measuring correctly 
       getHits = Integer.valueOf(DBConnection.memcache.getStats().get(DBConnection.isa). 
         get("get_hits")); 
       getCalls = Integer.valueOf(DBConnection.memcache.getStats().get(DBConnection.isa). 
         get("cmd_get")); 
       metricsRegistry();  
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 

Вот класс он пытается достичь, что не является частью второй базы (это класс POJO из первых рамок):

package core; 

import java.io.Serializable; 
import java.util.HashMap; 

public class Party implements Serializable { 


    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    HashMap <String,String> partyInfo = new HashMap<String,String>(); 

    public HashMap<String,String> getPartyInfo() throws Exception 
    { 
     return partyInfo; 
    } 
} 

Вот идентичный класс, но в этом проекте я пытаюсь запустить

package pojo; 

import java.io.Serializable; 
import java.util.HashMap; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

import org.eclipse.persistence.oxm.annotations.XmlPath; 


@XmlRootElement(name="Party") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class PartyPojo implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -4892745279086305480L; 
    /** 
    * 
    */ 
    /** 
    * 
    */ 
    @XmlPath(".") 
    @XmlJavaTypeAdapter(MapAdapter.class) 

    HashMap <String,String> partyInfo = new HashMap<String,String>(); 

    public HashMap<String,String> getPartyInfo() throws Exception 
    { 
     return partyInfo; 
    } 
} 

Вот StackTrace:

2013-08-05 15:54:39.810 INFO net.spy.memcached.MemcachedConnection: Added {QA sa=atom1.cisco.com/173.36.62.251:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue 
2013-08-05 15:54:39.847 INFO net.spy.memcached.MemcachedConnection: Connection state changed for [email protected] 
2013-08-05 15:54:40.120 WARN net.spy.memcached.transcoders.SerializingTranscoder: Caught CNFE decoding 434 bytes of data 
java.lang.ClassNotFoundException: core.Party 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at java.io.ObjectInputStream.resolveClass(Unknown Source) 
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) 
    at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at net.spy.memcached.transcoders.BaseSerializingTranscoder.deserialize(BaseSerializingTranscoder.java:129) 
    at net.spy.memcached.transcoders.SerializingTranscoder.decode(SerializingTranscoder.java:88) 
    at net.spy.memcached.transcoders.TranscodeService$1.call(TranscodeService.java:63) 
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at net.spy.memcached.transcoders.TranscodeService$Task.run(TranscodeService.java:110) 
    at net.spy.memcached.transcoders.TranscodeService$Task.get(TranscodeService.java:96) 
    at net.spy.memcached.internal.GetFuture.get(GetFuture.java:63) 
    at net.spy.memcached.MemcachedClient.get(MemcachedClient.java:997) 
    at net.spy.memcached.MemcachedClient.get(MemcachedClient.java:1018) 
    at resources.DBConnection.readOneParty(DBConnection.java:114) 
    at resources.OnePartyResource.getParty(OnePartyResource.java:57) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) 
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
    at com.sun.jersey.server.impl.uri.rules.SubLocatorRule.accept(SubLocatorRule.java:134) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:211) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1094) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1028) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
    at org.eclipse.jetty.server.Server.handle(Server.java:445) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:267) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:224) 
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532) 
    at java.lang.Thread.run(Unknown Source) 

ответ

1

Я понял, и ответ довольно смущающий. Поэтому, поскольку я спешил, чтобы завершить код на разных фреймах, я по существу копировал и вставлял код из одного в другой. По сути дела, это было хранение значений из первого API штрафа; однако, когда я пытался запросить те же самые значения, используя другой API, он пытался сохранить эти значения в memcache в том же ключевом месте. Таким образом, почему он не смог найти объект, он был в неправильном проекте! Поэтому я в основном добавил строковый ключ для одной программы, чтобы он корректно возвращался.

Очевидно, что смущающая ошибка, чтобы сделать, но я сделаю это, прежде всего, в качестве своего первого использования с помощью какой-либо системы кеширования для нескольких программ.

0

Когда memcached (или любой сериализатору) пытается восстановить свой объект из последовательной формы, он должен иметь доступ к соответствующему классу. У вас нет core.Party на стороне десериализации, поэтому memcached не имеет представления Java для потока входящих данных.

Когда вы говорите о «разных платформах», вы, кажется, неправильно понимаете, как работают библиотеки Java. Поскольку вы используете Java с обеих сторон, у вас не должно быть двух «копий» класса, вы должны просто иметь один единственный класс для обоих. Если есть общий код (например, Party), но какой-то другой код, который не должен быть разделен между двумя дистрибутивами, поместите Party в библиотеку jar, включенную обоими проектами. Maven и другие системы управления зданием делают это легко.

+0

Платформа была немного неправильной, рамки были бы лучшим словом. Например, я создаю два API, один из которых использует только чистый сервлет (просто строя его с использованием трикотажа), другой я использую Dropwizard. Они должны иметь возможность работать независимо друг от друга, поэтому, я думаю, мой вопрос заключается в том, как сделать memcached различать объекты Party в моей структуре Dropwizard и объектах Party в моем PureServlet. Думаю, я думал, сериализируя их индивидуально, это сделало бы их различимыми – sreya

+0

И ответ «не надо». Используйте тот же API для общих объектов и поместите их в общую банку, затем включите общие компоненты в каждый крупный проект. – chrylis

+0

И если они не одни и те же объекты? Как мне отличить их? Это делает это автоматически? – sreya

Смежные вопросы