我有一个通过 JMS 与一些 java 服务通信的 rails 应用程序。我将其中一些对象缓存在 rails 端的 memcached 中,如下所示:
@my_objects = MEMCACHE["some_key"] || @service.retrieve_objects
MEMCACHE.set("some_key",@my_objects) if MEMCACHE["some_key"].nil?
MEMCACHE 在哪里
MEMCACHE = MemCache.new(['localhost'], :namespace=>"namespace-#{RAILS_ENV}")
现在,我正在尝试编写测试来验证我的 memcache 是否正确存储这些并正确更新。不幸的是,当我尝试访问缓存中的对象时,我得到了
MemCache::MemCacheError: Class not found unmarshaling Java type: my/java/package/Classname
奇怪的是,在脚本/控制台中引用缓存可以正常工作。但是,当我运行应用程序和单元测试时,我收到了这个错误。我认为在同一个环境中控制台和应用程序之间没有任何区别。
我在下面包含了完整的堆栈跟踪。它似乎来自 ActiveSupports Memcache 客户端的深处。我已经尝试了所有的组合,甚至在访问缓存之前实例化了这个特定的类,但是没有一个起作用。
Rails 显然知道该类,因为我可以直接在我的测试中检索、实例化和创建这些 java 对象,没有任何问题,只有从 MEMCACHE 访问它时,我才会收到此错误。
安装
jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2009-11-13 6586) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_17) [x86_64-java]
Rails 2.2.2
OSX 10.6
完整的测试堆栈跟踪
1) Error:
test_testing_memcache_and_settings(MyTest):
MemCache::MemCacheError: Class not found unmarshaling Java type: my/java/package/Classname
/opt/local/share/java/jruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1/memcache.rb:241:in `marshal_load'
/opt/local/share/java/jruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1/memcache.rb:241:in `load'
/opt/local/share/java/jruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1/memcache.rb:241:in `get'
./test/unit/my_test.rb:54:in `test_testing_memcache_and_settings'
/opt/local/share/java/jruby/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `run_with_callbacks_and_testunit'